不要通过 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() 测试毫无用处,因为它为每个值返回-1query.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 的结果的主要内容,如果未能解决你的问题,请参考以下文章

Python与sqlit数据库--简单介绍

QT数据库操作

QSqlDatabase Transactions、QSqlQuery Creation 和 QSqlQuery 完成

WinForm杂记:C#操作SQLite数据库(总结)

不要在我的 ios 应用程序中获得所有 facebook 的朋友?

qt : QSqlQuery 返回 QVariant 的向量