不要通过 QSqlQuery 获得所有 sqlite pragma 的结果
Posted
技术标签:
【中文标题】不要通过 QSqlQuery 获得所有 sqlite pragma 的结果【英文标题】:Do not get result for all sqlite pragmas via QSqlQuery 【发布时间】:2014-05-08 15:21:19 【问题描述】:我想使用 Qt 的 QSqlQuery 获取 sqlite pragma 的当前状态。 但是我没有从程序中获得某些值的结果,而是从 sqlite 控制台获得结果。 Qt 版本 5.2.1、Sqlite 版本 3.8.4.3、Windows 7、Ubuntu 12.4 LTS
输出: application_id = "0" auto_vacuum = "0" 自动索引 = “1” busy_timeout = "5000" 缓存大小 = “2000” cache_spill = [NoResult] case_sensitive_like = [NoResult]
void mysqliteInfo::PrintState(QString state)
printf("%s = ", state.toStdString().c_str());
QSqlQuery query(*m_db);
query.prepare(QString("PRAGMA %1").arg(state));
query.exec();
if(0 == query.size())
printf("%s returns nothing\n", state.toStdString().c_str());
else
if(query.next())
QVariant value = query.value(0);
if(value.canConvert(QMetaType::QString))
printf("\"%s\"\n", value.toString().toStdString().c_str());
else
printf("[UnknownDataType]\n");
else
printf("[NoResult]\n");
query.finish();
PrintState("application_id");
PrintState("auto_vacuum");
PrintState("automatic_index");
PrintState("busy_timeout");
PrintState("cache_size");
PrintState("cache_spill");
PrintState("case_sensitive_like");
【问题讨论】:
SELECT sqlite_version()
的结果是什么?
sqlite> 选择 sqlite_version(); ---> 3.8.4.3
在 Qt 中,而不是在 shell 中。
Qt 带来 Version = 3.7.17。
【参考方案1】:
您在 Qt 程序中实际使用的 SQLite 版本尚未实现 PRAGMA cache_spill
。
SQLite 只是忽略它无法识别的任何 PRAGMA。
作为documented,PRAGMA case_sensitive_like
不允许读取当前值。
【讨论】:
【参考方案2】:首先,query.size()
测试毫无用处,因为它为每个值返回-1
。 query.size()
只能与 SELECT
查询一起使用。
现在[NoResult]
可以有两种不同的含义:
-
pragma 值不存在
编译指示值为
Not Set
在从另一个程序创建的示例数据库中,我观察到cache_spill
的第一种情况和case_sensitive_like
的第二种情况。您可能需要使用 sqliteman on Ubuntu 检查值。
【讨论】:
@Th.Thielemann 此设置仅适用于当前连接,不适用于数据库文件。【参考方案3】:我至少找到了 cache_spill 的解决方案: 使用的 sqlite3.exe 支持 pragma cache_spill 但不支持 Qt 5.2 附带的 sqlite 版本。 (3.7.17). Qt 5.3 附带 Sqlite 3.8.4.3 - git repro 这么说。
【讨论】:
以上是关于不要通过 QSqlQuery 获得所有 sqlite pragma 的结果的主要内容,如果未能解决你的问题,请参考以下文章
QSqlDatabase Transactions、QSqlQuery Creation 和 QSqlQuery 完成