QT操作数据库学习基础

  • 格式:docx
  • 大小:22.86 KB
  • 文档页数:9

QT操作数据库学习基础

QT操作数据库 学习基础是本文要介绍的内容,对于数据库相信友们有所接触,那么先来看本文。

一. 数据库操作

1.MySql驱动编译

在windows系统中,我们在mingw,MySql5和Qt4的环境中编译MySql驱动主要有以下几个步骤:

(1)下载

/download/mingw-utils-0.3.tar.gz

(2)将mingw-utils-0.3.tar.gz解压缩,将bin目录下的reimp 工具复制到 mingw目录下的bin 里,如果Dev-C++就复制到C:\Dev-Cpp\bin目录下

(3)将MySql安装目录下的include和lib目录拷贝到没有空格的路径下,比如C: \mysql下;

(4)打开Qt Command Prompt,分别执行以下命令:

cd c:\mysql\lib\opt reimp -d libmysql.lib dlltool -k -d

libmysql.def -l libmysql.a

这样在c:\mysql\lib\opt目录下就会生成一个libmysql.a文件;

(5)接下来执行以下命令:

1. cd %QTDIR%\src\plugins\sqldrivers\mysql

2. qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C :\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro

找到%QTDIR%\src\plugins\sqldrivers\mysql\下的Makefile.release 和 Makefile.debug文件,去掉-llibmysql项再make编译,这下便会在%QTDIR%\plugins\sqldrivers目录下 面生成libqsqlmysql.a, qsqlmysql.dll这两个文件,然后在程式的.pro文件中添加QT+=sql并在程式开头包含#include 就能操作数据库了。

2.完全解决数据库存储中文和Qt程式显示数据库中文及中文字符串的问题

(1)数据库和表及表里的字符相关字段(varchar, char, text等)都要使用gbk_chinese_ci这种方式,不这样做也能,但这样做,会省非常多麻烦。

(2)重新编译Qt的MySQL驱动,需要修改src / sql / drivers /

mysql / qsql_mysql.cpp文件。要修改的部分如下:第一百零八行的codec函数

1. static QTextCodec* codec(MYSQL* mysql)

2. {

3. return QTextCodec::codecForName("GBK");//增加部分

4. #if MYSQL_VERSION_ID >= 32321

5. QTextCodec* heuristicCodec = QTextCodec :: codecForName ( mysql_character_set_name ( mysql ) );

6. if (heuristicCodec)

7. return heuristicCodec;

8. #endif

9. return QTextCodec::codecForLocale();

10. }

(3)然后,重新编译qt的mysql驱动在Qt程式main函数中app后面开头处加入下面三句,加上这三个是省得不必要的麻烦

1. QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

2. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));

3. QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

(4)在Qt数据库连接后,运行"SET NAMES ’UTF8’"语句或"SET NAMES ’GBK’"。 1. db = QSqlDatabase::addDatabase("QMYSQL");

2. db.setHostName("localhost");

3. db.setDatabaseName("yourdatabase");

4. db.setUserName("yourusername");

5. db.setPassword("yourpassword");

6. db.open();

7. db.exec("SET NAMES ’UTF8’");

经过以上四步,就能在Qt程式中直接使用中文字符串,而且能直接使用中文字符串出入于程式和数据库之间

3.连接MySql数据库

1. QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

2. db.setHostName("localhost");

3. db.setDatabaseName("test");

4. db.setUserName("root");

5. db.setPassword("******");

6.

bool ok = db.open();

链接QSLite数据库:

1. QSqlDatabase

db = QSqlDatabase::addDatabase("QSQLITE");

4.SELECT操作

1. QSqlQuery query;

2. int numRows;

3. query.exec("SELECT * FROM scores ORDER BY id ASC");

4. while (query.next())

5. {

6. QString name = query.value(0).toString();//query.value()的参数只能是index

7. int salary = query.value(1).toInt();

8. label = setText(QString::number(salary)+name);//测试查询数据的行数

9. if (db.driver()->hasFeature(QSqlDriver::QuerySize))

10. {

11. numRows = query.size();

12. }

13. else

14. {

15. // this can be very slow

16. st();

17. numRows = query.at() + 1;

18. }

19. }

5.INSERT操作

(1)直接插入(一条记录)

1. QSqlQuery query;

2. query.exec("INSERT INTO employee (id, name, salary) VALUES (1001,

’Thad Beaumont’, 65000)");

(2)通过“:字段”操作

1. QSqlQuery query;

2. query.prepare("INSERT INTO employee (id, name, salary)

VALUES (:id, :name, :salary)");

3. query.bindValue(":id", 1001);

4. query.bindValue(":name", "Thad Beaumont");

5. query.bindValue(":salary", 65000);

6. query.exec();

(3)通过“?”操作

1. QSqlQuery query;

2. query.prepare("INSERT INTO employee (id, name, salary)

VALUES (?, ?, ?)");

3. query.addBindValue(1001); 4. query.addBindValue("Thad Beaumont");

5. query.addBindValue(65000);

6. query.exec();

6.UPDATE操作

1. QSqlQuery query;

2. query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");

7.DELETE操作

1. QSqlQuery query;

2. query.exec("DELETE FROM employee WHERE id = 1007");

8.transaction()操作

有时为了执行一系列复杂的操作,使用QSqlDatabase::transaction()能加快速度

1. //database为QSqlDatabase对象

2. if(database.driver()->hasFeature(QSqlDriver::Transactions)) //测试数据库是否支持Transactions,

3. {

4. database.transaction();

5. query.exec("SELECT name FROM scores WHERE id=19");

6. if(query.next())

7. {

8. //str = query.value(0).toString();

9. str = "中国";

10. query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)");

11. }

12. mit();

13. }