【问题标题】:Using SQLite with Qt在 Qt 中使用 SQLite
【发布时间】:2011-01-20 03:05:36
【问题描述】:

我正在考虑使用 SQLite 作为我正在编写的 C++ 应用程序的后端数据库。我已经阅读了 trolltech 网站和 sqlite 上的相关文档,但信息似乎有点脱节,没有简单的 sn-p 显示完整的 CRUD 示例。

我想编写一组辅助函数,让我可以从我的应用程序中轻松地在 SQLite 中执行 CRUD 操作。

以下 smippet 是我设想编写的辅助函数的伪代码。对于如何“填充”存根函数的建议,我将不胜感激。特别令人沮丧的一件事是,在任何文档中都没有明确提及查询与运行查询的数据库之间的关系——因此暗示了某种默认连接/表。

在我的应用程序中,我需要能够显式指定运行查询的数据库,因此如果有任何答案说明如何显式指定查询(或其他数据库操作)中涉及的数据库/表,这将很有用就此而言)。

我的伪代码如下:

#include <boost/shared_ptr.hh>

typedef boost::shared_ptr<QSqlDatabase> dbPtr;


dbPtr createConnection(const QString& conn_type = "QSQLITE", const QString& dbname = ":memory:")
{
    dbPtr db (new QSQlDatabase::QSqlDatabase());

    if (db.get())
    {
        db->addDatabase(conn_type);
        db->setDatabaseName(dbname);

        if (!db.get()->open)
            db.reset();
    }

    return db;
}

bool runQuery(const Qstring& sql)
{
    //How does SQLite know which database to run this SQL statement against ?
    //How to iterate over the results of the run query?
}

bool runPreparedStmtQuery(const QString query_name, const QString& params)
{
    //How does SQLite know which database to run this SQL statement against ?
    //How do I pass parameters (say a comma delimited list to a prepared statement ?
    //How to iterate over the results of the run query?
}

bool doBulkInsertWithTran(const Qstring& tablename, const MyDataRows& rows)
{
    //How does SQLite know which database to run this SQL statement against ?
    //How to start/commit|rollback
}

如果我的问题不清楚,我想问的是实现上述每个功能的正确方法是什么(可能除了第一个功能之外 - 当然,除非它可以更好)。

[编辑]

通过删除明确指定表的要求来澄清问题(这已经在 SQL 查询中完成 - 我忘记了。感谢 Tom 指出这一点

【问题讨论】:

    标签: c++ qt sqlite qtsql


    【解决方案1】:

    默认情况下,Qt 使用应用程序的默认数据库来运行查询。那是使用默认连接名称添加的数据库。请参阅Qt documentation 了解更多信息。我不确定您所说的默认数据库表是什么意思,因为要操作的表通常在查询本身中指定?

    为了回答您的问题,这里是您的一种方法的实现。请注意,我不会返回 bool,而是返回 QSqlQuery 实例,以便能够迭代查询的结果。

    QSqlQuery runQuery(const Qstring& sql)
    {
        // Implicitly uses the database that was added using QSqlDatabase::addDatabase()
        // using the default connection name.
        QSqlQuery query(sql);
        query.exec();
        return query;
    }
    

    您可以按如下方式使用它:

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("localhost");
    db.setDatabaseName("data.db");
    if (!db.open())
    {
      raise ...
    }
    
    QSqlQuery query = runQuery("SELECT * FROM user;");
    while (query.next())
    {
      ...
    }
    

    请注意,还可以通过显式指定相关的QSqlDatabase 实例作为QSqlQuery 构造函数的第二个参数来显式指定应针对哪个数据库运行查询:

    QSqlDatabase myDb;
    ...
    QSqlQuery query = QSqlQuery("SELECT * FROM user;", myDb);
    ...
    

    【讨论】:

    • 我发现你也可以直接在 QSqlDatabase 对象上调用 exec() 来执行查询。当然,这只能在不运行准备好的语句时使用。仍在阅读准备好的陈述..
    • 准备好的语句怎么样...?
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2011-09-11
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多