Qt 连接数据库

来源:互联网 发布:java读写文件内容 编辑:程序博客网 时间:2024/05/17 03:47


QT提供了对多种数据库的访问支持,对SQL Server也可以通过ODBC来进行访问。
要想顺利访问SQL Server。 首先要保证以下几点:
1. QT编译时已经编译了QtSql
2. 编译了ODBC插件。


此时,可以用下面的程序,测试一下你的QT目前支持哪些数据库访问。
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include <QDebug>

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    
    qDebug() << "Available drivers:";
    QStringList drivers = QSqlDatabase::drivers();
    foreach(QString driver, drivers) 
        qDebug() << "/t" << driver;
    
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    qDebug() << "ODBC driver valid?" << db.isValid();
}

如果输出中有
Available drivers: 
"QSQLITE" 
"QODBC4" 
"QODBC" 
ODBC driver valid? true
就说明已经可以成功支持ODBC了。


(一)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. MS-SQLserver 链接字符串具有如下形式: 
    "Driver={sql server};server=192.168.1.2;database=..;uid=sa;pwd=.."

  2. QString strDatabaseName = QString("DRIVER={SQL Server};Server=(%1);Database=%2").arg("local").arg(sDatabaseName);      
  3. db=QSqlDatabase::addDatabase("QODBC","db"); // 使用odbc数据库驱动   
  4. db.setHostName(sHostName);  
  5. db.setPort(1433);  
  6. db.setDatabaseName(strDatabaseName); // 我们之前建立的数据库连接关键字  
  7. db.setUserName(sUserName);   
  8. db.setPassword(sPassword);   
  9. bool ok = db.open(); //尝试连接数据库  
  10. if(ok)  
  11. {   
  12. menuset_set->dbdb=db;   // 这里用sa已经成功连上数据库     
  13. return 0;  
  14. }  
  15. else  
  16. {   
  17. // 打开数据库失败,  
  18. QMessageBox::critical(0, QObject::tr("数据库连接错误!"),db.lastError().text());  
  19. return -2;  
  20. }          
  21. mssql2000数据库连接的使用和Access连接使用方法一样。  
  22. QSqlQuery mquery=QSqlQuery::QSqlQuery(db);     
  23. bool ok1=mquery.exec("select * from CarteMenu;");  
  24. if (ok1==false)return -1;  
  25. QString menu_mkey=mquery.value(13).toString();  
  26. QString strmenu_lang=mquery.value(3).toString();  
  27. //清除结果集  
  28. 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. {  

//本人实际编译运行过的代码如下:#include <QtCore/QCoreApplication>#include <QtSql>#include <QStringList>#include <QDebug>int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    qDebug() << "Available drivers:"; //测试QT系统当前安装的驱动//    QStringList drivers = QSqlDatabase::drivers();//    foreach(QString driver, drivers)//    qDebug() << "\t" << driver;//    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");//    qDebug() << "ODBC driver valid?" << db.isValid();    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");    //连接方式1    //QString dsn = QString::fromLocal8Bit("DRIVER={SQL SERVER};SERVER=192.168.1.2;DATABASE=zfgtest1");    //db.setDatabaseName(dsn);    //db.setUserName("sa");   // db.setPassword("");  //连接方式2      QString dsn = "Driver={sql server};server=192.168.1.2;database=zfgtest1;uid=sa;pwd=";       db.setDatabaseName(dsn);           if(!db.open())         qDebug() << db.lastError().text();    else        qDebug() << "Database OK!";        return a.exec();}

上面是附本人计算机连接实际代码 本机IP地址 192.168.1.2  SQL SERVER服务器上有一个数据库名为zfgtest1  数据库管理员账号uid 口令为空

 

三、默认连接

     QSqlDatabase also supports the concept of a defaultconnection, which is the unnamed connection. To create the default connection, don't pass the connection name argument when you call addDatabase(). Subsequently, when you call any static member function that takes the connection name argument, if you don't pass the connection name argument, the default connection is assumed. The following snippet shows how to create and open a default connection to a PostgreSQL database: 

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");  //无连接名</span>QString dsn = "Driver={sql server};server=192.168.1.2;database=zfgtest1;uid=sa;pwd=";//数据库无密码  db.setDatabaseName(dsn);   if(db.open()){      QSqlTableModel *model== new QSqlTableModel(this);//model关联到默认连接    model->setTable("zongfg");}


 


小结:QT数据库连接实例的内容介绍完了,对于数据库,本人觉得连接时要慎重点,好像很难连接似得,老是出错,不顾本篇文章相信能帮你解决问题。


0 0
原创粉丝点击