首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ ODBC 資料庫自動儲存與定時刪除實作

     編輯:關於VC++

電廠控制專案需求:程式需自動保存即時數據並定期清除舊紀錄。本文示範以 VC++ ODBC 實現每秒寫入、保留 10 分鐘數據的完整方案。

環境準備

  1. 註冊 ODBC 資料源(控制台 → 系統管理工具 → 資料來源 ODBC)
  2. 建立 MFC 對話框專案
  3. 用 ClassWizard 從資料庫建立 CRecordset 衍生類別 (如 CDataSet)
  4. StdAfx.h 加入 #include <afxdb.h>
  5. 對話框類別加入成員:CDataSet dataSet; 並 #include "DataSet.h"

ODBC 資料源設定 建立 Recordset 類別

核心程式碼:雙定時器機制

在 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() 釋放資料集連接

擴展建議

  • 生產環境建議將 SQL 字串參數化,防止注入
  • 大量數據時考慮批次操作或存儲程序提升效能
  • 加入錯誤處理與日誌記錄(CDBException 捕捉)
  • 刪除邏輯可改為背景執行緒,避免阻塞 UI

結語

此範例展示 ODBC 搭配 MFC CRecordset 實現自動化數據生命週期管理的核心模式:定時寫入 + 時間窗口刪除。程式碼簡潔易懂,可直接套用至類似工控、監測等需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved