使用VB与Access的大气污染监测系统设计与实现
系统架构设计:客户端-服务器模式与分层结构
系统采用客户端-服务器架构,前端通过Visual Basic实现用户交互,后端使用Microsoft Access存储数据。架构分为四层:
- 用户界面层:处理数据录入、图表展示及控件操作,使用VB窗体及MSChart控件。
- 业务逻辑层:封装污染模型计算与数据清洗,通过VB类模块实现。
- 数据访问层:管理数据库连接与SQL执行,基于ADO对象。
- 数据存储层:持久化存储监测数据,依赖.mdb文件。
flowchart LR
UI[用户操作] --> BL[业务逻辑处理]
BL --> DA[数据访问调用]
DA --> DS[数据库读写]
DS --> VIZ[结果可视化]
数据访问实现:ADO连接与操作
使用ADO组件建立Access数据库连接:
Dim dbLink As ADODB.Connection
Set dbLink = New ADODB.Connection
dbLink.Provider = "Microsoft.Jet.OLEDB.4.0"
dbLink.ConnectionString = "Data Source=D:\AirQuality\airdb.mdb;"
dbLink.Open
关键注意事项:连接字符串应通过配置文件动态加载,避免硬编码路径。
VB前端开发:界面与验证机制
主窗体布局设计
采用三区域布局优化用户体验:
Private Sub MainForm_Load()
Me.Caption = "大气污染监测平台"
StatusPanel.Text = "状态: 运行中 - " & Format(Now, "yyyy-mm-dd")
InitializeMenu()
End Sub
输入数据验证
前端实时校验确保数据有效性:
Private Sub SaveButton_Click()
If Not IsNumeric(txtO3.Value) Or Val(txtO3.Value) < 0 Then
MsgBox "臭氧浓度需为非负数值", vbCritical
txtO3.SetFocus
Exit Sub
End If
SaveToDatabase
End Sub
动态数据可视化
集成MSChart实现实时图表刷新:
With ChartControl
.ChartType = VtChChartType2dLine
.Title.Text = "SO₂浓度小时变化"
Dim values(1 To 24) As Single
' 从数据库加载数据至values数组
.ChartData = values
End With
数据库建模:规范化设计与查询优化
表结构设计
符合第三范式设计核心表:
| 表名 | 字段 | 类型 |
|---|---|---|
| 监测点 | PointID, Location, Longitude, Latitude | AutoNumber, Text, Double |
| 污染物 | PollutantID, Code, Unit | Integer, Text(10), Text(5) |
| 观测记录 | RecordID, PointID, PollutantID, Value, Time | AutoNumber, Long, Integer, Single, DateTime |
高效查询示例
PM2.5日均超标统计:
SELECT
Points.Location,
COUNT(*) AS OverDays
FROM (
SELECT PointID, DateValue(Time) AS DayDate, AVG(Value) AS DailyAvg
FROM Observations
WHERE PollutantID = 101
GROUP BY PointID, DateValue(Time)
HAVING AVG(Value) > 75
) AS DailyData
JOIN Points ON DailyData.PointID = Points.PointID
GROUP BY Points.Location
污染扩散模型:高斯算法实现
高斯烟羽模型VB函数封装:
Function CalcPlume(EmissionRate As Double, WindSpeed As Double, XDist As Double, YDist As Double, StackHeight As Double, Stability As String) As Double
Dim SigmaY As Double, SigmaZ As Double
Select Case Stability
Case "A": SigmaY = 0.22 * XDist: SigmaZ = 0.20 * XDist
Case "B": SigmaY = 0.16 * XDist: SigmaZ = 0.12 * XDist
Case Else: SigmaY = 0.11 * XDist: SigmaZ = 0.08 * XDist
End Select
CalcPlume = (EmissionRate / (2 * 3.1416 * SigmaY * SigmaZ * WindSpeed)) * _
Exp(-(YDist ^ 2) / (2 * SigmaY ^ 2)) * _
Exp(-(StackHeight ^ 2) / (2 * SigmaZ ^ 2))
End Function
性能提升策略
- 界面响应优化:在循环中插入DoEvents防止卡顿
- 数据库索引:为PointID和Time字段创建复合索引
- 安全机制:Access数据库密码加密与自动备份脚本
' 备份脚本示例
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile "C:\System\data.mdb", "E:\Backup\data_" & Format(Now, "yyyymmdd") & ".mdb"
架构演进路径
数据量增长时迁移至SQL Server Express:
conn.ConnectionString = "Provider=SQLOLEDB;Server=localhost\SQLEXPRESS;" & _
"Database=AirData;Trusted_Connection=yes;"