我有一个包含多个 SQL 语句的文件,我想用它们来初始化新的 sqlite3 数据库文件。显然,sqlite3 仅通过以下方式处理一个查询中的多个语句 sqlite3_exec()
函数,以及not通过prepare/step/finalize
功能。没关系,但我想直接使用 QtSQL api 而不是 c api。通过 QSqlQuery 加载同一初始值设定项文件仅执行第一个语句,就像直接使用 sqlite3 api 中的准备/步骤/终结函数一样。有没有办法让 QSqlQuery 运行多个查询,而不必为每个语句单独调用 query.exec() ?
正如 Qt 文档中明确指出的QSqlQuery::准备() http://doc.qt.io/qt-5/qsqlquery.html#prepare and QSqlQuery::exec() http://doc.qt.io/qt-5/qsqlquery.html#exec-1,
对于 SQLite,查询字符串一次只能包含一个语句。
如果给出多个语句,该函数将返回 false。
正如您已经猜到的,解决此限制的唯一已知解决方法是将所有 sql 语句用某个字符串分隔,拆分语句并在循环中执行每个语句。
请参阅以下示例代码(它使用“;”作为分隔符,并假设查询中未使用相同的字符。这缺乏通用性,因为您可能在 where/insert/update 语句的字符串文字中具有给定的字符):
QSqlDatabase database;
QSqlQuery query(database);
QFile scriptFile("/path/to/your/script.sql");
if (scriptFile.open(QIODevice::ReadOnly))
{
// The SQLite driver executes only a single (the first) query in the QSqlQuery
// if the script contains more queries, it needs to be splitted.
QStringList scriptQueries = QTextStream(&scriptFile).readAll().split(';');
foreach (QString queryTxt, scriptQueries)
{
if (queryTxt.trimmed().isEmpty()) {
continue;
}
if (!query.exec(queryTxt))
{
qFatal(QString("One of the query failed to execute."
" Error detail: " + query.lastError().text()).toLocal8Bit());
}
query.finish();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)