2010-02-23 67 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