Qt中操作数据库时,给LIKE子句绑定命名占位符的值

时间:2022-11-12 22:58:16

Qt中操作数据库时,为提高安全性,防止SQL注入,可以使用命名占位符和位置占位符。

本文以命名占位符为例,演示如何给LIKE子句中的占位符绑定值,代码如下:

/*从person表中按工号查找最多limitCnt条人员信息,用于"识别新卡号"界面使用
**
**no :需要查询的工号
**rslt :查询结果
**limitCnt :最多返回的结果条数
**
**返回值 :成功后返回true;否则返回false.返回false时,rslt不可用.
**
**注意 :如果没有查询到符合条件的记录,则也认为查询是成功的.
*/
bool selPersonAvailable(const QString &no,QVector<QString> &rslt,const int limitCnt){
static const QString funcErrMsg="从person表中按工号查找最多limitCnt条人员信息,用于\"识别新卡号\"界面使用时,%1失败.";

QString sql="select pnam,pno,rno from person where pno like :pno and state<>'d' limit :limitCnt ";//注意,like的百分号(%)不直接写到SQL字符串中
bool ok;

//_log(QString("no=%1,limitCnt=%2").arg(no).arg(limitCnt));

QSqlDatabase db=QSqlDatabase::database(DB_CONN_NAME);
QSqlQuery query(db);

query.prepare(sql);
query.bindValue(":pno",QString("%%1%").arg(no));//添加百分号(%)
query.bindValue(":limitCnt",limitCnt);

if(query.exec()){
while(query.next()){
rslt.append(query.value(0).toString());
rslt.append(query.value(1).toString());
rslt.append(query.value(2).toString());
}
//_log(QString("rslt.size()=%1").arg(rslt.size()));
return true;
}
else{
_log(query.lastError().text());
_log(funcErrMsg.arg("query.exec()"));
}

return false;
}

注意,LIKE子句中使用到的百分号(%)不是在SQL字符串中出现的,而是在绑定占位符的值的时候出现的,而且LIKE子句在SQL字符串中不能使用单引号('),因为占位符的类型就是字符串,所以就不需要在LIKE子句中再使用单引号(')了~


如果使用位置占位符,则需要把:pno,:limitCnt都换成?,然后在bindValue的时候:

query.bindValue(0,QString("%%1%").arg(no));//添加百分号(%)
query.bindValue(1,limitCnt);
不是使用占位符的名字,而是使用编号,根据占位符出现在SQL字符串中的位置,从左往右,依次是0,1,2,3,4,5,6,……


还有,我的数据库用的是SQLite。