a
This commit is contained in:
@@ -0,0 +1,293 @@
|
||||
# 数据导入导出
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [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)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
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<br>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系统的数据管理提供了可靠保障。通过严格的错误处理和完整性验证机制,确保了数据在迁移过程中的安全性和可靠性。
|
||||
Reference in New Issue
Block a user