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步。一直到没有错误为止。