在使用 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)。兩者型別不相容,無法直接賦值。
CDateTimeCtrl::GetTime() 取得 CTime 物件,或 GetTime(COleDateTime&) 取得 COleDateTime。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 資料庫。