QT中操作数据库(ACCESS、MySql)

时间:2022-06-13 07:31:58
(一)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.  
  9.     if (connection.isValid())  
  10.     ...{  
  11.         if (connection.isOpen())  
  12.             return connection;  
  13.     }  
  14.     else  
  15.         connection = QSqlDatabase::addDatabase("QODBC", connID);  
  16.     QString dsn = QString(  
  17.         "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=%1").arg(accessFile);  
  18.     qDebug()<<"Get Access Database connection - "<<dsn;  
  19.     connection.setDatabaseName(dsn);  
  20.  
  21.     if (!connection.open(userName, password))  
  22.     ...{  
  23.         THROW_EXCEPTION(KDBException, connection.lastError().text());  
  24.     }  
  25.     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数据库连接实例的内容介绍完了,对于数据库,本人觉得连接时要慎重点,好像很难连接似得,老是出错,不顾本篇文章相信能帮你解决问题。