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 <QApplication>如果输出中有 Available drivers:就说明已经可以成功支持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 <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();
}
测试结果如下图:
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();
}
运行结果如下图:
--------------------------------------------------------
QUOTE:
Qt4 OpenSource for mingw中编译MySQL驱动
mingw-utils包下载:http://www.qtcn.org/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):
这就是一个容易搞混的地方,上面是使用的libmysql.lib和nmake来编译的,如果使用的是msvc的编译器,那上面是没问题的,但是如果使用的是mingw编译器,那就会出错,有undefined reference....等类错误字样。这是因为mingw使用的库和msvc使用的不同格式的库而引起的。而mysql只提供了msvc可使用的库。 qt4 for mingw要想编译出qsqlmysql库来,我们先得编译出mingw需要的libmysql.a这个文件来,可使用mingw工具来生成。
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. mingw -utils包里的reimp命令(如果没有这个命令的话,可从本帖开头处给出的地址中下载这个文件,并把它解压开后的bin目录里的内容拷贝到 mingw的bin目录下面。mysql安装的时候默认的安装路径中有空格,我们得先把它的include和lib目录拷贝到没有空格的路径下,比如C: \mysql下)
CODE:
[Copy to clipboard]
cd c:\mysql\lib\opt
如此,这样我们的命令行为(注意qmake和make):
reimp -d libmysql.lib dlltool -k -d libmysql.def -l libmysql.a
CODE:
[Copy to clipboard]
cd %QTDIR%\src\plugins\sqldrivers\mysql
这下便会在%QTDIR%\plugins\sqldrivers目录下面生成libqsqlmysql.a, qsqlmysql.dll这两个文件了。
qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro make
有一点, 就是下载他给出的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
-----------------------------------------------------
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.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:
[ 此贴被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步。一直到没有错误为止。 |