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