在QSqlTableModel中运行参数化查询



我有一个QTableView,我使用QSqlTableModel的衍生类SqlTableModel从MySQL数据库获取数据。我想防止打针。我做了联合注射,这比从婴儿手里抢糖果容易多了。SQL查询使用LIKE关键字。

尝试1(可注射):

QString query = QString("select * from table where col like '%%1%'").arg(edit->text());
QSqlQuery q(query);
SqlTableModel *model = new SqlTableModel();
model->setQuery(q);
model->select();
tableView->setModel(model);

尝试2(无数据返回,无错误):

QString query = "select * from table";
QSqlQuery q(query);
SqlTableModel *model = new SqlTableModel();
model->setQuery(q);
model->setFilter(QString("col like '%%1%'").arg(edit->text()));
model->select();
tableView->setModel(model);

尝试3(无数据返回,无错误):

QString query = "select * from table where col like :param";
QSqlQuery q(query);
q.prepare(query);
q.bindValue(":param", QString("%%1%").arg(edit->text()));
SqlTableModel *model = new SqlTableModel();
model->setQuery(q);
model->select();
tableView->setModel(model);

看起来您正在以错误的方式使用QSqlTableModel。根据docs

,常见的用法是调用setTable,然后调用select
model->setTable("table");
model->select()

过滤器可以使用setFilter

设置
model->setFilter(QString("col like '%%1%'").arg(edit->text()));

同时,你使用一个QSqlTableModel,就像它是一个QSqlQueryModel与setQuery调用。即使它应该工作,那么根据文档查询应该是活跃的,即QSqlQuery::exec应该在setQuery调用之前被调用。

最后,QSqlTableModel的使用方式应该像

SqlTableModel *model = new SqlTableModel();
model->setTable("table");
model->setFilter(QString("col like '%%1%'").arg(edit->text()));
model->select();   
tableView->setModel(model);

如果您想自己构建查询,那么您应该使用基于QSqlQueryModel的类,如

QString query = "select * from table where col like '%%1%'";
QSqlQuery q(query);
q.prepare();
q.addBindValue(edit->text());
q.exec();
QSqlQueryModel *model = new QSqlQueryModel();
model->setQuery(std::move(q));
tableView->setModel(model)

最新更新