a
This commit is contained in:
@@ -0,0 +1,591 @@
|
||||
# 数据库设计
|
||||
|
||||
<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格式)存储项目、设备、脚本和测量数据等信息。数据库操作通过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<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技术实现了高效的数据访问,并通过完善的版本管理机制确保了数据的兼容性和可维护性。整体设计考虑了性能、可靠性和可扩展性,为地质测量应用提供了坚实的数据基础。
|
||||
Reference in New Issue
Block a user