Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1680647
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: WINDOWS

2011-04-08 15:52:46

摘自:http://no001.blog.51cto.com/1142339/301025
QT连接SQL Server(ODBC)
2009-03-23 14:22
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目前支持哪些数据库访问。

#include
#include
#include
#include

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了。
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 Manager] Data source name not found and no default driver specified QODBC3: Unable 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方式,选择安装目录,目录最好不要有空格,不要有中文,选择安装include和lib文件。其它的就没什么了。Sqlyog是一个MySQL的图形界面管理工具,可以安装上,方便数据库操作。
2           将安装好的MySQL目录下的include文件夹里的文件(头文件)复制到编译工具的include文件夹下,再将MySQL目录下的lib\opt里 的文件复制到编译工具的lib文件夹下,简而言之就是要让编译器能找到MySQL里相应的文件。(该路径也可在生成工程文件时添加给qmake)
3       打开VS2008 命令提示符,将目录切换到Qt\src\plugins\sqldrivers\mysql\,运行qmake
完了在运行nmake。不出错的话MySQL的驱动就编好了。用如下代码进行驱动测试:(这段程序编译完之后不是运行,是调试,不然测试信息出不来)
#include
#include
#include
#include
#include
#include
#include
#include
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();
}
测试结果如下图:
4           在MySQL里创建库,创建库时数据库字符集选择gbk编码,创建数据库名为test,单表,表名为testTable,表内属性为name  varchar ;(方便理解代码)
5       用如下代码测试连接数据库并测试写入、读出数据是否成功,并测试数据是否乱码。
#include
#include
#include
#include
#include
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();
}
运行结果如下图:

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


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

mingw-utils包下载: /download/mingw-utils-0.3.tar.gz

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

CODE:
[Copy to clipboard]
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下)

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

CODE:
[Copy to clipboard]
   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不为空。
参考:


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


linux环境下使用Qt自建数据库驱动的方法连接 MySQL
在笔记本里新做了个环境,Everest 0.6 ,Qt 4.5.1,MySQL 5.1.34。
从其它机器上把Qt的MySQL驱动插件复制到相关目录,打开程序时总是提示找不到数据库驱动。在之前做机器环境时候我也是这么弄的,只要Qt版本一致就没有任何问题,可这次却不知为什么总是不行。
于是按以前编译插件的方法在这个机器上又编译一遍Qt的MySQL驱动插件,还是不好使。
查阅Qt助手,在QSqlDatabase部分看到了 addDatabase函数的另一个用法:连接自己实现的数据库驱动。
例程中给出了一个连接PostgreSQL数据库的过程,与连接插件相比,它不同的两句在于:

#include "qtdir/src/sql/drivers/psql/qsql_psql.cpp"
PGconn *con = PQconnectdb("host=server user=bart password=simpson dbname=springfield");

很奇怪为什么它要包含一个 .cpp文件,而不是一个头文件。以为就是这么要求的,于是找到了MySQL的相关文件,也这么写了出来,却编译通不过。
通过查阅MySQL的C API文档,经过反复试验,花了两个晚上的时间,终于摸索出了连接MySQL的方法。

具体过程如下:

1。找到 qsql_mysql.cpp 和 qsql_mysql.h 。这两个文件在 Qt 源码包的/sql/sql/drivers/mysql下面,把它们复制到自己工程所在的路径下。
2。修改 qsql_mysql.h 文件中 #include 一行 ,按照具体机器的 mysql.h 所在的路径来修改。我台式机里的MySQL是用Everest工具盘安装的,这一行就是
#include "/usr/include/mysql/mysql.h"
我笔记本里的Everest 0.6 没有工具盘,我直接在官方网站下载的MySQL包进行的手工安装,把MySQL装到了/usr/local/mysql下面,这一行就这样写
#include "/usr/local/mysql/include/mysql.h"
3。修改工程文件。分别在 SOURCES 和 HEADERS 段加入 qsql_mysql.cpp 和 qsql_mysql.h 两个文件,然后在工程文件中加入一行
LIBS += -L/usr/lib/mysql -lmysqlclient
这一行同样需要根据具体机器的路径来写。
4。在连接数据库的模块里,在包含文件部分,加入一行
#include "qsql_mysql.h"
因为这个文件被复制到了工程所在的路径下,所以不用指出它的具体路径。
5。具体连接语句:
    MYSQL *conR=mysql_init(NULL);
    mysql_real_connect(conR,NULL,NULL,NULL,NULL,0,NULL,0);
    QMYSQLDriver *drvR =  new QMYSQLDriver(conR);
    dbR=new QSqlDatabase();
    *dbR = QSqlDatabase::addDatabase(drvR,"dbr");
    dbR->setHostName("192.168.1.201");
    dbR->setDatabaseName("clinic");
    dbR->setUserName("clinic");
    dbR->setPassword("clinic");
    if( !dbR->open())    {
        QMessageBox::critical(0,QObject::tr("远程数据库未能连接"),dbR->lastError().text());
        return 1;
    }
数据库的连接参数按实际连接情况设定。
6。在有些机器里由于具体配置环境的不同,可能会出现无法运行的现象。查看调试环境的 Application Output 上有提示:
error while loading shared libraries: libmysqlclient.so.......
解决办法是修改系统的 LD_LIBRARY_PATH 环境变量,增加MySQL的lib所在路径。
7。额外问题。
如果需要建立多于一个的数据库连接,那最好为每一个连接单独建立一个 MYSQL * 变量。否则虽然编译不出错,但无法保证运行也不出错。
使用同一个 MYSQL *变量申请两个连接,一模一样的程序在我的笔记本上不出错,在台式机上就不行。分别使用不同的 MYSQL * 申请不同的连接,就怎么使用都没问题。这和具体的数据库版本以及机器配置环境有关。

总结:
1。使用这种方法连接数据库比使用插件的方法更加灵活,适应性更强。不管Qt的版本怎样换,我们都可以用相同的方法来操作数据库,而不必费力去找不同的插件版本。
2。通过上面这些过程可以看出,真正实现出来的连接和例程给出的方法还是有很大差别的。联机文档中的例程是我们学习编程的宝贵资源,但更要在这些资源的基础上大胆摸索,大胆扩展才能进一步提高自己。


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

【原创】QT4 Windows OpenSource版中如何连接数据库
QT4 Windows OpenSource版中如何连接数据库

Windows OpenSource版中,它自身只带了SQLite的驱动,其它的驱动(比如MySQL, Oracle, InterBase, ODBC等)需要用户自己去编译,这就麻烦来了,我试验了一下,本来想使用MySQL或者SQL Server,但MySQL我机器上使用的是MySQL5,而它说明文档中只包含了3.x和4.x,试着编译了几次,总不成功,做罢,然后试验编译 ODBC,很顺利,一下子就完了,有ODBC还好说了,因为MySQL和MSSQL都可以配置进ODBC中,这样就能使用它了。

Quote:


      QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
      db.setHostName("localhost");   // 这个实际上就是本机
      db.setDatabaseName("mssql_qt"); // 这个实际上就是数据源名DSN
      db.setUserName("sa");
      db.setPassword("password");

      bool ok = db.open();
      QSqlQuery query;
      query.exec("create table person (id int primary key, "
              "firstname varchar(20), lastname varchar(20))");
      query.exec("insert into person values(101, 'Danny', 'Young')");
      query.exec("insert into person values(102, 'Christine', 'Holand')");
      query.exec("insert into person values(103, 'Lars', 'Gordon')");
      query.exec("insert into person values(104, 'Roberto', 'Robitaille')");
      query.exec("insert into person values(105, 'Maria', 'Papadopoulos')");
      db.close();

[ 此贴被XChinux在2005-08-02 09:09重新编辑 ]

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

在网上搜索到一些资料,按照上面提示的方法。

已经解决了问题。

因为我使用的是Dev-C++开发工具。他使用的是gcc编译器。

而MySQL提供的Windows For C连接库不支持gcc 、 CygWin 、MinGW等。

因此在编译连接的时候,就会出现错误提示。

解决方法:

1 、安装好MySQL (如果不愿意安装,那找个libmySQL.dll文件也可以)

2、下载Pexports工具

3、转换操作: pexports libmySQL.dll > libmySQL.def

4、使用Cygwin的 dlltool转换成为libmysql.a文件。dlltool --input-def libmySQL.def --dllname libmySQL.dll --output-lib libmysql.a -k

5、尝试是否成功: gcc -o mysqldemo mysqldemo.o

如果再出现象mysql_connect@xx (xx是数字)的错误提示。就执行第6步。

6、修改libmysql.def文件,给mysql_connect加上@xx,即: mysql_connect@xx

7、重做第4 步

8、然后尝试第5步,如果还是出现错误提示。就作第6步。一直到没有错误为止。
阅读(1753) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~