【问题标题】:Do not get result for all sqlite pragmas via QSqlQuery不要通过 QSqlQuery 获得所有 sqlite pragma 的结果
【发布时间】: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。

标签: linux windows qt sqlite qsqlquery


【解决方案1】:

您在 Qt 程序中实际使用的 SQLite 版本尚未实现 PRAGMA cache_spill

SQLite 只是忽略它无法识别的任何 PRAGMA。

作为documentedPRAGMA case_sensitive_like不允许读取当前值。

【讨论】:

    【解决方案2】:

    首先,query.size() 测试毫无用处,因为它为每个值返回-1query.size() 只能与 SELECT 查询一起使用。

    现在[NoResult]可以有两种不同的含义:

    1. pragma 值不存在
    2. 编译指示值为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 这么说。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多