不要通过QSqlQuery获取所有sqlite pragmas的结果



我想使用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 nothingn", 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");

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

SQLite忽略任何它不能识别的PRAGMA。

如文档所述,PRAGMA case_sensitive_like不允许读取当前值

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

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

  1. 编译值不存在
  2. 编译值为Not Set

在从另一个程序创建的示例数据库中,我观察到第一种情况是cache_spill,第二种情况是case_sensitive_like。你可能想在Ubuntu上使用sqliteman检查这些值

我找到了解决方案,至少对cache_spill:使用的sqlite3.exe支持pragma cache_spill,但Qt 5.2附带的sqlite版本不支持。(3.7.17)。
Qt 5.3附带Sqlite 3.8.4.3——git版本说明了这一点。

相关内容

  • 没有找到相关文章

最新更新