上一節從網路上找了一個一般的樣本給大家,下面將逐步修改代碼將其變為常規開發中可用的可複用代碼。
首先說下上面的代碼在本人實際使用過程中遇到的問題及如何結果
1、建立程式後提示“QSqlDatabase: No such file or directory” 的錯誤
2、大部分的執行個體中直接通過在main函式宣告QSqlDatabase dbconn=QSqlDatabase::addDatabase("QSQLITE")來添加資料庫,建立的QSqlDatabase對象的範圍有問題,即在其他的函數或這類對象中使用此局部對象的問題,
還有就是在其他非dbconn範圍函數中在debug調試版本中可以通過QSqlQuery得到結果,但是在非debug調試版本中無法擷取到結果
3、在使用QSqlQuery的時候直接通過如下方式使用
{..... QSqlQuery query; query.exec("create table student(id varchar,name varchar)"); .....}
首先說明這條語句可以執行的前提是在同一個函數中(前面樣本中為main函數),且聲明的QSqlDatabase對象在同一個範圍中;
如果在其他非QSqlDatabase對象的函數或範圍中的時候在debug的調試狀態下可以得到QSqlQuery 的執行結果,但是在非debug調試狀態下將得不到所要的結果(如通過QSqlQuery 執行select語句)
4、使用QSqlQuery 沒有任何參數的對象,運行exec函數的時候如何尋找我要執行那個資料庫的sql語句?
針對以上的問題,可以有以下的解決方案
1、可以通過在工程的pro檔案添加QT += sql 使工程(或lib)支援資料庫的操作
2、可以通過如下代碼方式建立一個QSqlDatabase的指標,然後將指標儲存在類中,這樣就可以解決範圍的問題,
QSqlDatabase * m_sqliteDB= new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", "dataSqlite"));
為了防止QSqlQuery查詢不到結果,最好是建立資料庫的時候指定連結名(connectionName),就是上面代碼的第二個參數。
3、在使用了2的解決方案後,其實3也就容易解決了,在聲明QSqlQuery的時候加上QSqlDatabase 參數,代碼如下
QSqlQuery query(*m_sqliteDB);
其中m_sqliteDB是通過2的方案中建立的指標的解引用。
然後再調用 query的exec函數執行代碼即可。
4、當使用3的解決方案後,這時也就不存在說因為在不同的函數中使用QSqlQuery 無參數對象是,直接調用其exec函數的時候迷惑為什麼沒有說明是使用哪一個資料庫的問題了。