a
This commit is contained in:
@@ -0,0 +1,400 @@
|
||||
# 数据导出
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [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)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
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数据库文件保证数据安全。导出过程支持树形结构选择,允许用户灵活选择要导出的内容。异常处理和回滚机制确保了在导出失败时系统能够正确恢复。数据库模式设计完整,涵盖了项目、测区、测试数据等所有必要信息,并通过版本控制机制保证了数据的兼容性。该实现为地质勘探数据的管理和共享提供了可靠的技术支持。
|
||||
Reference in New Issue
Block a user