首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VS2012 MFC 連接 Access 資料庫:時間控制項無法直接賦值給 CTime 欄位的解決方案

     編輯:程式設計綜合問答

問題背景

在使用 Visual Studio 2012 開發 MFC 應用程式,透過 ODBC 連接 Access 資料庫時,嘗試將 CDateTimeCtrl 控制項的值直接賦給資料集類別 CCteSet 的 m_data 成員(型別為 CTime),編譯器報錯:

error C2679: 二進制“=”: 沒有找到接受“CDateTimeCtrl”類型的右操作數的運算符

錯誤提示顯示候選運算子僅接受 __time64_t 或 const ATL::CTime&,無法隱含轉換 CDateTimeCtrl。

原因分析

CDateTimeCtrl 是 MFC 封裝的日期時間選擇控制項,內部儲存的是 SYSTEMTIME 結構;而資料集欄位 m_data 對應資料庫的日期時間型別,映射為 CTime(或 COleDateTime)。兩者型別不相容,無法直接賦值。

解決方法

  1. 取得控制項的時間值:呼叫 CDateTimeCtrl::GetTime() 取得 CTime 物件,或 GetTime(COleDateTime&) 取得 COleDateTime。
  2. 賦值給資料集欄位:將取得的 CTime/COleDateTime 賦給 rs.m_data。

程式碼範例

void CCteFormView::OnBnClickedSave()
{
    UpdateData();
    CCteSet rs;
    rs.Open();
    rs.AddNew();

    // 正確做法:從控制項取得 CTime 再賦值
    CTime dt;
    m_ctrlDateTime.GetTime(dt);   // m_ctrlDateTime 為 CDateTimeCtrl 變數
    rs.m_data = dt;               // 型別匹配,編譯通過

    rs.m_name   = m_strname;
    rs.m_luhao  = m_strluhao;
    rs.m_liaose = m_strliaose;

    rs.Update();
    rs.Close();
}

補充說明

  • 若資料集欄位型別為 COleDateTime,可用 COleDateTime oleDt; m_ctrlDateTime.GetTime(oleDt); rs.m_data = oleDt;。
  • 確認 DoFieldExchange 中欄位型別與資料庫一致,避免執行期資料截斷或轉換失敗。

常見錯誤與避坑指南

錯誤寫法正確寫法說明
rs.m_data = m_ctrlDateTime;CTime t; m_ctrlDateTime.GetTime(t); rs.m_data = t;控制項不可隱含轉換為 CTime
rs.m_data = (CTime)m_ctrlDateTime;同上C++ 無此轉換建構函式

總結

MFC 日期時間控制項與資料集欄位型別不同時,務必透過 GetTime() 取得對應的 CTime 或 COleDateTime 再賦值,即可解決編譯錯誤並確保資料正確寫入 Access 資料庫。

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