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

MFC `CString::Format` SQL 插入語句參數佔位符缺失導致亂碼

     編輯:程式設計綜合問答

錯誤程式碼


strSql.Format(_T("INSERT INTO Bill_Info 
(Bill_ID,Buyer_Name,Buyer_Book,Buyer_State,Price) 
values('%s','%s','s','%d','%f')"),
b.getbid(), b.getbname(), b.getbbook(), b.getbstate(), b.getprice());

問題分析

  • 第五個欄位 Buyer_Book 對應參數 b.getbbook()(推測為 CString),但格式字串寫死 's',缺少 %s 佔位符。
  • 導致後續參數錯位:%d 對到 CString 指標值,%f 對到整數,產生亂碼與極大浮點數。
  • 調試視窗顯示 values('퀘\x18','癮污摩猠牴湩⁧潰楳楴湯촀췍췍췍췍﷽﷽ꮫꮫꮫꮫﻮﻮ','s','-858993460','-925596313493178310000000000000000000000000000000000000000000000.000000',明顯為記憶體誤讀。

修正後語句


strSql.Format(_T("INSERT INTO Bill_Info 
(Bill_ID,Buyer_Name,Buyer_Book,Buyer_State,Price) 
values('%s','%s','%s','%d','%f')"),  // 第 3 個 %s 補上
b.getbid(), b.getbname(), b.getbbook(), b.getbstate(), b.getprice());

進階建議:參數化查詢

避免手動拼接 SQL,防止注入與格式錯誤:


// 使用 ADO 參數化
_CommandPtr cmd;
cmd->CommandText = "INSERT INTO Bill_Info (Bill_ID,Buyer_Name,Buyer_Book,Buyer_State,Price) VALUES (?,?,?,?,?)";
cmd->Parameters->Append(cmd->CreateParameter("p1", adVarChar, adParamInput, 50, b.getbid()));
cmd->Parameters->Append(cmd->CreateParameter("p2", adVarChar, adParamInput, 100, b.getbname()));
cmd->Parameters->Append(cmd->CreateParameter("p3", adVarChar, adParamInput, 100, b.getbbook()));
cmd->Parameters->Append(cmd->CreateParameter("p4", adInteger, adParamInput, , b.getbstate()));
cmd->Parameters->Append(cmd->CreateParameter("p5", adDouble, adParamInput, , b.getprice()));
cmd->Execute(NULL, NULL, adCmdText);

關鍵檢查清單

  1. 格式字串佔位符數量、型別、順序與傳入參數完全一致。
  2. CString 對應 %s,int 對應 %d,double/float 對應 %f(注意 %lf 為 scanf 專用)。
  3. 啟用 Unicode 專案時,_T() 宏確保字串常值為寬字元。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved