linux环境下Qt不用驱动,直接连接MySQL

参考:http://blog.163.com/tiny_dust/blog/static/1675121452010716114814654/

在笔记本里新做了个环境,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.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。通过上面这些过程可以看出,真正实现出来的连接和例程给出的方法还是有很大差别的。联机文档中的例程是我们学习编程的宝贵资源,但更要在这些资源的基础上大胆摸索,大胆扩展才能进一步提高自己