17 KiB
数据库设计
**本文档引用的文件** - [数据库字段修改记录.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)目录
引言
本文档详细说明了Geomative Studio软件系统所使用的Access数据库的表结构、字段定义、数据类型和约束条件。文档基于数据库字段修改记录文件,描述了主要实体(项目、设备、脚本、测量数据)之间的关系和关联方式。同时,文档解释了数据访问模式和持久化机制,包括通过ADO进行数据库操作的实现细节。提供了数据库ER图、关键查询示例和性能优化建议,并说明了数据版本控制和迁移策略。
项目结构
Geomative Studio项目的数据库相关文件主要位于DB目录下,包括数据库文件和字段修改记录。系统使用Access数据库(.accdb格式)存储项目、设备、脚本和测量数据等信息。数据库操作通过ADO(ActiveX Data Objects)技术实现,代码中包含了完整的数据库连接、查询、更新和版本管理机制。
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 : "关联"
图示来源
章节来源
核心组件
系统的核心数据库组件包括项目(Project)、设备(Device)、测试任务(TD)、测区(TZ)、脚本(Script)和测量记录(TdRecord)等实体。这些组件通过外键关系相互关联,形成了完整的数据模型。数据库操作主要通过DataOperator类实现,该类封装了所有数据库的CRUD操作。
章节来源
架构概述
系统采用分层架构,数据库访问层通过ADO技术与Access数据库交互。DataOperator类作为数据访问的核心组件,负责所有数据库操作。UpdateDataBase类负责数据库版本管理和迁移。系统使用连接池技术管理数据库连接,确保多用户并发访问时的性能和稳定性。
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
图示来源
章节来源
详细组件分析
数据库实体分析
系统的主要数据库实体包括项目、设备、测试任务、测区、脚本和测量记录。这些实体通过外键关系相互关联,形成了完整的数据模型。
项目实体
项目实体是系统中最顶层的数据单元,包含项目的基本信息和元数据。
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)
}
图示来源
设备实体
设备实体存储了测量设备的详细信息,包括设备型号、序列号、硬件版本等。
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)
}
图示来源
测试数据实体
测试数据实体存储了测量任务的详细信息和测量结果。
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)
}
图示来源
测量记录实体
测量记录实体存储了单次测量的原始数据和计算结果。
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()
}
图示来源
脚本实体
脚本实体存储了测量任务的配置参数和测量序列。
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
}
图示来源
章节来源
数据访问机制分析
系统的数据访问机制基于ADO技术,通过DataOperator类封装了所有数据库操作。
数据库连接流程
系统通过IOManager类中的代码实现数据库连接,使用Microsoft.ACE.OLEDB.12.0提供程序连接Access数据库。
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 : 准备就绪
图示来源
数据库操作流程
DataOperator类提供了完整的CRUD操作接口,封装了ADO的复杂性。
flowchart TD
Start([开始]) --> CreateConnection["创建数据库连接"]
CreateConnection --> OpenConnection["打开连接"]
OpenConnection --> BeginTransaction["开始事务"]
BeginTransaction --> ExecuteOperation["执行数据库操作"]
ExecuteOperation --> CheckResult{"操作成功?"}
CheckResult --> |是| CommitTransaction["提交事务"]
CheckResult --> |否| RollbackTransaction["回滚事务"]
CommitTransaction --> CloseConnection["关闭连接"]
RollbackTransaction --> CloseConnection
CloseConnection --> End([结束])
图示来源
数据库版本管理
系统通过UpdateDataBase类实现数据库版本管理和迁移,确保不同版本间的兼容性。
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 : 版本更新完成
图示来源
章节来源
依赖分析
系统的主要依赖关系包括数据库文件、ADO库、XML配置文件和日志文件。数据库操作依赖于Microsoft.ACE.OLEDB.12.0提供程序,版本管理依赖于database_modify.xml配置文件。
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[操作日志]
图示来源
章节来源
性能考虑
系统在数据库性能方面考虑了多个优化策略。首先,使用连接池技术减少数据库连接的创建和销毁开销。其次,通过批量操作减少数据库交互次数。此外,系统在关键查询上建立了适当的索引以提高查询性能。对于大数据量的测量记录,系统采用了分页加载机制,避免一次性加载过多数据导致内存溢出。
故障排除指南
当遇到数据库相关问题时,可以参考以下排查步骤:
- 检查数据库文件是否存在且可访问
- 验证数据库连接字符串是否正确
- 检查ADO库是否正确注册
- 查看update_db.log日志文件中的错误信息
- 验证数据库版本是否与应用程序兼容
- 检查数据库文件是否被其他进程锁定
章节来源
结论
Geomative Studio的数据库设计采用了规范化的数据模型,通过项目、设备、测试任务、测区、脚本和测量记录等实体的合理组织,实现了地质测量数据的有效管理。系统通过ADO技术实现了高效的数据访问,并通过完善的版本管理机制确保了数据的兼容性和可维护性。整体设计考虑了性能、可靠性和可扩展性,为地质测量应用提供了坚实的数据基础。