記錄一個(gè)C++在條件查詢時(shí)遇到的問題(推薦)
C++在條件查詢時(shí)困擾了6個(gè)小時(shí)的小問題 先說結(jié)論1. 貼上運(yùn)行錯(cuò)誤的原碼2. 錯(cuò)誤分析2.1 sql語句錯(cuò)誤2.2 sql語句替換2.3 繼續(xù)問題分析 3.總結(jié)
先說結(jié)論
1:如果由
%作為占位符.arg()傳參
的模式,則sql_query.exec(sql_str)執(zhí)行查詢
時(shí),必須加上查詢語句。
2:如果由?作為占位符.addBindValue()
傳參的模式,則sql_query.exec()執(zhí)行查詢
時(shí),不可加上查詢語句。
1. 貼上運(yùn)行錯(cuò)誤的原碼
int InputManage::queryInputsByUserId(int userId,map<uint,Model_AllInPut> &AInputMap){ if(!db.openDB()){ db.openDB(); } qDebug()<<"用戶ID為::::"<<userId; //打印正確為1 QSqlQuery sql_query; //數(shù)據(jù)庫查詢對(duì)象 QString select_str = "select * from t_allinput where UserId = ?";//條件查詢語句,將?改為1放到Navicat中可查詢出結(jié)果 sql_query.prepare(select_str); //預(yù)處理 sql_query.addBindValue(userId); //根據(jù)傳入的id去查詢記錄 if(!sql_query.exec(select_str)) //執(zhí)行查詢sql語句 { qDebug()<<sql_query.lastError(); } else { while(sql_query.next()) //遍歷結(jié)果 { Model_AllInPut AInput; AInput.setAllInPutId(sql_query.value(0).toUInt()); //根據(jù)index遍歷 uint Id = AInput.AllInPutId(); AInput.setConcrete_compressive_grade(sql_query.value(1).toString()); //... 省略中間字段 ... AInput.setUserId(sql_query.value(19).toUInt()); AInputMap[Id]= AInput; //將鍵值對(duì)放入map中 } db.closeDB(); return AInputMap.size(); } db.closeDB(); return 0; }
結(jié)果,Qt Creater報(bào)錯(cuò):參數(shù)個(gè)數(shù)不匹配(“Parameter count mismatch”)。
2. 錯(cuò)誤分析
2.1 sql語句錯(cuò)誤
2.1.1 數(shù)據(jù)庫字段不匹配
我看了數(shù)據(jù)庫結(jié)構(gòu),表名字段名確認(rèn)沒問題(在Navicat中可進(jìn)行查詢);
?為英文也沒問題;
UserId字段為整形,不用加引號(hào)的,但死馬當(dāng)活馬醫(yī)試一試。
然后我在?上加單引號(hào),不報(bào)錯(cuò)了,但是查詢出的記錄個(gè)數(shù)為0。
2.1.2 占位符的問題
分析原因:不帶條件查詢能查詢出來,并且我在Navicat中條件查詢將?替換成具體的數(shù)值也可以查詢出來。
所以問題很可能是出在?占位符上。(這里不再區(qū)分?的中英文了,都是英文,為了方便不再切換為英文)
2.2 sql語句替換
于是詢問同學(xué),同學(xué)看了也不太清楚,換上同學(xué)的%占位符進(jìn)行語句查詢。結(jié)果: 查 詢 成 功,我的天那?。?!
僅將sql語句替換為如下:
QString select_str = QString( "select * from t_allinput where UserId = '%1'").arg(userId);//條件查詢語句,
2.3 繼續(xù)問題分析
為什么我會(huì)迷茫:因?yàn)槲业钠渌碇幸埠蓄愃?where 字段名 = ?
的條件查詢語句。
其它表都能運(yùn)行成功,為什么這個(gè)表不行?
首先我懷疑是因?yàn)檫@個(gè)表查詢的字段不是主鍵。(我知道是不是主鍵影響不大,但還是盡可能試一試)
于是我將字段改為主鍵字段進(jìn)行查詢,錯(cuò)誤依舊。
被逼無奈我將兩個(gè)表的條件查詢函數(shù)逐字比較
,最后發(fā)現(xiàn)原來問題出執(zhí)行查詢sql語句
的地方。
對(duì)比:
if(!sql_query.exec(select_str)) //執(zhí)行查詢sql語句 if(!sql_query.exec()) //執(zhí)行查詢sql語句
3.總結(jié)
條件查詢的占位符與查詢執(zhí)行的匹配:
1:如果由
%作為占位符.arg()傳參
的模式,則查詢語句執(zhí)行時(shí)需要加上查詢語句。(已驗(yàn)證,必須加上)
2:如果由?作為占位符.addBindValue()
傳參的模式,則查詢語句執(zhí)行時(shí)不可以加上查詢語句。
示例1:
QSqlQuery sql_query; //數(shù)據(jù)庫查詢對(duì)象 QString select_str = QString( "select * from t_allinput where UserId = '%1'").arg(userId);//%作為占位符.arg()傳參 sql_query.prepare(select_str); //預(yù)處理 if(!sql_query.exec(select_str)) //+++++ 必須帶查詢語句 ++++++++//
示例2:
QSqlQuery sql_query; //數(shù)據(jù)庫查詢對(duì)象 QString select_str = "select * from t_allinput where UserId = ?"; //?作為占位符 sql_query.prepare(select_str); //預(yù)處理 sql_query.addBindValue(userId); //.addBindValue()傳參 if(!sql_query.exec()) //+++++ 不可帶查詢語句 ++++++++//
到此這篇關(guān)于記錄一個(gè)C++在條件查詢時(shí)遇到的問題。的文章就介紹到這了,更多相關(guān)C++條件查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?opencv圖像處理實(shí)現(xiàn)圖片邊緣檢測(cè)示例
這篇文章主要為大家介紹了C++?opencv實(shí)現(xiàn)圖片邊緣檢測(cè)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05C++實(shí)現(xiàn)校園運(yùn)動(dòng)會(huì)報(bào)名系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)校園運(yùn)動(dòng)會(huì)報(bào)名系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10C語言實(shí)現(xiàn)從文件讀入一個(gè)3*3數(shù)組,并計(jì)算每行的平均值
今天小編就為大家分享一篇C語言實(shí)現(xiàn)從文件讀入一個(gè)3*3數(shù)組,并計(jì)算每行的平均值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12C++常量詳解二(常量形參,常量返回值,常量成員函數(shù))
這篇文章主要介紹了C++常量詳解二(常量形參,常量返回值,常量成員函數(shù)),需要的朋友可以參考下2017-06-06C++控制臺(tái)實(shí)現(xiàn)俄羅斯方塊游戲
這篇文章主要為大家詳細(xì)介紹了C++控制臺(tái)實(shí)現(xiàn)俄羅斯方塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06C++實(shí)現(xiàn)LeetCode(163.缺失區(qū)間)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(163.缺失區(qū)間),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07