使用SQLite与Qt

15

我正考虑将SQLite作为我正在编写的C++应用程序的后端数据库。我已经阅读了Trolltech网站和SQLite的相关文档,但是信息似乎有点分散,没有简单的代码片段显示完整的CRUD示例。

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

以下是我设想要编写的辅助函数的伪代码。我将感激有关如何“填充”存根函数的建议。特别令人沮丧的是,在任何文档中都没有清楚地提到查询与运行查询的数据库之间的关系-因此暗示着某种默认连接/表。

在我的应用程序中,我需要能够明确指定查询运行的数据库,因此如果有任何答案可以说明如何明确指定查询(或其他数据库操作)涉及的数据库/表,那将非常有用。

我的伪代码如下:

#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指出)。
1个回答

18

默认情况下,Qt 使用应用程序的默认数据库来执行查询。这就是使用默认连接名称添加的数据库。有关更多信息,请参见Qt文档。我不确定你指的默认数据库表是什么意思,因为通常在查询本身中指定要操作的表格?

为了回答你的问题,这里提供了一个方法的实现。请注意,我会返回一个 QSqlQuery 实例而不是一个 bool,以便能够遍历查询结果。

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())
{
  ...
}

注意,你也可以通过在QSqlQuery构造函数的第二个参数中显式指定相关的QSqlDatabase实例,来明确指定查询应该在哪个数据库上运行:

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

我发现你也可以直接在QSqlDatabase对象上调用exec()来执行查询。当然,这只能在不运行预处理语句时使用。仍在阅读有关预处理语句的内容... - Stick it to THE MAN
2
准备好的语句怎么样? - Stick it to THE MAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接