電廠控制專案需求:程式需自動保存即時數據並定期清除舊紀錄。本文示範以 VC++ ODBC 實現每秒寫入、保留 10 分鐘數據的完整方案。
CRecordset 衍生類別 (如 CDataSet)StdAfx.h 加入 #include <afxdb.h>CDataSet dataSet; 並 #include "DataSet.h"

在 OnInitDialog() 建立兩個定時器:
SetTimer(1, 1000, NULL); // 1 秒寫入一次
SetTimer(2, 5000, NULL); // 5 秒檢查一次刪除條件
OnTimer() 處理邏輯:
void CMyDlg::OnTimer(UINT nIDEvent) {
switch (nIDEvent) {
case 1: { // 定時寫入數據
if (dataSet.Open(AFX_DB_USE_DEFAULT_TYPE, _T("select * from 11"))) {
dataSet.AddNew();
CTime now = CTime::GetCurrentTime();
dataSet.m_Date = now;
dataSet.m_LT301_PV = 6;
dataSet.m_LT301_SP = now.GetYear();
dataSet.m_LT302_SP = now.GetDay();
dataSet.m_LT303 = now.GetHour();
dataSet.m_PT301_PV = now.GetSecond();
dataSet.m_PT301_SP = 5;
dataSet.m_PT303 = now.GetYear();
dataSet.m_ZC301_1 = now.GetDay();
dataSet.m_ZC302_1 = now.GetHour();
dataSet.m_ZC302_2 = now.GetSecond();
dataSet.Update();
dataSet.Close();
}
break;
}
case 2: { // 定時刪除 10 分鐘前數據
CTime now = CTime::GetCurrentTime();
CTimeSpan span(0, 0, 10, 0); // 保留 10 分鐘
CTime cutoff = now - span;
CString strTime;
strTime.Format(_T("#%04d/%02d/%02d %d:%02d:%02d#"),
cutoff.GetYear(), cutoff.GetMonth(), cutoff.GetDay(),
cutoff.GetHour(), cutoff.GetMinute(), cutoff.GetSecond());
CString strSql;
strSql.Format(_T("select * from 11 where Date < %s"), strTime);
if (dataSet.Open(AFX_DB_USE_DEFAULT_TYPE, strSql)) {
while (!dataSet.IsEOF()) {
dataSet.Delete();
dataSet.MoveNext();
}
dataSet.Close();
}
break;
}
}
CDialog::OnTimer(nIDEvent);
}
| 技術點 | 說明 |
|---|---|
| 時間格式 | Access/ODBC 日期常值需用 #YYYY/MM/DD HH:MM:SS# 格式 |
| CTimeSpan | 方便進行日期時間加減運算 |
| 刪除迴圈 | Delete() 後必須 MoveNext(),否則游標停留導致無限迴圈 |
| 資源管理 | 每次操作後呼叫 Close() 釋放資料集連接 |
CDBException 捕捉)此範例展示 ODBC 搭配 MFC CRecordset 實現自動化數據生命週期管理的核心模式:定時寫入 + 時間窗口刪除。程式碼簡潔易懂,可直接套用至類似工控、監測等需求。