# 数据库设计 **本文档引用的文件** - [数据库字段修改记录.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) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概述](#架构概述) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 引言 本文档详细说明了Geomative Studio软件系统所使用的Access数据库的表结构、字段定义、数据类型和约束条件。文档基于数据库字段修改记录文件,描述了主要实体(项目、设备、脚本、测量数据)之间的关系和关联方式。同时,文档解释了数据访问模式和持久化机制,包括通过ADO进行数据库操作的实现细节。提供了数据库ER图、关键查询示例和性能优化建议,并说明了数据版本控制和迁移策略。 ## 项目结构 Geomative Studio项目的数据库相关文件主要位于DB目录下,包括数据库文件和字段修改记录。系统使用Access数据库(.accdb格式)存储项目、设备、脚本和测量数据等信息。数据库操作通过ADO(ActiveX 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& 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& 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技术实现了高效的数据访问,并通过完善的版本管理机制确保了数据的兼容性和可维护性。整体设计考虑了性能、可靠性和可扩展性,为地质测量应用提供了坚实的数据基础。