【Qt】数据库实战(三)
00. 目录
文章目录
- 00. 目录
- 01. 概述
- 02. 开发环境
- 03. 增删改查操作
- 04. 名字绑定和位置绑定
- 05. 程序示例
- 06. 批处理操作
- 07. 事务操作
- 08. 附录
01. 概述
Qt数据库模型中提供名字绑定和位置绑定。
02. 开发环境
Windows系统:Windows10
Qt版本:Qt5.15或者Qt6
03. 增删改查操作
3.1 数据库查询参考代码
//数据库查询
QSqlQuery query;
query.exec("select * from dept");while (query.next()) {//value(0) 表示第一个字段int id = query.value(0).toInt();QString name = query.value(1).toString();QString loc = query.value(2).toString();qDebug() << id << " " << name << " " << loc;
}
3.2 数据库删除参考代码
//删除
QSqlQuery query;
query.exec("delete from dept where id = 1");
3.3 数据库更新参考代码
//更新
QSqlQuery query;
query.exec("UPDATE dept SET name = 'name' WHERE id = 3");
3.4 数据库插入参考代码
//插入
QSqlQuery query;
query.exec("INSERT INTO dept (id, name, loc) ""VALUES (1, '1name', '1loc')");
【注意】 如果构造QSqlQuery的时候 指定了执行的语句, 那么不需要调用exec函数执行
错误代码如下:
//如果这样去构造一个对象 那么将会自动执行 不需要调用exec
QSqlQuery query("insert into dept(id, name, loc) values(4, '4name', '4loc')");
if (query.exec())
{qDebug() << "insert into database ok";
}
else
{qDebug() << "insert into database faield...";
}
04. 名字绑定和位置绑定
4.1 名字绑定方式一
//名字绑定 Oracle风格
QSqlQuery query;
query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (:id, :name, :loc)");
//通过名字绑定值
query.bindValue(":id", 5);
query.bindValue(":name", "5name");
query.bindValue(":loc", "5loc");
//执行
ok = query.exec();
4.2 名字绑定方式二
//名字占位符 位置绑定
QSqlQuery query;
query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (:id, :name, :loc)");
query.bindValue(0, 6);
query.bindValue(1, "6name");
query.bindValue(2, "6loc");
ok = query.exec();
4.3 名字绑定方式三
//名字占位符 位置绑定
QSqlQuery query;
query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (:id, :name, :loc)");
//按照次序进行绑定
query.addBindValue(7);
query.addBindValue("7name");
query.addBindValue("7loc");
ok = query.exec();
4.4 位置绑定方式一
//位置绑定 MySQL风格
QSqlQuery query;
query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (?, ?, ?)");
query.bindValue(0, 8);
query.bindValue(1, "8name");
query.bindValue(2, "8loc");
query.exec();
4.5 位置绑定方式二
//位置绑定 MySQL风格
QSqlQuery query;
query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (?, ?, ?)");
query.addBindValue(9);
query.addBindValue("9name");
query.addBindValue("9loc");
query.exec();
05. 程序示例
5.1 首先在设计模式往界面上添加一个Spin Box部件,如下图所示。
5.2 将查询按钮槽里面的内容更改如下:
void MainWindow::on_pushButton_clicked()
{QSqlQuery query;int id = ui->spinBox->value();query.exec(QString("select name from student where id = %1").arg(id));//指向第一个有效数据query.next();QString name = query.value(0).toString();qDebug() << name;
}
这里使用了QString类的arg()函数实现了在SQL语句中使用变量,我们运行程序,更改Spin Box的值,然后点击查询按钮,效果如下图所示。
连接到数据库成功
"first"
"second"
5.3 在QSqlQuery类中提供了数据绑定同样可以实现在SQL语句中使用变量,虽然它也是通过占位符来实现的,不过使用它形式上更明了一些。下面先来看一个例子,将查询按钮槽更改如下:
void MainWindow::on_pushButton_clicked()
{QSqlQuery query;query.prepare("insert into student(id, name) ""values(:id, :name)");query.bindValue(0, 6);query.bindValue(1, "sixth");query.exec();//执行查询操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name;
}
执行结果:
连接到数据库成功
id: 6 name: "sixth"
这里在student表的最后又添加了一条记录。然后我们先使用了prepare()函数,在其中利用了“:id”和“:name”来代替具体的数据,而后又利用bindValue()函数给id和name两个字段赋值,这称为绑定操作。其中编号0和1分别代表“:id”和“:name”,就是说按照prepare()函数中出现的字段从左到右编号,最左边是0 。
5.4 位置绑定
void MainWindow::on_pushButton_clicked()
{QSqlQuery query;query.prepare("insert into student(id, name) ""values(?, ?)");query.bindValue(0, 6);query.bindValue(1, "sixth");query.exec();//执行查询操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name;
}
也可以利用addBindValue()函数,这样就可以省去编号,它是按顺序给字段赋值的,如下:
void MainWindow::on_pushButton_clicked()
{QSqlQuery query;query.prepare("insert into student(id, name) ""values(?, ?)");query.addBindValue(6);query.addBindValue("sixth");query.exec();//执行查询操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name;
}
当用ODBC的表示方法时,我们也可以将编号用实际的占位符代替,如下:
void MainWindow::on_pushButton_clicked()
{QSqlQuery query;query.prepare("insert into student(id, name) ""values(:id, :name)");query.bindValue(":id", 6);query.bindValue(":name", "sixth");query.exec();//执行查询操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name;
}
5.5 通过绑定操作在SQL语句中使用变量。更改槽函数如下:
void MainWindow::on_pushButton_clicked()
{QSqlQuery query;query.prepare("select name from student where id = ?");int id = ui->spinBox->value();query.addBindValue(id);query.exec();query.next();qDebug() << query.value(0).toString();
}
执行结果
连接到数据库成功
"third"
06. 批处理操作
当要进行多条记录的操作时,我们就可以利用绑定进行批处理。将槽更改如下:
void MainWindow::on_pushButton_clicked()
{QSqlQuery query;query.prepare("insert into student values(?, ?)");QVariantList ints;ints << 10 << 11 << 12 << 13;query.addBindValue(ints);QVariantList names;names << "xiaoming" << "xiaogang" << "xiaohua" << QVariant(QVariant::String);query.addBindValue(names);if (!query.execBatch()){qDebug() << query.lastError().text();}//输出整张表query.exec("select * from student");while(query.next()){int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << id << " " << name;}}
执行结果:
连接到数据库成功
1 "first"
2 "second"
3 "third"
4 "fourth"
5 "fifth"
10 "xiaoming"
11 "xiaogang"
12 "xiaohua"
13 ""
我们在程序中利用列表存储了同一字段的多个值,然后进行了值绑定。最后执行execBatch()函数进行批处理。注意程序中利用QVariant(QVariant::String)来输入空值NULL,因为前面都是QString类型的,所以这里要使用QVariant::String 使格式一致化。
07. 事务操作
事务可以保证一个复杂的操作的原子性,就是对于一个数据库操作序列,这些操作要么全部做完,要么一条也不做,它是一个不可分割的工作单位。在Qt中,如果
底层的数据库引擎支持事务,那么QSqlDriver::hasFeature(QSqlDriver::Transactions)会返回true。可以使用QSqlDatabase::transaction()来启动一个事务,然后
编写一些希望在事务中执行的SQL语句,最后调用QSqlDatabase::commit()或者QSqlDatabase::rollback()。当使用事务时必须在创建查询以前就开始事务。
void MainWindow::on_pushButton_clicked()
{//启动事务QSqlDatabase::database().transaction();QSqlQuery query;query.prepare("insert into student values(?, ?)");QVariantList ints;ints << 10 << 11 << 12 << 13;query.addBindValue(ints);QVariantList names;names << "xiaoming" << "xiaogang" << "xiaohua" << QVariant(QVariant::String);query.addBindValue(names);if (!query.execBatch()){qDebug() << query.lastError().text();}//输出整张表query.exec("select * from student");while(query.next()){int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << id << " " << name;}QSqlDatabase::database().commit();
}
08. 附录
6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639
6.2 源码下载
网址:【Qt】数据库实战(三).rar
【Qt】数据库实战(三)相关推荐
- Qt数据库(三)利用QSqlQuery类执行SQL语句(一)
本文章原创于www.yafeilinux.com 转载请注明出处. SQL即结构化查询语言,是关系数据库的标准语言.前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句.需要说明,我们这 ...
- 【Qt】数据库实战之QSqlRelationalTableModel
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlRelationalTableModel外键 04. QSqlRelationalDelegate委托类 05. ...
- 【Qt】数据库实战之QSqlTableModel模型
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlTableModel基本操作 04. QSqlTableModel修改操作 05. QSqlTableModel查 ...
- Qt数据库操作(三) -- 使用SQL模型类
文章目录 Qt数据库操作(三) -- 使用SQL模型类 1.SQL查询模型 2.SQL表格模型 3.关系表格模型 Qt数据库操作(三) – 使用SQL模型类 Qt 提供了3个高级的类来访问数据库,分别 ...
- 【Qt】数据库实战之QSqlQueryModel
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlQueryModel查询模型 04. QSqlQueryModel常用操作 05. QSqlQueryModel自 ...
- 【Qt】数据库实战(二)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 连接到数据库 04. 操作结果集 06. 附录 01. 概述 SQL即结构化查询语言,是关系数据库的标准语言.前面已经在Q ...
- 【Qt】数据库实战(一)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 数据库驱动 04. 创建数据库连接 05. 数据库简单操作 06. 附录 01. 概述 Qt中的Qt SQL模块提供了对数 ...
- [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句
[Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句 楼主 发表于 2013-5-15 22:39:29 | 查看: 813| 回复: 0 利用QSqlQuery类执行SQL语 ...
- QT读写Sqlite数据库的三种方式
QT对一些基本的数据库的访问封装,可谓是极大的方便的我们开发人员,现在我们就来说下QT对Sqlite这个数据库的读写,Sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据 ...
最新文章
- IDC_ Pro_Env _CentOS 5.4_Open×××
- 人工智能导论 王万良教授_学会动态丨辽宁省人工智能导论教学研讨活动在沈阳成功举办...
- 内存延时cl_内存频率和CL延迟哪个重要
- 阿联酋是发达国家还是发展中国家
- 使用t-sql语句修改表中的某些数据及数据类型。_Java面试——数据库知识点
- Python中的自定义进程和进程池
- linux之eval命令
- JavaScript+Css实现的鼠标悬停时动态翻滚的紫色菜单导航
- 英特尔云计算策略以Nehalem为主
- 更新 箫心病毒分析专家2006 build 5.23(C#2.0)
- python求字符组合_python – 生成一个潜在的8个字符串的所有可能的2个字符组合?...
- svg 转换为 pdf (batik 库+fop库)
- 中国电信物联网正式平台设置订阅地址
- 使用DCMTK实现DICOM文件浏览器dicom explorer
- BME280嵌入式设计-基于STM32F103的温湿度气压控制板-支持蓝牙串口输出数据!!!
- 【雷达】毫米波雷达和激光雷达
- windows中如何让chrome信任自签名证书?
- Openbravo ERP介绍
- python从键盘输入一个字符串将小_python如何从键盘获取输入实例
- [HDU]6069 Counting Divisors
热门文章
- 【数据结构总结】第四章:串、数组和广义表(线性结构)
- 常用计算机服务,常用计算机端口对应的服务(The commonly used computer port corresponding service).doc...
- linux修改jdk环境变量6,Linux CentOS 6.5 使用自带jdk修改环境变量(示例代码)
- Java黑皮书课后题第5章:*5.42(金融应用:求销售额)如下重写编程练习题5.39:①使用for循环替代do-while循环②允许用户自己输入COMMISSION_SOUGHT而非将它固定为常量
- Java黑皮书课后题第5章:**5.19(打印金字塔形的数字)编写一个嵌套的for循环,打印下面的输出
- 计算机培训课程感悟,计算机应用基础课程学习体会
- Java基础 if if-else if-else if-else 三种示例
- Python字典和集合
- pandas,apply并行计算的一个demo
- bootstrap学习网站