2010-02-23 69 views
14

我正在考虑使用SQLite作为我写的C++应用程序的后端数据库。我已经阅读了奇趣科技网站和sqlite上的相关文档,但是这些信息看起来有些不一致,没有简单的代码片断显示完整的CRUD示例。与Qt一起使用SQLite

我想编写一套帮助函数,以允许我从我的应用程序轻松地在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查询已经完成

澄清的问题 - 我忘了感谢您指出了这一点汤姆

回答

16

默认情况下,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); 
... 
+0

我发现你也可以clall的exec()直接在QSqlDatabase对象,执行查询。当然,这只能在未运行预备语句时使用。仍在阅读准备好的报表.. – 2010-02-23 16:37:51

+2

准备好的报表如何...? – 2010-02-24 21:28:41