QT操作数据库 学习基础

  • 格式:doc
  • 大小:15.46 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)接下来执行以下命令:cd %QTDIR%\src\plugins\sqldrivers\mysql 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函数static QTextCodec* codec(MYSQL* mysql) { returnQTextCodec::codecForName("GBK");//增加部分#if MYSQL_VERSION_ID >= 32321 QTextCodec* heuristicCodec = QTextCodec :: codecForName( mysql_character_set_name ( mysql ) ); if (heuristicCodec) return heuristicCodec; #endifreturn QTextCodec::codecForLocale(); }(3)然后,重新编译qt的mysql驱动在Qt程式main函数中app后面开头处加入下面三句,加上这三个是省得不必要的麻烦QTextCodec::setCodecForLocale(QTextCodec::codecFor Name("GBK"));QTextCodec::setCodecForCStrings(QTextCodec::codecF orName("GBK"));QTextCodec::setCodecForTr(QTextCodec::codecForNam e("GBK"));(4)在Qt数据库连接后,运行"SET NAMES ’UTF8’"语句或"SET NAMES ’GBK’"。

db =QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setDatabaseName("yourdatabase");db.setUserName("yourusername");db.setPassword("yourpassword"); db.open();db.exec("SET NAMES ’UTF8’");经过以上四步,就能在Qt程式中直接使用中文字符串,而且能直接使用中文字符串出入于程式和数据库之间3.连接MySql数据库QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setDatabaseName("test"); db.setUserName("root"); db.setPassword("******"); bool ok = db.open();链接QSLite数据库:QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");4.SELECT操作QSqlQuery query; int numRows; query.exec("SELECT * FROM scores ORDER BY id ASC"); while (query.next()) { QString name = query.value(0).toString();//query.value()的参数只能是index int salary = query.value(1).toInt(); label = setText(QString::number(salary)+name);//测试查询数据的行数if(db.driver()->hasFeature(QSqlDriver::QuerySize)){ numRows = query.size(); } else { // this can be very slow st(); numRows = query.at() + 1; } }5.INSERT操作(1)直接插入(一条记录)QSqlQuery query;query.exec("INSERT INTO employee (id, name, salary) VALUES (1001, ’Thad Beaumont’, 65000)");(2)通过“:字段”操作QSqlQuery query;query.prepare("INSERT INTO employee (id, name, salary) VALUES (:id, :name, :salary)"); query.bindValue(":id", 1001); query.bindValue(":name", "Thad Beaumont"); query.bindValue(":salary", 65000); query.exec();(3)通过“?”操作QSqlQuery query;query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)"); query.addBindValue(1001); query.addBindValue("Thad Beaumont");query.addBindValue(65000); query.exec(); 6.UPDATE操作QSqlQuery query;query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");7.DELETE操作QSqlQuery query;query.exec("DELETE FROM employee WHERE id = 1007");8.transaction()操作有时为了执行一系列复杂的操作,使用QSqlDatabase::transaction()能加快速度//database为QSqlDatabase对象if(database.driver()->hasFeature(QSqlDriver::Transacti ons)) //测试数据库是否支持Transactions,{ database.transaction(); query.exec("SELECT nameFROM scores WHERE id=19"); if(query.next()){ //str = query.value(0).toString(); str = "中国"; query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)"); } mit(); }注意,如果str为中文字符串,在SQL语句中需要标明’str’(用单引号括起),如果是英文或数字字符串,能不加单引号(指的是包含在双引号内的SQL语句)9.使用SQL Model类QSqlQueryModel——一个只读的读取数据库数据的模型QSqlTableModel——一个可读写的单一表格模型,能不用写SQL语句QSqlRelationalTableModel——QSqlTableModel的一个子类这些类都继承于QAbstractTableModel,而他们又都继承于QAbstractItemModel(1)QSqlQueryModel的使用QSqlQueryModel querymodel; querymodel.setQuery("SELECT * FROM scores ORDER BY id ASC"); for(num=0;numquerymodel.rowCount();num++) { str += QString::number(querymodel.record(num).value("id").toInt()); str += " "; str +=querymodel.record(num).value("name").toString(); //注意这里的value()参数能是index(索引)也能是字段名,前面QSqlQuery的value()参数只能是index str += "\n"; } label->setText(str);(2)QSqlTableModel的使用① 读取数据QSqlTableModel tablemodel;tablemodel.setTable("scores"); tablemodel.setFilter("id > 10"); tablemodel.setSort(0,Qt::DescendingOrder); tablemodel.select(); for(num=0;numtablemodel.rowCount();num++) { str += QString::number(tablemodel.record(num).value("id").toInt( )); str += " "; str +=tablemodel.record(num).value(1).toString(); str += "\n"; } label->setText(str);② 修改数据QSqlTableModel tablemodel;tablemodel.setTable("scores"); tablemodel.setFilter("id > 10"); tablemodel.setSort(0,Qt::DescendingOrder); tablemodel.select(); for(num=0;numtablemodel.rowCount();num++){ QSqlRecord record = tablemodel.record(num); record.setValue("name",record.value("name").toString()+"2"); tablemodel.setRecord(num,record); }if(tablemodel.submitAll()) label->setText("修改成功!"); else label->setText("修改失败!"); 或能用setData()来修改,代码如下:QSqlTableModel tablemodel; tablemodel.setTable("scores"); tablemodel.setFilter("id > 10");tablemodel.setSort(0,Qt::DescendingOrder); tablemodel.select();tablemodel.setData(tablemodel.index(2,1),"data修改");if(tablemodel.submitAll()) label->setText("修改成功!"); else label->setText("修改失败!");③ 删除数据tablemodel.removeRows(row, 5);//removeRows()第一个参数为要删除的第一行的行数,第二个参数为要删除的总行数;tablemodel.submitAll(); //注意,利用QSqlTableModel修改或删除数据,最后都要使用submitAll()执行更改④ 插入数据QSqlRecord record = tablemodel.record(); record.setValue("name","插入的");tablemodel.insertRecord(2,record);注意,此处插入利用insertRecord()函数,该函数第一个参数为插入到tablemodel的第几行,第二个参数为记录,注意这里的记录一定要和tablemodel中的记录匹配,故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因为,insertRecord()返回bool值。