在使用QSqlQuery执行SQL语句时,发现有两种方式:
1.直接执行SQL语句
QString bookName; //书名QString strSql("SELECT * FROM books WHERE name=%1").arg(bookName); //组装完整的Sql语句
QSqlQuery query(strSql);
if(!query.exec())
{
QDebug() << __FILE__ << __LINE__ << query.lastError.text();
}
while (query.next()) {
int id = query.value(0).toInt();
...
doSomething(id);
}
2.采用值绑定(bindValue)的方式
QSqlQuery query;
QString bookName;
query.prepare("SELECT * FROM books WHERE name=:name");
query.bindValue(":name", bookName);
if(!query.exec())
{
QDebug() << __FILE__ << __LINE__ << query.lastError.text();
}
推荐使用第二种方式,理由如下:
1.有效防止Sql注入,保证Sql语句的原始意义不发生变化.
2.在字符串中含有特殊字符(如:单引号,中括号等)时,能对其处理.
3.在执行多条相同数据类型操作(Sql原语相同,数据不同)时,减少Sql的预编译次数,优化Sql执行效率.
4.可读性强.