591 lines
17 KiB
Markdown
591 lines
17 KiB
Markdown
# 数据库设计
|
||
|
||
<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技术实现了高效的数据访问,并通过完善的版本管理机制确保了数据的兼容性和可维护性。整体设计考虑了性能、可靠性和可扩展性,为地质测量应用提供了坚实的数据基础。 |