天天看點

QT中操作資料庫(ACCESS、MySql)

 (一)QODBC資料庫程式設計連接配接詳細介紹

       QT QODBC資料庫程式設計連接配接詳細介紹是本文所介紹的内容,QT為資料庫程式設計提供了一個類似JDBC的統一操作模型,它的底層是具體資料庫或資料庫接口的插件,由它們負責完成真正的資料庫操作。

QT自帶有QODBC Driver,在Windows平台上通過系統提供的ODBC Driver可以通路支援ODBC的資料庫,如Ms Access、SQL Server等 (Windows XP 自帶有Access和SQL Server的ODBC Driver)。

QT資料庫模型的基礎類是QSqlDatabase對象,擁有一個QSqlDatabase對象代表着擁有一個資料庫的連接配接,在一個已經Open的QSqlDatabase對象上,我們就可以執行各種資料庫操作。

要得到一個QSqlDatabase對象的方法是QSqlDatabase的靜态函數addDatabase,它建立一個新的QSqlDatabase對象,并注冊在内部的Hash表中,最後傳回該對象。 (另外靜态函數database可用于查詢一個已經注冊的QSqlDatabase對象)

當我們得到一個新的還沒有Open的QSqlDatabase對象,我們要先設定資料庫的DSN(Data Source Name),DSN的設定是通過成員函數setDatabaseName,在QODBC中,DSN可以是多種形式

1、作業系統注冊的DSN名字

2、一個外部的DSN檔案

3、可以被解釋的字元串

1和2我們可以在管理面闆的ODBC管理面闆裡面設定或者生成,但是無疑第3種形式更具備靈活性,連接配接Access的DSN字元串具備類似的形式:

  1. "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=xxx.mdb" 

