QT QSqlQuery QSqlQueryModel
| SQL执行操作
QSqlQuery提供了对数据库记录的Select、Insert、Update、Delete操作。 SELECT操作:
通过QSqlQuery::next() 下一条 QSqlQuery::previous() 上一条 QSqlQuery::first() 第一条 QSqlQuery::last() 最后一条 QSqlQuery::seek(),定位任意一条记录的位置。 列数、字段数:query.record().count() 行数,记录数 query.size(); sql="SELECT * FROM sys"; query.exec(sql); rec=query.record(); int numRows; while (query.next()) {
if (db.driver()->hasFeature(QSqlDriver::QuerySize)) {
//驱动支持返回记录数 numRows = query.size(); } else {
//驱动不支持返回记录数,只能循环查找 query.last(); numRows = query.at() + 1; } } 值:query.value(0) INSERT操作:
UPDATE操作:
DELETE操作:
事务处理:
如果数据库引擎支持事务处理,则函数QSqlDriver::hasFeature(QSqlDriver::Transactions)将返回 真。 可以通过调用QSqlDatabase::transaction()来初始化一个事务处理。之后执行你想在该事务处理的工作。 完了再执行QSqlDatabase::commit()来提交事务处理或QSqlDatabase::rollback()取消事务处理。 这里在举个QSqlDriver::hasFeature(QSqlDriver::QuerySize)例子,可以较快的统计查询记录行数。
存储过程: AsciiToInt()是数据库中的一个存储过程。 但我在网上以前好像看过说是SQL Server中的存储过程是通过"EXEC"完成的,而不是"CALL",这里我不确定!留下一个疑问吧~
|
http://www.cnblogs.com/bennylam/archive/2010/03/30/1700761.html
QT操作数据库
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;
#endif
return 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");
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
query.last();
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::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+"’)");
}
database.commit();
}
注意,如果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值。
10.使用QTableView
开头处要使用#include
QTableView *view = new QTableView();
view->setModel(&model);
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
view->show();
QT QSqlQuery QSqlQueryModel的更多相关文章
- qt QSqlQuery
QT数据库QSqlQuery SQL执行操作 QSqlQuery提供了对数据库记录的Select.Insert.Update.Delete操作. SELECT操作: QSqlQuery query ...
- 初学Qt——QTableView+QSqlqueryModel
我们在显示报表时可以用到上面两个类来实现,QTableView负责对视图显示:QSqlqueryModel则负责数据模块. 这里数据查询使用QSqlqueryModel主要是这个类可以通过自己写的查询 ...
- 将vim作为QT开发的IDE
转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIM ...
- qt 5.2.1类和模块的关系图
QT│ ├─ActiveQt│ │ ActiveQt│ │ ActiveQtDepends│ │ ActiveQtVersion│ │ QAxAggregated│ │ QAxB ...
- qt中使用sqlite存储数据
一.sqilte的安装 在Windows上安装SQLite: 请访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件. 您需要下载 sqlite-tools-win32-*.zi ...
- Qt数据库 QSqlTableModel实例操作(转)
本文介绍的是Qt数据库 QSqlTableModel实例操作,详细操作请先来看内容.与上篇内容衔接着,不顾本文也有关于上篇内容的链接. Qt数据库 QSqlTableModel实例操作是本文所介绍的内 ...
- Qt4与Qt3的主要不同
Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...
- Qt:QSqlQuery
0.说明 QSqlQuery提供了执行SQL代码的方法. QSqlQuery封装了在QSqlDatabase中查询.检索数据的相关函数.它可以用来执行如SELECT.INSERT.UPDATE.DEL ...
- QT基本使用
安装方法: ubuntu12.04下安装QT方法:http://blog.csdn.net/xsl1990/article/details/8299756 输入以下命令: sudo apt-get i ...
随机推荐
- RichEdit 各个版本介绍
RichEdit是开发中经常使用到的控件,其版本自1.0起,历经好几年,好几次的更新,在此引用一篇介绍RichEdit版本的博文(http://blogs.msdn.com/b/murrays/arc ...
- 通过jQuery或ScriptManager以Ajax方式访问服务
1.客户端和服务端 服务端对外提供服务时,可以通过handler或者webservice.handler比较轻便,但是难以对外公开,只有程序员自己知道它到底做了些什么工作.webservice可以将服 ...
- uml类图的几种关系
UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregati ...
- C#中的OLEDB连接2
在通过ADO对Excel对象进行连接时(此时Excel则认为是一个数据源),需要配置对Excel数据源对应的连接串,这个连接串中包括了Provider信息(其实类似对数据库进行连接操作时,都需要指定连 ...
- BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计 ...
- win7 64位系统 pl/sql 无法解析指定的连接标识符解决办法
我用的是win764位,装好后,装了pl/sql 和toad,都连不上数据库,报错位“无法解析指定的连接标识符” 解决办法,经过研究发现安装目录有问题.默认会安装在“C:\Program Files ...
- 利用 jQuery-photoClip插件 实现移动端裁剪功能并以Blob对象上传
最近客户要求实现论坛贴子附件裁剪功能,没有考虑js与ios.android容器交互解决方案,单纯用js去实现它的.由于本来附件上传用的别的插件实现的,所以是在此基础上费了不少劲,才把jQuery-ph ...
- 【CSS】Intermediate8:Page Layout
1.Layout with CSS is easy. You just take a chunk of your page and shove it wherever you choose 2.pos ...
- makefile 中 $@ $^ %< 使用
这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在L ...
- 在Eclipse中使用Maven插件 博客分类: Java相关技术
简介 本文介绍如何在Eclipse中通过maven插件编写java项目和web项目. 安装Maven 下载Maven最新版本,见:maven.apache.org/download.html 当前版本 ...