



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
qt 数据库操作一 数据库操作1MySql驱动编译在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-Cppbin目录下(3)将MySql安装目录下的include和lib目录拷贝到没有空格的路径下,比如C: mysql下;(4)打开Qt Command Prompt,分别执行以下命令:cd c:mysqllibopt reimp -d libmysql.lib dlltool -k -d libmysql.def -l libmysql.a 这样在c:mysqllibopt目录下就会生成一个libmysql.a文件;(5)接下来执行以下命令:cd %QTDIR%srcpluginssqldriversmysqlqmake -o Makefile INCLUDEPATH+=C:MYSQLINCLUDE LIBS+=C :MYSQLLIBOPTLIBMYSQL.a 找到%QTDIR%srcpluginssqldriversmysql下的Makefile.release 和 Makefile.debug文件,去掉-llibmysql项再make编译,这下便会在%QTDIR%pluginssqldrivers目录下 面生成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)return QTextCodec: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:codecForName(GBK);QTextCodec:setCodecForCStrings(QTextCodec:codecForName(GBK);QTextCodec:setCodecForTr(QTextCodec:codecForName(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);4SELECT操作QSqlQuery query;int numRows;query.exec(SELECT * FROM scores ORDER BY id ASC);while (query.next() QString name = query.value(0).toString();/query.value()的参数只能是indexint 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 query.last(); numRows = query.at() + 1;5INSERT操作(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();6UPDATE操作QSqlQuery query;query.exec(UPDATE employee SET salary = 70000 WHERE id = 1003);7DELETE操作QSqlQuery query;query.exec(DELETE FROM employee WHERE id = 1007);8.transaction()操作有时为了执行一系列复杂的操作,使用QSqlDatabase:transaction()能加快速度/database为QSqlDatabase对象if(database.driver()-hasFeature(QSqlDriver:Transactions) /测试数据库是否支持Transactions,database.transaction();query.exec(SELECT name FROM 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语句QSqlRelationalTableModelQSqlTableModel的一个子类这些类都继承于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()参数只能是indexstr += 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(修改成功!);elselabel-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()函数,该函数第一个参数为插入到tablemod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车考试题目解释及答案
- 2025年推销艺术试卷及答案
- 封闭病房防私逃课件
- 安全培训看法建议课件
- 对称形课件的使用技巧
- 对子歌课件教学课件
- sap财务考试题及答案
- 工程招标拟定技术方案(3篇)
- 新冠英文题目及答案
- 寒号鸟课件教学课件
- 2024永磁外转子 EC 风机系统技术条件
- 高等传热学全册课件
- 建筑行业信息化管理与施工监控系统方案
- 高职高考英语词汇表
- 常住人口登记表(集体户口)-英文翻译
- 药品经营质量管理规范培训课件
- 法律检索教学课程设计
- 12D401-3 爆炸危险环境电气线路和电气设备安装
- DL∕ T 799.1-2010 电力行业劳动环境监测技术规范 第1部分:总则
- 2024版个人居间协议书范本
- 待摊投资工作底稿模板
评论
0/150
提交评论