# 数据导出 **本文档引用的文件** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp) - [IOManager.h](file://h/IOManager.h) - [database_modify.xml](file://database_modify.xml) - [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp) ## 目录 1. [简介](#简介) 2. [数据导出架构](#数据导出架构) 3. [核心组件分析](#核心组件分析) 4. [事务处理与异常恢复](#事务处理与异常恢复) 5. [数据库模式与版本控制](#数据库模式与版本控制) 6. [结论](#结论) ## 简介 本文档全面阐述了Geomative Studio软件中数据导出功能的实现机制。该功能通过CIOManager类的Export方法,将项目、测区、测试数据等信息安全地导出到受密码保护的Access数据库(.accdb)文件中。文档详细说明了导出过程中的事务处理、树形结构遍历、数据库创建、异常处理和回滚机制,以及针对不同类型测试数据(如2D电阻率、IP)的导出实现细节。 ## 数据导出架构 ```mermaid graph TD A[用户界面] --> B[CIOManager::Export] B --> C[创建加密数据库] C --> D[开始事务] D --> E[遍历树形结构] E --> F[选择导出内容] F --> G[导出项目数据] F --> H[导出测区数据] F --> I[导出测试数据] G --> J[ExportProjectToAccdbFile] H --> K[ExportTzToAccdbFile] I --> L[ExportRspTdToAccdbFile] I --> M[ExportIpspTdToAccdbFile] L --> N[导出电阻率数据] M --> O[导出IP数据] N --> P[提交事务] O --> P P --> Q[完成导出] B --> R[异常处理] R --> S[回滚事务] S --> T[删除文件] ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98) - [IOManager.h](file://h/IOManager.h#L19) ## 核心组件分析 ### CIOManager类分析 CIOManager类是数据导出功能的核心,负责协调整个导出流程。它通过ADOX和ADODB技术与Access数据库进行交互。 #### 类结构 ```mermaid classDiagram class CIOManager { +_ConnectionPtr m_pConnection +ADOX : : _CatalogPtr m_pCatalog +CHandleProcessor m_handleProcessor +CStateProcessor m_stateProcessor +UINT Export(void) +UINT Import(void) +CIOManager(_ConnectionPtr&, ADOX : : _CatalogPtr) +~CIOManager() } class CHandleProcessor { +DWORD GenerateHandle(DWORD, UINT) +DWORD GetIDFromHandle(DWORD) +UINT GetStyleFromHandle(DWORD) } class CStateProcessor { +UINT ChangeToImageState(UINT) +UINT ChangeToItemState(UINT) } CIOManager --> CHandleProcessor : "使用" CIOManager --> CStateProcessor : "使用" ``` **Diagram sources** - [IOManager.h](file://h/IOManager.h#L14-L48) - [HandleProcessor.h](file://h/HandleProcessor.h#L12-L26) - [StateProcessor.h](file://h/StateProcessor.h#L12-L20) **Section sources** - [IOManager.h](file://h/IOManager.h#L14-L48) ### 导出流程分析 数据导出流程从用户界面触发,通过CIOManager::Export方法启动,整个过程采用事务处理确保数据一致性。 #### 导出流程 ```mermaid sequenceDiagram participant UI as 用户界面 participant IO as CIOManager participant DB as Access数据库 UI->>IO : Export() IO->>IO : 创建导出对话框 IO->>IO : 显示选择树 loop 用户选择 IO->>IO : 处理用户事件 end IO->>IO : 用户确认导出 IO->>DB : CreateExpDatabase() DB-->>IO : 返回连接 IO->>DB : BeginTrans() IO->>IO : ExportDataToAccdbFile() IO->>IO : ExportSptToAccdbFile() IO->>DB : CommitTrans() DB-->>IO : 提交成功 IO-->>UI : 返回成功状态 ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98) ### 树形结构遍历 ExportDataToAccdbFile函数负责遍历树形结构,根据用户选择导出相应的数据。 #### 遍历逻辑 ```mermaid flowchart TD Start([开始遍历]) --> CheckProject["检查项目节点是否选中"] CheckProject --> |是| ExportProject["导出项目数据"] CheckProject --> |否| NextProject["下一个项目"] ExportProject --> CheckTz["检查测区节点是否选中"] CheckTz --> |是| ExportTz["导出测区数据"] CheckTz --> |否| NextTz["下一个测区"] ExportTz --> CheckTd["检查测试数据节点是否选中"] CheckTd --> |是| CheckType["检查测试类型"] CheckTd --> |否| NextTd["下一个测试数据"] CheckType --> |2D电阻率| ExportRsp["导出RspTd数据"] CheckType --> |2D IP| ExportIpsp["导出IpspTd数据"] ExportRsp --> NextTd ExportIpsp --> NextTd NextTd --> |有下一个| CheckTd NextTd --> |无下一个| NextTz NextTz --> |有下一个| CheckTz NextTz --> |无下一个| NextProject NextProject --> |有下一个| CheckProject NextProject --> |无下一个| End([遍历完成]) ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L657-L727) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L657-L727) ## 事务处理与异常恢复 ### 事务处理机制 数据导出采用严格的事务处理机制,确保数据的完整性和一致性。 #### 事务流程 ```mermaid flowchart TD Start([开始]) --> CreateDB["创建数据库文件"] CreateDB --> BeginTrans["开始事务"] BeginTrans --> ExportData["导出数据"] ExportData --> |成功| Commit["提交事务"] ExportData --> |失败| Rollback["回滚事务"] Commit --> CloseDB["关闭数据库"] Commit --> ReturnSuccess["返回成功"] Rollback --> CloseDB Rollback --> DeleteFile["删除文件"] Rollback --> ReturnFail["返回失败"] CloseDB --> End([结束]) ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L59-L78) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L59-L86) ### 异常处理策略 系统实现了完善的异常处理机制,确保在导出过程中出现错误时能够正确恢复。 #### 异常处理 ```mermaid flowchart TD Start([异常发生]) --> CatchException["捕获_com_error异常"] CatchException --> RollbackTrans["回滚事务"] RollbackTrans --> CloseConnection["关闭数据库连接"] CloseConnection --> DeleteFile["删除已创建的文件"] DeleteFile --> SetErrorCode["设置错误代码"] SetErrorCode --> ReturnFail["返回失败状态"] ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L80-L86) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L80-L86) ## 数据库模式与版本控制 ### 数据库模式定义 CreateExpDatabase函数创建具有完整模式的Access数据库,包含多个数据表。 #### 数据库模式 ```mermaid erDiagram project { string CN PK string PRname string PRdesc string location date PRdate smallint duration string PS string CS string PM string QAS string standard } tz { string TZname PK string PRCN FK string TZdesc string location } td { string TDname PK string DESN string PRCN FK string TZname FK string SCCN FK smallint TDtype string HFname string CFname smallint CFRamount string GRFname smallint GRFRamount } tdhead { string TDname PK string DESN date Cdate date Ctime boolean rolling smallint RCamount smallint Rdirection smallint CRtime string CPE string CPN smallint weather smallint temperature smallint height smallint humidity string PM string OP string QA } parameter { string TDname PK string DESN smallint LCHamount smallint RCHamount smallint LCamount smallint RCamount smallint LEamount smallint REamount smallint Felectrode smallint Espacing smallint Clayout smallint CLfun } rspcon { string TDname PK string DESN smallint A smallint B smallint M smallint N single K single SP single Ro single Vp single Ip single SD single RgA single RgB single RgM single RgN date Ttime } ipspcon { string TDname PK string DESN single SP single Ro single VP single IP single M1 single M2 single M3 single M4 single M5 single M6 single M7 single TH single D single Zp single FG single Am single Bm single Cm single Dm single r } gr { string TDname PK string DESN string electrode string CableH string CableT single P1GR single P2GR } scon { string CN PK string Sname smallint Eamount smallint CHamount smallint TPamount string definer date DEdate string SCdesc } channel { string CN PK smallint CHnumber smallint AR } script { string CN PK smallint CHnumber smallint TSN smallint C1 smallint C2 smallint P1 smallint P2 single K smallint N } dbversion { string VK PK } project ||--o{ tz : "包含" tz ||--o{ td : "包含" td ||--|| tdhead : "关联" td ||--|| parameter : "关联" td ||--o{ rspcon : "包含" td ||--o{ ipspcon : "包含" td ||--o{ gr : "包含" scon ||--o{ channel : "包含" scon ||--o{ script : "包含" td }|--|| scon : "使用" ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L206-L656) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L206-L656) ### 版本控制机制 系统通过dbversion表实现数据库版本控制,确保导入导出的兼容性。 #### 版本控制流程 ```mermaid flowchart TD Start([导入文件]) --> ReadVersion["读取dbversion表"] ReadVersion --> |版本匹配| Continue["继续导入"] ReadVersion --> |版本不匹配| ShowError["显示文件错误"] Continue --> ImportData["导入数据"] ImportData --> UpdateVersion["更新版本信息"] UpdateVersion --> End([完成]) ``` **Diagram sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L133-L158) - [database_modify.xml](file://database_modify.xml#L2) - [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp#L847-L872) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L133-L158) - [database_modify.xml](file://database_modify.xml#L2) - [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp#L847-L872) ## 结论 Geomative Studio的数据导出功能通过CIOManager类实现了安全、可靠的数据导出机制。系统采用事务处理确保数据一致性,通过密码保护的Access数据库文件保证数据安全。导出过程支持树形结构选择,允许用户灵活选择要导出的内容。异常处理和回滚机制确保了在导出失败时系统能够正确恢复。数据库模式设计完整,涵盖了项目、测区、测试数据等所有必要信息,并通过版本控制机制保证了数据的兼容性。该实现为地质勘探数据的管理和共享提供了可靠的技术支持。