標籤:資料庫 sqlite qt
QT SQLite 多資料庫操作大全一.單資料庫模型
一般QT都是把開啟一個預設資料庫連接,操作一個資料庫連接,但是對Sqlite中頻率修改容易加鎖,因此有一種設計模式是把頻率修改的表放在不同的資料庫檔案中,但這樣要修改代碼操作資料庫部分
通常開啟代碼 http://developer.nokia.com/community/wiki/Creating_an_SQLite_database_in_Qt
bool DatabaseManager::openDB() { // Find QSLite driver db = QSqlDatabase::addDatabase("QSQLITE"); #ifdef Q_OS_LINUX // NOTE: We have to store database file into user home folder in Linux QString path(QDir::home().path()); path.append(QDir::separator()).append("my.db.sqlite"); path = QDir::toNativeSeparators(path); db.setDatabaseName(path); #else // NOTE: File exists in the application private folder, in Symbian Qt implementation db.setDatabaseName("my.db.sqlite"); #endif // Open databasee return db.open(); }QSqlError DatabaseManager::lastError() { // If opening database has failed user can ask // error description by QSqlError::text() return db.lastError(); }bool DatabaseManager::deleteDB() { // Close database db.close(); #ifdef Q_OS_LINUX // NOTE: We have to store database file into user home folder in Linux QString path(QDir::home().path()); path.append(QDir::separator()).append("my.db.sqlite"); path = QDir::toNativeSeparators(path); return QFile::remove(path); #else // Remove created database binary file return QFile::remove("my.db.sqlite"); #endif }
這是最關鍵是兩步
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”); #開啟資料庫
db.setDatabaseName(“my.db.sqlite”); #指定資料庫檔案
但是重複調用QSqlDatabase::addDatabase(“QSQLITE”); 時會報錯
QSqlDatabasePrivate::addDatabase: duplicate connection name ‘qt_sql_default_connection’, old connection removed.
二.同時開啟多個資料庫
QT本身是支援,只一般寫法用得少。成功的代碼如下,一般需要一個全域數組來儲存這些對象
QString dbName = "base.db" QSqlDatabase db ; if(QSqlDatabase::contains(dbName)){ //如已經開啟這個資料庫,直接調出這個資料連線 db = QSqlDatabase::database(dbName); }else //否則開啟這個資料庫,注意帶上資料庫名 db = QSqlDatabase::addDatabase("QSQLITE",dbName);
三.相關資料庫的類調用
因為引入多資料庫,相應類調用都要引入資料庫連接對象。
3.1 QSqlQuery
SQL 查詢類,可以執行各種Sql指令。預設使用方法是
QSqlQuery query(); query.exec("select * from table1");
但這種情況,在多資料庫模式會報錯,提示,>QSqlQuery::exec: database not open
其實這是調用預設的資料連線又未開啟這個造成,可以在初始化是直接資料庫物件
QSqlDatabase db ; //已經開啟資料庫物件 QSqlQuery query(db); query.exec("select * from table1");
3.2 QSqlQueryModel 類
這個也是常用的類,與各種控制項配合相當好用,
它的指定資料庫連接言式是在調用setQuery時,
QSqlDatabase db ; //已經開啟資料庫物件QSqlQueryModel * sqlModel = new QSqlQueryModel(); sqlModel->setQuery("select * from table",db);
QT SQLite 多資料庫操作大全