Qt - ODBC连接SQL SERVER

时间:2021-10-02 21:53:34

QT提供了对多种数据库的访问支持,对SQL Server也可以通过ODBC来进行访问。
要想顺利访问SQL Server。 首先要保证以下几点:
1. QT编译时已经编译了QtSql
2. 编译了ODBC插件。可以通过 configure -plugin-sql-odbc来保证,也可以单独编译~\src\plugins\sqldrivers\odbc
qmake -t vclib odbc.pro
qmake
nmake
编译后,在~\plugins\sqldrivers\下应该有qsqlodbcd4.dll(debug)或qsqlodbc4.dll


QT中数据库测试

下面的这段测试代码非常有用,可以检测自己的QT支持哪些数据

int main(int argc, char* argv[]) 

QApplication app(argc, argv);  

qDebug() << "Available drivers:";  

QStringList drivers = QSqlDatabase::drivers();  

foreach(QString driver, drivers)  

qDebug() << "\t" << driver;  



3. 要连接数据库,有3种方式:
参考下面的连接:QT连接ODBC数据库
要注意的就是连接数据库时使用的数据库名,和sqlite等是不同的,并不是直接写入数据库名称。
而是DSN名。 
如果你已经设置好了DSN,可以直接输入DSN名。 如果没有,可以采用DSN连接字符串直接连接ODBC数据库。

例如:
//下面例子连接到10.0.0.2上的sql server名为temp的数据库上。 程序中指定此连接的名称为dbTemp
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "dbTemp");
db.setHostName("10.0.0.2"); //如果dsn中已经含有SERVER,可以省略此句
QString dsn = QString::fromLocal8Bit("DRIVER={SQL SERVER};SERVER=10.0.0.2;DATABASE=temp");
//如果已经设定DSN,可以写为QString::fromLocal8Bit("SQLSERVER_DSN")
db.setDatabaseName(dsn);
//即使dsn中已经设置了UID和PASSWD,仍然需要执行setUserName和setPassword的步骤
db.setUserName("sa"); 
db.setPassword("xxxxxx");

if(!db.open()) {
        QMessageBox::critical(0, QObject::tr("Database Error"),
            db.lastError().text());
        return false;
}
return true;


如果dsn名设错,将会在db.open()时出现“[Microsoft][ODBC Driver ManagerData source name not found and no default driver specified QODBC3Unable to connect
“[Microsoft][ODBC 驱动程序管理器未发现数据源名称并且未指定默认驱动程序 QODBC3:Unable to connect”错误。
其他类型数据库应该修改dsn字符串与其相适应:
下面是ODBC和OLEDB的连接字符串写法:

ODBC连接

适合数据库类型 连接方式
access   "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"

dBase   "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"

oracle   "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"

MSSQL server   "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"

MS text   "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"

Visual Foxpro   "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"

MySQL   "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"

SQLite  "Driver={SQLite3 ODBC Driver};Database=D:\SQLite\*.db"
PostgreSQL  "Driver={PostgreSQL ANSI};server=127.0.0.1;uid=admin;pwd=pass;database=databaseName"

OLEDB连接

适合的数据库类型 连接方式
access   "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"

oracle   "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"

MS SQL Server   "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"

MS text   "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties'text;FMT=Delimited'"

--------------------------------------------------

编译的时候加上posgresql的编译选项就可以了
configure -release -qt-sql-qpsql -L c:\pg\lib -I c:\pg\头


-----------------------------------------------------

0     假设你已经编译安装好了Qt开发环境并可正常使用(假设用的是VS2008+ QtVisualStudioIntegrationv1.43for.VS.2003.2005)一切操作均在windows下进行。
1           安装MySQL
下载MySQL安装程序,安装时选择Custom方式,选择安装目录,目录最好不要有空格,不要有中文,选择安装includelib文件。其它的就没什么了。Sqlyog是一个MySQL的图形界面管理工具,可以安装上,方便数据库操作。
2           将安装好的MySQL目录下的include文件夹里的文件(头文件)复制到编译工具的include文件夹下,再将MySQL目录下的lib\opt里的文件复制到编译工具的lib文件夹下,简而言之就是要让编译器能找到MySQL里相应的文件。(该路径也可在生成工程文件时添加给qmake
3       打开VS2008 命令提示符,将目录切换到Qt\src\plugins\sqldrivers\mysql\,运行qmake
完了在运行nmake。不出错的话MySQL的驱动就编好了。用如下代码进行驱动测试:(这段程序编译完之后不是运行,是调试,不然测试信息出不来)
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include <QMessageBox>
#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("QMYSQL");
         qDebug() << "MYSQL driver valid?" << db.isValid();
}
测试结果如下图:
Qt - ODBC连接SQL SERVER
4           MySQL里创建库,创建库时数据库字符集选择gbk编码,创建数据库名为test,单表,表名为testTable,表内属性为name  varchar ;(方便理解代码)
5       用如下代码测试连接数据库并测试写入、读出数据是否成功,并测试数据是否乱码。
#include <QtGui>
#include <QtSql>
#include <QTableView>
#include <QString>
#include <QObject>
int main(int argc, char **argv)
{
         QApplication app(argc, argv);
         QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk")); //设置tr()编码。
         QSqlQueryModel *model;
         QTableView *table=new QTableView;
         QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
         db.setHostName("localhost");   //数据库服务器
         db.setDatabaseName("test");   //数据库名
         db.setUserName("root");      //登录名
         db.setPassword("123456");    //密码
         if(db.open())
         {
                   QMessageBox::information(0,QObject::tr("信息"),
QObject::tr("数据库连接成功"));
                   QSqlQuery query;
                   query.exec(QObject::tr("INSERT INTO bbb VALUES ('柯南')"));
query.exec("SELECT name FROM testTable");//name为属性名;
                                                                                             //testTable为表名
                   model=new QSqlQueryModel;
                   model->setQuery(query);
                   model->setHeaderData(0, Qt::Horizontal, QObject::tr("姓名"));
                   table->setModel(model);
                   table->show();
         }
         else
         {
                   // 数据库打开失败,显示数据库返回的失败信息
                   QMessageBox::critical(0,QObject::tr("出错"),db.lastError().text());
         }
         QApplication::connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));
         return app.exec();
}
运行结果如下图:
Qt - ODBC连接SQL SERVER

