0

我想使用 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"
automatic_index = "1"
busy_timeout = "5000"
cache_size = "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");
4

3 回答 3

0

我为 cache_spill 找到了至少解决方案:使用的 sqlite3.exe 支持 pragma cache_spill 但不是 Qt 5.2 附带的 sqlite 版本。(3.7.17)。
Qt 5.3 附带 Sqlite 3.8.4.3 - git repro 这么说。

于 2014-05-09T11:15:30.170 回答
0

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

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

文件所述,PRAGMA case_sensitive_like不允许读取当前值。

于 2014-05-09T11:06:47.720 回答
0

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

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

  1. pragma 值不存在
  2. 一个 pragma 值为Not Set

在从另一个程序创建的示例数据库中,我观察了第一种情况 forcache_spill和第二种情况case_sensitive_like. 您可能想在 Ubuntu 上使用 sqliteman检查值。

于 2014-05-08T18:47:01.027 回答