qt连接mysql数据库

1.MySql驱动编译

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

(1)下载 : http://www.qtcn.org/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.    query.last();
  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. database.commit();
  13. }

注意,如果str为中文字符串,在SQL语句中需要标明’str’(用单引号括起),如果是英文或数字字符串,能不加单引号(指的是包含在双引号内的SQL语句)

9.使用SQL Model类

QSqlQueryModel——一个只读的读取数据库数据的模型

QSqlTableModel——一个可读写的单一表格模型,能不用写SQL语句

QSqlRelationalTableModel——QSqlTableModel的一个子类

这些类都继承于QAbstractTableModel,而他们又都继承于QAbstractItemModel

(1) QSqlQueryModel的使用

  1. QSqlQueryModel querymodel;
  2. querymodel.setQuery(“SELECT * FROM scores ORDER BY id ASC”);
  3. for (num=0;numquerymodel.rowCount();num++)
  4. {
  5. str += QString::number(querymodel.record(num).value(“id”).toInt());
  6. str += ” “;
  7. str += querymodel.record(num).value(“name”).toString();
  8. //注意这里的value()参数能是index(索引)也能是字段名,前面QSqlQuery的value()参数只能是index
  9. str += “\n”;
  10. }
  11. label->setText(str);

(2) QSqlTableModel的使用

① 读取数据

  1. QSqlTableModel tablemodel;
  2. tablemodel.setTable(“scores”);
  3. tablemodel.setFilter(“id > 10″);
  4. tablemodel.setSort(0,Qt::DescendingOrder);
  5. tablemodel.select();
  6. for (num=0;numtablemodel.rowCount();num++)
  7. {
  8. str += QString::number(tablemodel.record(num).value(“id”).toInt());
  9. str += ” “;
  10. str += tablemodel.record(num).value(1).toString();
  11. str += “\n”;
  12. }
  13. label->setText(str);

② 修改数据

  1. QSqlTableModel tablemodel;
  2. tablemodel.setTable(“scores”);
  3. tablemodel.setFilter(“id > 10″);
  4. tablemodel.setSort(0,Qt::DescendingOrder);
  5. tablemodel.select();
  6. for (num=0;numtablemodel.rowCount();num++)
  7. {
  8. QSqlRecord record = tablemodel.record(num);
  9. record.setValue(“name”,record.value(“name”).toString()+”2″);
  10. tablemodel.setRecord(num,record);
  11. }
  12. if(tablemodel.submitAll())
  13. label->setText(“修改成功!”);
  14. else
  15. label->setText(“修改失败!”);

或能用setData()来修改,代码如下:

  1. QSqlTableModel tablemodel;
  2. tablemodel.setTable(“scores”);
  3. tablemodel.setFilter(“id > 10″);
  4. tablemodel.setSort(0,Qt::DescendingOrder);
  5. tablemodel.select();
  6. tablemodel.setData(tablemodel.index(2,1),”data修改”);
  7. if(tablemodel.submitAll())
  8.     label->setText(“修改成功!”);
  9. else
  10.     label->setText(“修改失败!”);

③ 删除数据

  1. tablemodel.removeRows(row, 5);
  2. //removeRows()第一个参数为要删除的第一行的行数,第二个参数为要删除的总行数;
  3. tablemodel.submitAll();
  4. //注意,利用QSqlTableModel修改或删除数据,最后都要使用submitAll()执行更改

④ 插入数据

  1. QSqlRecord record = tablemodel.record();
  2. record.setValue(“name”,”插入的”);
  3. tablemodel.insertRecord(2,record);
  4. //注意,此处插入利用insertRecord()函数,该函数第一个参数为插入到tablemodel的第几行,
  5. 第二个参数为记录,注意这里的记录一 定要和tablemodel中的记录匹配,
  6. 故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因为,insertRecord()返回bool值。

10.使用QTableView

开头处要使用#include

  1. QTableView *view = new QTableView();
  2. view->setModel(&model);
  3. view->setEditTriggers(QAbstractItemView::NoEditTriggers);
  4. view->show();

About 智足者富

http://chenpeng.info

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>