Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

10 KiB
Raw Permalink Blame History

数据导入导出

**本文档引用的文件** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp) - [IOManager.h](file://h/IOManager.h) - [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp) - [SComPort.cpp](file://cpp/Tools/SComPort.cpp) - [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp) - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp) - [FileTransfer.h](file://h/FileTransfer.h) - [_zmodem.h](file://h/_zmodem.h)

目录

  1. 简介
  2. CIOManager类架构
  3. 数据导出功能
  4. 数据导入功能
  5. 文件传输协议
  6. 数据完整性与事务处理
  7. 应用场景分析
  8. 结论

简介

数据导入导出模块是Geomative Studio系统中的核心功能组件,负责实现项目数据在不同环境间的迁移与共享。该模块主要通过CIOManager类实现,支持将项目、测区、脚本、测试数据等关键信息导出为Access数据库(.accdb)文件,并能从外部文件导入数据。模块采用事务处理机制确保数据一致性,通过Zmodem协议支持串口和网络数据交换,为系统升级、数据迁移等场景提供可靠支持。

CIOManager类架构

CIOManager类是数据导入导出功能的核心实现,其架构设计体现了清晰的职责分离和模块化思想。该类主要负责协调数据导出和导入流程,与数据库交互,并管理相关辅助组件。

classDiagram
class CIOManager {
+_ConnectionPtr m_pConnection
+ADOX : : _CatalogPtr m_pCatalog
+CHandleProcessor m_handleProcessor
+CStateProcessor m_stateProcessor
+UINT Export()
+UINT Import()
-_ConnectionPtr CreateExpDatabase(CString szFileName)
-void ExportDataToAccdbFile(_ConnectionPtr pExpConnection, CTreeCtrl& dmsTree)
-void ImportProjectToDB(_ConnectionPtr pImpConnection)
}
class CHandleProcessor {
+DWORD GenerateHandle(DWORD dwID, UINT uStyle)
+DWORD GetIDFromHandle(DWORD dwHandle)
+UINT GetStyleFromHandle(DWORD dwHandle)
+void AnalyseHandle(DWORD dwHandle, DWORD& dwID, UINT& uStyle)
}
class CStateProcessor {
+UINT ChangeToImageState(UINT uItemState)
+UINT ChangeToItemState(UINT uImageState)
}
CIOManager --> CHandleProcessor : "使用"
CIOManager --> CStateProcessor : "使用"

图示来源

本节来源

数据导出功能

数据导出功能通过CIOManager::Export()方法实现,采用事务处理机制确保数据完整性。导出流程首先创建新的Access数据库文件,然后按层次结构导出项目、测区、测试数据和脚本信息。

导出工作流程

flowchart TD
Start([开始导出]) --> CreateDialog["创建导出对话框"]
CreateDialog --> ShowDialog["显示导出界面"]
ShowDialog --> UserSelect["用户选择导出内容"]
UserSelect --> CheckSelection{"选择有效?"}
CheckSelection --> |否| ReturnCancel["返回取消"]
CheckSelection --> |是| CreateDatabase["创建目标数据库"]
CreateDatabase --> BeginTrans["开始事务"]
BeginTrans --> ExportProject["导出项目信息"]
ExportProject --> ExportTz["导出测区信息"]
ExportTz --> ExportTd["导出测试数据"]
ExportTd --> ExportSpt["导出脚本信息"]
ExportSpt --> CommitTrans["提交事务"]
CommitTrans --> CloseDB["关闭数据库连接"]
CloseDB --> ReturnSuccess["返回成功"]
Exception["异常捕获"] --> RollbackTrans["回滚事务"]
RollbackTrans --> DeleteFile["删除目标文件"]
DeleteFile --> ReturnFail["返回失败"]
CreateDatabase --> |失败| DeleteFile
style Exception fill:#f9f,stroke:#333,stroke-width:2px

图示来源

本节来源

不同数据类型的导出策略

系统针对不同类型的数据采用了差异化的导出策略:

数据类型 导出策略 相关方法
项目数据 导出项目基本信息、描述、位置等 ExportProjectToAccdbFile
测区数据 导出测区名称、描述、位置等,并关联项目 ExportTzToAccdbFile
测试数据 根据测试类型(RSP/IPSP)分别导出,包含测试头信息和参数 ExportRspTdToAccdbFile
ExportIpspTdToAccdbFile
脚本数据 导出脚本定义、通道配置和脚本内容 ExportSptToAccdbFile

本节来源

数据导入功能

数据导入功能通过CIOManager::Import()方法实现,具有严格的文件验证机制和错误处理流程。导入过程首先验证源文件的完整性和版本兼容性,然后按顺序导入各类数据。

导入工作流程

sequenceDiagram
participant User as "用户"
participant IOManager as "CIOManager"
participant Dialog as "文件对话框"
participant DB as "目标数据库"
participant SourceDB as "源数据库"
User->>IOManager : 调用Import()
IOManager->>Dialog : 显示文件选择对话框
Dialog-->>IOManager : 返回选择的文件路径
IOManager->>SourceDB : 连接源数据库
SourceDB-->>IOManager : 连接成功
IOManager->>SourceDB : 验证数据库版本
alt 版本验证失败
SourceDB-->>IOManager : 返回错误
IOManager->>User : 显示错误消息
IOManager-->>User : 返回取消
else 版本验证成功
IOManager->>DB : 开始事务
IOManager->>DB : 导入项目数据
IOManager->>DB : 导入测区数据
IOManager->>DB : 导入脚本数据
IOManager->>DB : 导入测试数据
IOManager->>DB : 提交事务
DB-->>IOManager : 提交成功
IOManager-->>User : 返回成功
end
alt 导入过程中发生异常
IOManager->>DB : 回滚事务
IOManager-->>User : 返回失败
end

图示来源

本节来源

数据映射与冲突解决机制

在导入过程中,系统采用以下机制处理数据映射和潜在冲突:

  1. 主键映射:使用CHandleProcessor类处理ID映射,确保对象引用关系的正确性
  2. 外键关联:在导入测区时,根据项目CN码建立与项目的关联
  3. 冲突检测:在导入脚本时,检查是否存在相同CN码的脚本,避免重复
  4. 数据完整性:通过事务机制确保所有相关数据的一致性更新

文件传输协议

系统通过Zmodem协议实现串口和网络环境下的数据交换,提供了可靠的文件传输能力。

Zmodem协议实现

classDiagram
class Zmodem {
+CSComPort* port
+FILE* file
+long file_length
+int file_count
+char file_name[128]
+BOOL Send(char* files[])
+BOOL Receive(CString Path)
-int SendSingleFile(char* name)
-int ReceiveSingleFile(CString Path)
-int WakeUpSender()
}
class FileTransfer {
+CSComPort* port
+FILE* file
+long file_length
+int file_count
+char file_name[128]
+virtual BOOL Send(char* files[])
+virtual BOOL Receive(CString Path)
}
class SComPort {
+HANDLE m_hCom
+DCB m_dcbBlock
+char m_aWriteBuffer[WRITEBUFFER_SIZE]
+int m_iWriteSize
+char m_aReadBuffer[READBUFFER_SIZE]
+int m_iReadSize
+BOOL OpenComm(CString szComName)
+void CloseComm()
+BOOL SendDataDirectly(char* pDataBuff, int iDataSize)
+BOOL ReceiveDataDirectly(char* pDataBuff, int* iDataSize)
+BOOL ZmodemSendDataDirectly(char* pDataBuff, int iDataSize)
+BOOL ZmodemReceiveDataDirectly(char* pDataBuff, int* iDataSize)
}
Zmodem --|> FileTransfer : "继承"
Zmodem --> SComPort : "使用"
FileTransfer --> SComPort : "使用"

图示来源

本节来源

串口与网络配置

系统通过SComPort类实现串口通信,支持以下配置:

  • 波特率115200 bps
  • 数据位8位
  • 停止位1位
  • 校验:无校验
  • 流控制:无

网络通信通过相同的接口实现,确保了传输层的透明性。

数据完整性与事务处理

系统采用严格的事务处理机制确保数据导入导出过程中的完整性。

事务处理机制

flowchart LR
A[开始事务] --> B[导出项目数据]
B --> C[导出测区数据]
C --> D[导出测试数据]
D --> E[导出脚本数据]
E --> F{所有操作成功?}
F --> |是| G[提交事务]
F --> |否| H[回滚事务]
G --> I[关闭连接]
H --> J[删除文件]
I --> K[返回成功]
J --> L[返回失败]

本节来源

错误回滚与文件完整性验证

系统在数据处理过程中实施了多重保护机制:

  1. 异常捕获:使用try-catch块捕获COM异常
  2. 自动回滚:发生异常时自动执行RollbackTrans()
  3. 文件验证:导入前验证dbversion表确保文件兼容性
  4. 资源清理:确保数据库连接和文件句柄的正确释放

应用场景分析

数据导入导出模块在多种实际场景中发挥重要作用:

系统升级

在系统升级过程中,该模块可用于:

  • 迁移旧版本数据到新系统
  • 验证数据完整性
  • 保持项目历史记录

数据迁移

支持跨设备的数据迁移:

  • 从现场设备导出数据到办公室计算机
  • 在不同项目团队间共享测试数据
  • 备份关键项目信息

协作与共享

促进团队协作:

  • 共享脚本配置
  • 交换测试结果
  • 统一数据标准

结论

数据导入导出模块通过CIOManager类实现了完整的数据迁移功能,采用事务处理确保数据一致性,利用Zmodem协议支持多种传输方式。该模块架构清晰,功能完善,为Geomative Studio系统的数据管理提供了可靠保障。通过严格的错误处理和完整性验证机制,确保了数据在迁移过程中的安全性和可靠性。