# 数据导入导出 **本文档引用的文件** - [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类架构](#ciomanager类架构) 3. [数据导出功能](#数据导出功能) 4. [数据导入功能](#数据导入功能) 5. [文件传输协议](#文件传输协议) 6. [数据完整性与事务处理](#数据完整性与事务处理) 7. [应用场景分析](#应用场景分析) 8. [结论](#结论) ## 简介 数据导入导出模块是Geomative Studio系统中的核心功能组件,负责实现项目数据在不同环境间的迁移与共享。该模块主要通过CIOManager类实现,支持将项目、测区、脚本、测试数据等关键信息导出为Access数据库(.accdb)文件,并能从外部文件导入数据。模块采用事务处理机制确保数据一致性,通过Zmodem协议支持串口和网络数据交换,为系统升级、数据迁移等场景提供可靠支持。 ## CIOManager类架构 CIOManager类是数据导入导出功能的核心实现,其架构设计体现了清晰的职责分离和模块化思想。该类主要负责协调数据导出和导入流程,与数据库交互,并管理相关辅助组件。 ```mermaid 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 : "使用" ``` **图示来源** - [IOManager.h](file://h/IOManager.h#L15-L49) - [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L19-L95) - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp#L19-L40) **本节来源** - [IOManager.h](file://h/IOManager.h#L15-L49) - [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L19-L95) - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp#L19-L40) ## 数据导出功能 数据导出功能通过CIOManager::Export()方法实现,采用事务处理机制确保数据完整性。导出流程首先创建新的Access数据库文件,然后按层次结构导出项目、测区、测试数据和脚本信息。 ### 导出工作流程 ```mermaid 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 ``` **图示来源** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98) - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L657-L656) **本节来源** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98) - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L657-L656) ### 不同数据类型的导出策略 系统针对不同类型的数据采用了差异化的导出策略: | 数据类型 | 导出策略 | 相关方法 | |---------|---------|---------| | 项目数据 | 导出项目基本信息、描述、位置等 | ExportProjectToAccdbFile | | 测区数据 | 导出测区名称、描述、位置等,并关联项目 | ExportTzToAccdbFile | | 测试数据 | 根据测试类型(RSP/IPSP)分别导出,包含测试头信息和参数 | ExportRspTdToAccdbFile
ExportIpspTdToAccdbFile | | 脚本数据 | 导出脚本定义、通道配置和脚本内容 | ExportSptToAccdbFile | **本节来源** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L894-L1383) ## 数据导入功能 数据导入功能通过CIOManager::Import()方法实现,具有严格的文件验证机制和错误处理流程。导入过程首先验证源文件的完整性和版本兼容性,然后按顺序导入各类数据。 ### 导入工作流程 ```mermaid 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 ``` **图示来源** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L101-L204) **本节来源** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L101-L204) ### 数据映射与冲突解决机制 在导入过程中,系统采用以下机制处理数据映射和潜在冲突: 1. **主键映射**:使用CHandleProcessor类处理ID映射,确保对象引用关系的正确性 2. **外键关联**:在导入测区时,根据项目CN码建立与项目的关联 3. **冲突检测**:在导入脚本时,检查是否存在相同CN码的脚本,避免重复 4. **数据完整性**:通过事务机制确保所有相关数据的一致性更新 ## 文件传输协议 系统通过Zmodem协议实现串口和网络环境下的数据交换,提供了可靠的文件传输能力。 ### Zmodem协议实现 ```mermaid 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 : "使用" ``` **图示来源** - [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L33-L800) - [FileTransfer.h](file://h/FileTransfer.h#L26-L46) - [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L31-L800) **本节来源** - [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L33-L800) - [FileTransfer.h](file://h/FileTransfer.h#L26-L46) - [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L31-L800) ### 串口与网络配置 系统通过SComPort类实现串口通信,支持以下配置: - **波特率**:115200 bps - **数据位**:8位 - **停止位**:1位 - **校验**:无校验 - **流控制**:无 网络通信通过相同的接口实现,确保了传输层的透明性。 ## 数据完整性与事务处理 系统采用严格的事务处理机制确保数据导入导出过程中的完整性。 ### 事务处理机制 ```mermaid flowchart LR A[开始事务] --> B[导出项目数据] B --> C[导出测区数据] C --> D[导出测试数据] D --> E[导出脚本数据] E --> F{所有操作成功?} F --> |是| G[提交事务] F --> |否| H[回滚事务] G --> I[关闭连接] H --> J[删除文件] I --> K[返回成功] J --> L[返回失败] ``` **本节来源** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L63-L78) - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L177-L188) ### 错误回滚与文件完整性验证 系统在数据处理过程中实施了多重保护机制: 1. **异常捕获**:使用try-catch块捕获COM异常 2. **自动回滚**:发生异常时自动执行RollbackTrans() 3. **文件验证**:导入前验证dbversion表确保文件兼容性 4. **资源清理**:确保数据库连接和文件句柄的正确释放 ## 应用场景分析 数据导入导出模块在多种实际场景中发挥重要作用: ### 系统升级 在系统升级过程中,该模块可用于: - 迁移旧版本数据到新系统 - 验证数据完整性 - 保持项目历史记录 ### 数据迁移 支持跨设备的数据迁移: - 从现场设备导出数据到办公室计算机 - 在不同项目团队间共享测试数据 - 备份关键项目信息 ### 协作与共享 促进团队协作: - 共享脚本配置 - 交换测试结果 - 统一数据标准 ## 结论 数据导入导出模块通过CIOManager类实现了完整的数据迁移功能,采用事务处理确保数据一致性,利用Zmodem协议支持多种传输方式。该模块架构清晰,功能完善,为Geomative Studio系统的数据管理提供了可靠保障。通过严格的错误处理和完整性验证机制,确保了数据在迁移过程中的安全性和可靠性。