--------------------------------------------------------


QUOTE:
Qt4 OpenSource for mingw中编译MySQL驱动

mingw-utils包下载:http://www.qtcn.org/download/mingw-utils-0.3.tar.gz

在Qt4的文档中在Windows下关于怎样编译mysql的驱动上面说

You need to get the MySQL installation files. Run SETUP.EXE and choose "Custom Install". Install the "Libs & Include Files" Module. Build the plugin as follows (here it is assumed that MySQL is installed in C:\MYSQL):
   cd %QTDIR%\src\plugins\sqldrivers\mysql
   qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.LIB" mysql.pro
   nmake
If you are not using a Microsoft compiler, replace nmake with make in the line above.
这就是一个容易搞混的地方,上面是使用的libmysql.lib和nmake来编译的,如果使用的是msvc的编译器,那上面是没问题的,但是如果使用的是mingw编译器,那就会出错,有undefined reference....等类错误字样。这是因为mingw使用的库和msvc使用的不同格式的库而引起的。而mysql只提供了msvc可使用的库。 qt4 for mingw要想编译出qsqlmysql库来,我们先得编译出mingw需要的libmysql.a这个文件来,可使用mingw工具来生成。
mingw -utils包里的reimp命令(如果没有这个命令的话,可从本帖开头处给出的地址中下载这个文件,并把它解压开后的bin目录里的内容拷贝到 mingw的bin目录下面。mysql安装的时候默认的安装路径中有空格,我们得先把它的include和lib目录拷贝到没有空格的路径下,比如C: \mysql下)

cd c:\mysql\lib\opt
reimp -d libmysql.lib
dlltool -k -d libmysql.def -l libmysql.a
如此,这样我们的命令行为(注意qmake和make):

   cd %QTDIR%\src\plugins\sqldrivers\mysql
   qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro
   make
这下便会在%QTDIR%\plugins\sqldrivers目录下面生成libqsqlmysql.a, qsqlmysql.dll这两个文件了。
       有一点, 就是下载他给出的mingw-utils-0.3.tar.gz 文件, 只需要把里面的 reimp 工具复制到你的 minGW目录下的bin 里就可以了,这样按上面的步骤就可以生成需要的驱动了。 make 结束后, 库文件会生成到qt的系统目录中去。
-----------------------
           以上办法一般都是可行的,如果还有问题的话,再参考下面这个,将环境变量的lib和include设为空:
出现错误的话:
mingw32-make -f Makefile.Release
   Makefile.Release:104: *** multiple target patterns.   Stop.
   mingw32-make[1]: Entering directory `D:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
   mingw32-make[1]: Leaving directory `D:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
   mingw32-make: *** [release] Error 2
解决:
set lib=
set include=
---------
即设置lib和include为空。否则会在makefile里加上很多qt库需要的无用的头文件,如果你原来lib和include不为空。
参考:http://www.qtcentre.org/forum/f-installation-5/t-did-you-try-qt-43-opensource-on-winxp--7428.html