記錄一個C++在條件查詢時遇到的問題(推薦)
C++在條件查詢時困擾瞭6個小時的小問題 先說結論1. 貼上運行錯誤的原碼2. 錯誤分析2.1 sql語句錯誤2.2 sql語句替換2.3 繼續問題分析 3.總結
先說結論
1:如果由
%作為占位符.arg()傳參
的模式,則sql_query.exec(sql_str)執行查詢
時,必須加上查詢語句。
2:如果由?作為占位符.addBindValue()
傳參的模式,則sql_query.exec()執行查詢
時,不可加上查詢語句。
1. 貼上運行錯誤的原碼
int InputManage::queryInputsByUserId(int userId,map<uint,Model_AllInPut> &AInputMap){ if(!db.openDB()){ db.openDB(); } qDebug()<<"用戶ID為::::"<<userId; //打印正確為1 QSqlQuery sql_query; //數據庫查詢對象 QString select_str = "select * from t_allinput where UserId = ?";//條件查詢語句,將?改為1放到Navicat中可查詢出結果 sql_query.prepare(select_str); //預處理 sql_query.addBindValue(userId); //根據傳入的id去查詢記錄 if(!sql_query.exec(select_str)) //執行查詢sql語句 { qDebug()<<sql_query.lastError(); } else { while(sql_query.next()) //遍歷結果 { Model_AllInPut AInput; AInput.setAllInPutId(sql_query.value(0).toUInt()); //根據index遍歷 uint Id = AInput.AllInPutId(); AInput.setConcrete_compressive_grade(sql_query.value(1).toString()); //... 省略中間字段 ... AInput.setUserId(sql_query.value(19).toUInt()); AInputMap[Id]= AInput; //將鍵值對放入map中 } db.closeDB(); return AInputMap.size(); } db.closeDB(); return 0; }
結果,Qt Creater報錯:參數個數不匹配(“Parameter count mismatch”)。
2. 錯誤分析
2.1 sql語句錯誤
2.1.1 數據庫字段不匹配
我看瞭數據庫結構,表名字段名確認沒問題(在Navicat中可進行查詢);
?為英文也沒問題;
UserId字段為整形,不用加引號的,但死馬當活馬醫試一試。
然後我在?上加單引號,不報錯瞭,但是查詢出的記錄個數為0。
2.1.2 占位符的問題
分析原因:不帶條件查詢能查詢出來,並且我在Navicat中條件查詢將?替換成具體的數值也可以查詢出來。
所以問題很可能是出在?占位符上。(這裡不再區分?的中英文瞭,都是英文,為瞭方便不再切換為英文)
2.2 sql語句替換
於是詢問同學,同學看瞭也不太清楚,換上同學的%占位符進行語句查詢。結果: 查 詢 成 功,我的天那!!!
僅將sql語句替換為如下:
QString select_str = QString( "select * from t_allinput where UserId = '%1'").arg(userId);//條件查詢語句,
2.3 繼續問題分析
為什麼我會迷茫:因為我的其它表中也含有類似 where 字段名 = ?
的條件查詢語句。
其它表都能運行成功,為什麼這個表不行?
首先我懷疑是因為這個表查詢的字段不是主鍵。(我知道是不是主鍵影響不大,但還是盡可能試一試)
於是我將字段改為主鍵字段進行查詢,錯誤依舊。
被逼無奈我將兩個表的條件查詢函數逐字比較
,最後發現原來問題出執行查詢sql語句
的地方。
對比:
if(!sql_query.exec(select_str)) //執行查詢sql語句 if(!sql_query.exec()) //執行查詢sql語句
3.總結
條件查詢的占位符與查詢執行的匹配:
1:如果由
%作為占位符.arg()傳參
的模式,則查詢語句執行時需要加上查詢語句。(已驗證,必須加上)
2:如果由?作為占位符.addBindValue()
傳參的模式,則查詢語句執行時不可以加上查詢語句。
示例1:
QSqlQuery sql_query; //數據庫查詢對象 QString select_str = QString( "select * from t_allinput where UserId = '%1'").arg(userId);//%作為占位符.arg()傳參 sql_query.prepare(select_str); //預處理 if(!sql_query.exec(select_str)) //+++++ 必須帶查詢語句 ++++++++//
示例2:
QSqlQuery sql_query; //數據庫查詢對象 QString select_str = "select * from t_allinput where UserId = ?"; //?作為占位符 sql_query.prepare(select_str); //預處理 sql_query.addBindValue(userId); //.addBindValue()傳參 if(!sql_query.exec()) //+++++ 不可帶查詢語句 ++++++++//
到此這篇關於記錄一個C++在條件查詢時遇到的問題。的文章就介紹到這瞭,更多相關C++條件查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!