下面是一段用于獲得某個指定的mdb檔案的資料庫連接配接的代碼,函數會先檢測是否系統已有該檔案的資料庫連接配接,如果有則再檢查該連接配接是否已打開,如果已打開則直接傳回,如果有連接配接但處于關閉狀态中則打開後傳回,如果還未有任何連接配接則建立一個新的連接配接,打開後傳回。最後打開失敗會抛出一個KDBException異常。

  1. QSqlDatabase KDBConnection::getAccessConnection(  
  2.     const QString& accessFile, const QString& userName,  
  3.     const QString& password)  
  4. ...{  
  5.     const QString PREFIX("puremilk.access.connection");  
  6.     QString connID = PREFIX + "-" + accessFile;  
  7.     QSqlDatabase connection = QSqlDatabase::database(connID, false);  
  8.     if (connection.isValid())  
  9.     ...{  
  10.         if (connection.isOpen())  
  11.             return connection;  
  12.     }  
  13.     else  
  14.         connection = QSqlDatabase::addDatabase("QODBC", connID);  
  15.     QString dsn = QString(  
  16.         "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=%1").arg(accessFile);  
  17.     qDebug()<<"Get Access Database connection - "<<dsn;  
  18.     connection.setDatabaseName(dsn);  
  19.     if (!connection.open(userName, password))  
  20.     ...{  
  21.         THROW_EXCEPTION(KDBException, connection.lastError().text());  
  22.     }  
  23.     return connection;  

小結:QT QODBC資料庫程式設計連接配接詳細介紹的内容介紹完了,希望本文對你有幫助,關于資料庫的更多内容請參考編輯推薦。

(二)QT與資料庫連接配接執行個體(!!!)

本文介紹的是QT與資料庫連接配接執行個體,首先加載驅動db=QSqlDatabase::addDatabase("QODBC","db"); // 使用odbc資料庫驅動,詳細内容請看下文。

連接配接資料庫需要的頭檔案:

  1. #include <QSqlDatabase> 
  2. #include <QSqlQuery> 

1、連接配接微軟的Access

  1. QSqlDatabase ldb = QSqlDatabase::addDatabase("QODBC");  
  2. ldb.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=system.mdb;UID=;PWD=xiaozhuset");  
  3. bool ok = ldb.open();  
  4. //新定義一個查詢集合,并指定 連結關鍵字。 如果有多個連接配接,可以随意指定一個你需要的。  
  5. QSqlQuery mquery=QSqlQuery::QSqlQuery(ldb);          
  6. if(ok)  
  7. {  
  8. bool isok=mquery.exec("select * from sql_set;");  
  9. if (!isok)  
  10. {  
  11. ldb.close();  
  12. return -1;  
  13. }         
  14. //這個是必須的,因為查處的結果集目前位置不在第一條記錄上。  
  15. mquery.next();  
  16. QString sHostName=mquery.value(1).toString();  
  17. QString sDatabaseName=mquery.value(2).toString();  
  18. QString sUserName=mquery.value(3).toString();  
  19. QString sPassword=mquery.value(4).toString();  
  20. //清除結果集  
  21. mquery.clear();  
  22. // 如果該連接配接不再使用,就可以關閉。  
  23. ldb.close();  
  24. //這裡是将從資料庫讀出的資料寫到一個list控件裡  
  25. ui.list_out->insertItem(ui.list_out->count(),sHostName);  
  26. ui.list_out->insertItem(ui.list_out->count(),sDatabaseName);      
  27. }  
  28. else  
  29. {   
  30. // 打開本地資料庫失敗,  
  31. QMessageBox::critical(0, QObject::tr("讀取Access資料庫錯誤!"),db.lastError().text());  
  32. return -1;  
  33. }     

2、連接配接mssql2000 資料庫

  1. QString strDatabaseName = QString("DRIVER={SQL Server};Server=(%1);Database=%2").arg("local").arg(sDatabaseName);      
  2. db=QSqlDatabase::addDatabase("QODBC","db"); // 使用odbc資料庫驅動   
  3. db.setHostName(sHostName);  
  4. db.setPort(1433);  
  5. db.setDatabaseName(strDatabaseName); // 我們之前建立的資料庫連接配接關鍵字  
  6. db.setUserName(sUserName);   
  7. db.setPassword(sPassword);   
  8. bool ok = db.open(); //嘗試連接配接資料庫  
  9. if(ok)  
  10. {   
  11. menuset_set->dbdb=db;   // 這裡用sa已經成功連上資料庫     
  12. return 0;  
  13. }  
  14. else  
  15. {   
  16. // 打開資料庫失敗,  
  17. QMessageBox::critical(0, QObject::tr("資料庫連接配接錯誤!"),db.lastError().text());  
  18. return -2;  
  19. }          
  20. mssql2000資料庫連接配接的使用和Access連接配接使用方法一樣。  
  21. QSqlQuery mquery=QSqlQuery::QSqlQuery(db);     
  22. bool ok1=mquery.exec("select * from CarteMenu;");  
  23. if (ok1==false)return -1;  
  24. QString menu_mkey=mquery.value(13).toString();  
  25. QString strmenu_lang=mquery.value(3).toString();  
  26. //清除結果集  
  27. mquery.clear(); 

3、連接配接mysql 資料庫

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql資料庫驅動   
  2. db.setHostName("localhost");  
  3. db.setDatabaseName("exampledb"); // 資料庫名稱  
  4. db.setUserName("sa"); // 使用者名  
  5. db.setPassword("1"); // 密碼  
  6. bool ok = db.open(); // 嘗試連接配接資料庫  
  7. if(ok)  
  8. {   
  9. QSqlQuery myquery;   
  10. if(myquery.exec("select * from employeedb"))  
  11. {   
  12. int num = 0;   
  13. if(db.driver()->hasFeature(QSqlDriver::QuerySize))  
  14. {  
  15. num = myquery.size(); // 如果支援結果影響的行數,那麼直接記錄下來  
  16. }  
  17. else  
  18. {  
  19. myquery.last(); //否則定位到結果最後  
  20. num = myquery.at() + 1;  
  21. }  
  22. //這裡添加資料庫的查詢結果處理操作  
  23. }   
  24. else // 如果查詢失敗  
  25. {   
  26. QSqlError error = myquery.lastError();  
  27. }  
  28. }  
  29. else // 打開資料庫失敗  
  30. {  

小結:QT與資料庫連接配接執行個體的内容介紹完了,對于資料庫,本人覺得連接配接時要慎重點,好像很難連接配接似得,老是出錯,不顧本篇文章相信能幫你解決問題。