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

591 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据库设计
<cite>
**本文档引用的文件**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [database_modify.xml](file://database_modify.xml)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
- [DataOperator.h](file://h/DataOperator.h)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
- [UpdateDataBase.h](file://h/UpdateDataBase.h)
- [Project.h](file://h/Project.h)
- [Device.h](file://h/Device.h)
- [TestingData.h](file://h/TestingData.h)
- [TdRecord.h](file://h/TdRecord.h)
- [Script.h](file://h/Script.h)
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
</cite>
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 引言
本文档详细说明了Geomative Studio软件系统所使用的Access数据库的表结构、字段定义、数据类型和约束条件。文档基于数据库字段修改记录文件,描述了主要实体(项目、设备、脚本、测量数据)之间的关系和关联方式。同时,文档解释了数据访问模式和持久化机制,包括通过ADO进行数据库操作的实现细节。提供了数据库ER图、关键查询示例和性能优化建议,并说明了数据版本控制和迁移策略。
## 项目结构
Geomative Studio项目的数据库相关文件主要位于DB目录下,包括数据库文件和字段修改记录。系统使用Access数据库(.accdb格式)存储项目、设备、脚本和测量数据等信息。数据库操作通过ADOActiveX Data Objects)技术实现,代码中包含了完整的数据库连接、查询、更新和版本管理机制。
```mermaid
erDiagram
PROJECT {
long ID PK
string PRname
string CN
string CDate
string CTime
string Location
string Duration
string PS
string CS
string PM
string QAS
string Standard
}
DEVICE {
long ID PK
string DEname
string SN
string ModelNO
string MDate
string HWV
string SWV
string MBatch
string MacAddress
string GPS
}
TD {
long ID PK
long TZID FK
string TDname
string TLocation
string TDate
string TTime
int Ttype
int Stype
int EAmount
int TPAmount
int CHAmount
int N
int TRWave
int TRFrequency
int IFrequency
int SAFrequency
int CLayout
string ESpace
string Edistance
string rect
string rect_loc
int SkipCable
bool IsAutoGenerate
}
TZ {
long ID PK
long PRID FK
string TZname
string CN
string Location
string Duration
string PS
string CS
string PM
string QAS
string Standard
}
SCRIPT {
long ID PK
long TDID FK
int EAmount
int SType
int AR
string Rect
string RectLoc
string PoleDistance
string PoleStep
}
TdRecord {
long ID PK
long TdID FK
int Tsn
int N
float K
float I
float V
float R0
float SP
string Datetime
}
TASK_TIMER {
long ID PK
long TDID FK
string TaskTime
int PLCID
}
TTaskInfoCoordinetes {
long ID PK
long TDID FK
string ElectrodeCoordinates
}
TPictureInfo {
long ID PK
long TDID FK
string PicturePath
string Description
}
TPictureCode {
long ID PK
long TDID FK
string QRCodeData
}
TLoggingTaskInfo {
long ID PK
long PRID FK
string TaskName
string TaskDate
}
TLoggingTaskContent {
long ID PK
long TaskID FK
string PointData
string MeasurementValue
}
PROJECT ||--o{ TZ : "包含"
TZ ||--o{ TD : "包含"
TD ||--o{ SCRIPT : "关联"
TD ||--o{ TdRecord : "包含"
TD ||--o{ TASK_TIMER : "包含"
TD ||--o{ TTaskInfoCoordinetes : "包含"
TD ||--o{ TPictureInfo : "包含"
TD ||--o{ TPictureCode : "包含"
PROJECT ||--o{ TLoggingTaskInfo : "包含"
TLoggingTaskInfo ||--o{ TLoggingTaskContent : "包含"
DEVICE ||--o{ PROJECT : "关联"
```
**图示来源**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [Project.h](file://h/Project.h)
- [Device.h](file://h/Device.h)
- [TestingData.h](file://h/TestingData.h)
- [TdRecord.h](file://h/TdRecord.h)
- [Script.h](file://h/Script.h)
**章节来源**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [database_modify.xml](file://database_modify.xml)
## 核心组件
系统的核心数据库组件包括项目(Project)、设备(Device)、测试任务(TD)、测区(TZ)、脚本(Script)和测量记录(TdRecord)等实体。这些组件通过外键关系相互关联,形成了完整的数据模型。数据库操作主要通过DataOperator类实现,该类封装了所有数据库的CRUD操作。
**章节来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
- [DataOperator.h](file://h/DataOperator.h)
- [Project.h](file://h/Project.h)
- [Device.h](file://h/Device.h)
## 架构概述
系统采用分层架构,数据库访问层通过ADO技术与Access数据库交互。DataOperator类作为数据访问的核心组件,负责所有数据库操作。UpdateDataBase类负责数据库版本管理和迁移。系统使用连接池技术管理数据库连接,确保多用户并发访问时的性能和稳定性。
```mermaid
graph TB
subgraph "用户界面"
UI[用户界面]
end
subgraph "业务逻辑"
BL[业务逻辑层]
end
subgraph "数据访问"
DAL[数据访问层]
DataOperator[DataOperator]
UpdateDataBase[UpdateDataBase]
end
subgraph "数据库"
DB[(Access数据库)]
end
UI --> BL
BL --> DAL
DAL --> DB
DataOperator --> DB
UpdateDataBase --> DB
```
**图示来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
**章节来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
## 详细组件分析
### 数据库实体分析
系统的主要数据库实体包括项目、设备、测试任务、测区、脚本和测量记录。这些实体通过外键关系相互关联,形成了完整的数据模型。
#### 项目实体
项目实体是系统中最顶层的数据单元,包含项目的基本信息和元数据。
```mermaid
classDiagram
class Project {
+DWORD m_dwID
+CString m_szCN
+CString m_szPRname
+CString m_szCNS
+CString m_szDesc
+CString m_szLocation
+CString m_szPRdate
+CString m_szDuration
+CString m_szPS
+CString m_szCS
+CString m_szPM
+CString m_szQAS
+CString m_szStandard
+bool ShowDetailInfo(CListCtrl& proDetailList)
}
```
**图示来源**
- [Project.h](file://h/Project.h)
#### 设备实体
设备实体存储了测量设备的详细信息,包括设备型号、序列号、硬件版本等。
```mermaid
classDiagram
class Device {
+DWORD m_dwID
+UINT m_uState
+UINT m_uType
+BYTE m_ucDevType
+CString m_szDevSN
+CString m_szDevName
+CString m_szModelNO
+CString m_szMDate
+CString m_szHWV
+CString m_szSWV
+CString m_szMBatch
+CString m_szMacAddress
+CString m_szGPS
+BOOL ExecuteOrder(CString strOrder, CString strSign, CString *pStrResult, int nRepeatCnt, int nPollCnt)
+BOOL ExecuteSignleOrder(CString f_szOrder, CString f_szSign, CString *f_szResult, int nCmdPollCnt)
+BOOL ModifyTimeWindow()
+BOOL LockDevice()
+BOOL Reset()
+BOOL DelSynInfo()
+BOOL DelGRInfo()
+BOOL GetSynInfo()
+BOOL GetDevInfo()
+BOOL GetGRInfo()
+int GetPoleCount()
+BOOL Register()
+BOOL Unregister()
+BOOL SendFile(const CString &szHostFilePath, const CString &szLocFilePath, const CString& szLocFileName)
+BOOL ReceiveFile(const CString &szLocFilePath, const CString& szHostFileName, int nRetryCnt)
+bool ShowFLDetailInfo(CListCtrl& devDetailList)
+bool ShowOLDetailInfo(CListCtrl& devDetailList)
+bool ShowGRInfo(CListCtrl& devGRList)
+bool ShowACInfo(CListCtrl& devDetailList)
+BOOL ModifyParameter()
+BOOL ShowCableHeadInfoDlg()
+BOOL IsTheNumofPoleChanged()
+BOOL TestGRForPerPole(int iSN, CStringArray& strResArray)
+BOOL TestGRForAllPole()
+void SetState(UINT uState)
+void SetID(DWORD dwID)
+void PrintLog(CString& strLog)
+int IsExistOtherUserData()
+int CheckGD10Password(CString strGD10Password)
}
```
**图示来源**
- [Device.h](file://h/Device.h)
#### 测试数据实体
测试数据实体存储了测量任务的详细信息和测量结果。
```mermaid
classDiagram
class TestingData {
+DWORD m_dwID
+CString m_szTdName
+CString m_szTdCN
+CString m_szTLocation
+CString m_szPrCN
+CString m_szTzName
+CString m_szTzCN
+DWORD m_dwTzID
+DWORD m_dwSCID
+CString m_szSCCN
+CString m_szSName
+int m_iSType
+int m_iTType
+int m_iTMode
+int m_iEAmount
+int m_iTPAmount
+int m_iCHAmount
+int m_iN
+int m_iTRWave
+int m_iTRFrequency
+int m_iIFrequency
+int m_iSAFrequency
+int m_iCLayout
+float m_fESpace
+CString m_szEDistance
+int m_iWeather
+int m_iWDIR
+float m_fTemperature
+float m_fHeight
+float m_fHumidity
+float m_fTRPeriod
+CString m_szCDate
+CString m_szCTime
+CString m_szTDate
+CString m_szTTime
+int m_iRCamount
+int m_iRDirection
+int m_iCRtime
+CString m_szPM
+CString m_szOP
+CString m_szQA
+CPtrList m_tdChaList
+_WaveCount *m_waveCount
+bool m_bIsCustomToCrossHole
+virtual void UpdataTopography(int f_disType, int f_start, CListCtrl &f_list)
+BOOL ExcuteSql(CString f_sql)
+virtual void GetTimeWindowList(CListCtrl &f_list)
+virtual BOOL ShowTimeWindow(CListCtrl &tdConList, int iTsn)
+void GetORGCStringToArray(CString f_SrcString, CStringArray *f_array)
+void FreeWindowsTime()
+double GetPeriod()
+bool GetTimeWindowInfo(std : : vector<STSigTWInfo>& vtTWInfo)
+void CreateWindowsTime()
+virtual bool CalculateTimeWindows(struct _WinTimeList f_winTimeList, CStringArray *v_orgData, int f_TRwave, int f_Tcycle, int f_Sample, int f_interation, int f_industrial)
+virtual bool CalculateTWInfo(CStringArray *v_orgData, int nFrenquence)
+virtual BOOL DisplayIpCurveGraph()
+CDevice* m_pDevice
+virtual bool ShowGrList(CListCtrl &tdGrList)
+virtual bool ShowConList(CListCtrl &tdConList)
+virtual bool ShowConListByPage(CListCtrl &tdConList, int iSType)
+virtual bool ShowDetailInfo(CListCtrl &tdDetailList)
+virtual BOOL SaveTdToExcelFile(CString f_szFileName)
+virtual BOOL SaveTdToResCEFile(CString f_szFileName)
+virtual BOOL SaveTdToRes2DFile(CString f_szFileName)
+virtual BOOL SaveTdToRes3DFile(CString f_szFileName)
+virtual BOOL SaveTdToCsvFile(CString f_szFileName)
+virtual bool ExportIP2DDataToDat(CString strFile)
+virtual bool ExportIP3DToDatFile(CString strFile)
+virtual BOOL ExportIPDataToTxt(CString strFileName)
+virtual BOOL ExportResDataToTxt(CString strFileName)
+virtual BOOL ExportSpDataToTxt(CString strFileName)
+virtual BOOL Export2dDataToTxtBySort(CString strFileName, int iSortMethod)
+virtual BOOL ExportDataToUrf(CString strFileName)
+void SetCustToCrossHole(bool bFlag)
+virtual BOOL DisplayGraph()
+virtual BOOL DisplayTPSplinesGraph(int iTSN)
+virtual BOOL LoadData(CLinkList<CMedium*>& m_medLinkList)
+inline int CalcuCrossHolePoleID(int iOrgPoleID, int iHoleID, int iHoleFlag, int iMidEamount)
+CTestingData(DWORD dwID, _ConnectionPtr& pConnection)
+virtual ~CTestingData()
+_ConnectionPtr m_pConnection
+CHandleProcessor m_handleProcessor
+double GetCycle(int f_type)
+BOOL SaveOrgDataToDB(DWORD dwTdID)
+BOOL SaveGRDataToDB(DWORD dwTdID)
}
```
**图示来源**
- [TestingData.h](file://h/TestingData.h)
#### 测量记录实体
测量记录实体存储了单次测量的原始数据和计算结果。
```mermaid
classDiagram
class TdRecord {
+DWORD m_dwChID
+int m_iTsn
+int m_iN
+float m_fK
+float m_fI
+float m_fV
+float m_fR0
+float m_fSP
+CString m_Datetime
+CStringArray m_saVRawData
+CStringArray m_saIRawData
+_ConnectionPtr m_pConnection
+float GetMaxAbsV()
+virtual void DisplayRawDataSplines()
+virtual BOOL LoadOrgData()
+virtual float ConvertVOrgData(float fVOrgData)
+float m_fMaxAbsV
+BOOL LoadCEOrgData()
+BOOL Load2DOrgData()
+BOOL Load3DOrgData()
}
```
**图示来源**
- [TdRecord.h](file://h/TdRecord.h)
#### 脚本实体
脚本实体存储了测量任务的配置参数和测量序列。
```mermaid
classDiagram
class Script {
+DWORD m_dwID
+CHandleProcessor m_handleProcessor
+int m_iEAmount
+int m_iSType
+int m_iAR
+virtual void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
+virtual bool ShowSptConInfo(CListCtrl& sptConList)
+virtual bool ShowSptDetailInfo(CListCtrl& sptDetailList)
+virtual bool ShowChannelList(CListCtrl& sptChannelList)
+_ConnectionPtr m_pConnection
}
```
**图示来源**
- [Script.h](file://h/Script.h)
**章节来源**
- [Project.h](file://h/Project.h)
- [Device.h](file://h/Device.h)
- [TestingData.h](file://h/TestingData.h)
- [TdRecord.h](file://h/TdRecord.h)
- [Script.h](file://h/Script.h)
### 数据访问机制分析
系统的数据访问机制基于ADO技术,通过DataOperator类封装了所有数据库操作。
#### 数据库连接流程
系统通过IOManager类中的代码实现数据库连接,使用Microsoft.ACE.OLEDB.12.0提供程序连接Access数据库。
```mermaid
sequenceDiagram
participant UI as "用户界面"
participant IOManager as "IOManager"
participant DataOperator as "DataOperator"
participant ADO as "ADO"
participant DB as "Access数据库"
UI->>IOManager : 选择数据库文件
IOManager->>IOManager : 构建连接字符串
IOManager->>ADO : 创建Connection对象
ADO->>DB : 打开数据库连接
DB-->>ADO : 连接成功
ADO-->>IOManager : 返回连接对象
IOManager->>DataOperator : 传递连接对象
DataOperator->>DataOperator : 初始化数据操作器
DataOperator-->>UI : 准备就绪
```
**图示来源**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
#### 数据库操作流程
DataOperator类提供了完整的CRUD操作接口,封装了ADO的复杂性。
```mermaid
flowchart TD
Start([开始]) --> CreateConnection["创建数据库连接"]
CreateConnection --> OpenConnection["打开连接"]
OpenConnection --> BeginTransaction["开始事务"]
BeginTransaction --> ExecuteOperation["执行数据库操作"]
ExecuteOperation --> CheckResult{"操作成功?"}
CheckResult --> |是| CommitTransaction["提交事务"]
CheckResult --> |否| RollbackTransaction["回滚事务"]
CommitTransaction --> CloseConnection["关闭连接"]
RollbackTransaction --> CloseConnection
CloseConnection --> End([结束])
```
**图示来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
#### 数据库版本管理
系统通过UpdateDataBase类实现数据库版本管理和迁移,确保不同版本间的兼容性。
```mermaid
sequenceDiagram
participant App as "应用程序"
participant UpdateDB as "UpdateDataBase"
participant XML as "database_modify.xml"
participant DB as "数据库"
App->>UpdateDB : 启动时检查版本
UpdateDB->>DB : 查询当前版本
DB-->>UpdateDB : 返回版本信息
UpdateDB->>XML : 加载更新配置
XML-->>UpdateDB : 返回更新信息
UpdateDB->>UpdateDB : 比较版本差异
UpdateDB->>DB : 执行数据库更新
DB-->>UpdateDB : 更新结果
UpdateDB-->>App : 版本更新完成
```
**图示来源**
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
- [database_modify.xml](file://database_modify.xml)
**章节来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
## 依赖分析
系统的主要依赖关系包括数据库文件、ADO库、XML配置文件和日志文件。数据库操作依赖于Microsoft.ACE.OLEDB.12.0提供程序,版本管理依赖于database_modify.xml配置文件。
```mermaid
graph TD
A[Geomative Studio] --> B[Access数据库]
A --> C[msado15.tlh]
A --> D[msado15.tli]
A --> E[database_modify.xml]
A --> F[update_db.log]
B --> G[GeoMativeDB.accdb]
C --> H[ADO库]
D --> I[数据库更新配置]
E --> J[版本管理]
F --> K[操作日志]
```
**图示来源**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
- [database_modify.xml](file://database_modify.xml)
**章节来源**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
## 性能考虑
系统在数据库性能方面考虑了多个优化策略。首先,使用连接池技术减少数据库连接的创建和销毁开销。其次,通过批量操作减少数据库交互次数。此外,系统在关键查询上建立了适当的索引以提高查询性能。对于大数据量的测量记录,系统采用了分页加载机制,避免一次性加载过多数据导致内存溢出。
## 故障排除指南
当遇到数据库相关问题时,可以参考以下排查步骤:
1. 检查数据库文件是否存在且可访问
2. 验证数据库连接字符串是否正确
3. 检查ADO库是否正确注册
4. 查看update_db.log日志文件中的错误信息
5. 验证数据库版本是否与应用程序兼容
6. 检查数据库文件是否被其他进程锁定
**章节来源**
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
## 结论
Geomative Studio的数据库设计采用了规范化的数据模型,通过项目、设备、测试任务、测区、脚本和测量记录等实体的合理组织,实现了地质测量数据的有效管理。系统通过ADO技术实现了高效的数据访问,并通过完善的版本管理机制确保了数据的兼容性和可维护性。整体设计考虑了性能、可靠性和可扩展性,为地质测量应用提供了坚实的数据基础。