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

MFC SQL 字串拼接錯誤:多餘單引號導致語法錯誤,日期變數被當字串

     編輯:程式設計綜合問答

錯誤代碼


mSqlStr = mSqlStr + "','"; 
mSqlStr = mSqlStr + "', m_BORROW_DATE,'"; // 錯:多雙單引號,m_BORROW_DATE 變字串常數
mSqlStr = mSqlStr + "','";

拼接結果:`VALUES('reader','book','', m_BORROW_DATE,'','userid')` → 語法錯誤:`''` 空字串、日期變數未加引號/格式錯、多餘逗號。

修正


// 假設 m_BORROW_DATE 是 CTime 或 CString 已格式化為 'YYYY-MM-DD HH:MM:SS'
mSqlStr = mSqlStr + "','";           // 結束 BOOK_ID
mSqlStr = mSqlStr + m_BORROW_DATE;   // 直接拼接日期字串 (已含引號或由資料庫函數產生)
mSqlStr = mSqlStr + "','";           // 結束 BORROW_DATE
// 或更安全:用參數化 (CDatabase::ExecuteSQL 不支援,需用 CDaoRecordset/CRecordset 參數化或手動格式化)

最佳實踐:CString::Format 統一拼接


CString strDate = m_BORROW_DATE; // 確保格式 '2024-01-15 10:30:00'
mSqlStr.Format(_T("INSERT INTO BORROW (READER_ID, BOOK_ID, BORROW_DATE, B_CLERK_ID) VALUES ('%s', '%s', '%s', '%s')"),
    m_strReaderID, m_strBookID, strDate, m_strUserID);

進階:避免字串拼接,改用 RFX / 參數化

  • `CRecordset` 派生類,`DoFieldExchange` 綁定欄位 → `AddNew()` / `Edit()` / `Update()` 自動生成參數化 SQL,**零拼接、零注入、型別安全**。
  • 若必須手寫 SQL,統一用 `CString::Format`,日期用 `CTime::Format(_T("%Y-%m-%d %H:%M:%S"))`。

總結

MFC SQL 拼接錯誤 = **多餘單引號、日期變數未正確格式化**。修正:`CString::Format` 一次成型,或改用 `CRecordset` RFX 機制徹底杜絕拼接錯誤。

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