32Sql数据库的插入
上一节讲了数据库的连接,本例直接将数据库的插入操作,重点还是QSqlQuery类
QSqlQuery query;
//新建二维表
query.exec("CREATE TABLE student(id INT AUTO_INCREMENT PRIMARY KEY,sname VARCHAR(10),age INT,score INT)AUTO_INCREMENT=1");
字符串中的全是sql语句。
//向表中插入数据
//一次插入一个值
query.exec("INSERT INTO student (sname,age,score) VALUES('xiaohei',18,60);");
//一次插入多个值
query.exec("INSERT INTO student (sname,age,score) VALUES('xiaohei',18,60),('xiaohong',54,21);");
我们需要插入多条数据,此时可以使用QSqlQuery::exec()函数一条一条插入数据。
改进:多条数据一次插入
方法一:odbc风格
//预处理 ?是占位符,用于后面数值的一次性插入
query.prepare("INSERT INTO student (sname,age,score) VALUE(?,?,?)");
//给字段设置内容,QVariantList类似list容器
QVariantList nameList;
nameList<<"xiaobai"<<"xiaohua"<<"xiaohong";
QVariantList ageList;
ageList<<14<<6<<25;
QVariantList scoreList;
scoreList<<59<<75<<85;
//给字段绑定相应的值,按顺序
query.addBindValue(nameList);
query.addBindValue(ageList);
query.addBindValue(scoreList);
//执行预处理命令
query.execBatch();
解析:
首先,我们使用QSqlQuery::prepare()函数对这条 SQL 语句进行预处理,问号 ? 相当于占位符,预示着以后我们可以使用实际数据替换这些位置。简单说明一下,预处理是数据库提供的一种特性,它会将 SQL 语句进行编译,性能和安全性都要优于普通的 SQL 处理。在上面的代码中,我们使用一个字符串列表 nameList替换掉第一个问号的位置,一个整型列表 ageList替换掉第二个问号的位置,利用QSqlQuery::addBindValue()我们将实际数据绑定到这个预处理的 SQL 语句上。需要注意的是,nameList和 ageList这两个列表里面的数据需要一一对应。然后我们调用QSqlQuery::execBatch()批量执行 SQL,之后结束该对象。这样,插入操作便完成了。
方法二:oracle风格
//预处理 :是占位符+自定义名字(多与字段同名)
query.prepare("INSERT INTO student (sname,age,score) VALUES(:sname,:age,:score)");
//给字段设置内容
QVariantList nameList;
nameList<<"xiaoming"<<"xiaoqiu"<<"xiaoning";
QVariantList ageList;
ageList<<22<<27<<31;
QVariantList scoreList;
scoreList<<69<<79<<99;
//给对应的字段绑定对应的值,可以不按顺序
query.bindValue(":age",ageList);
query.bindValue(":score",scoreList);
query.bindValue(":sname",nameList);
//执行预处理命令
query.execBatch();
解析:
oracle和odbc本质是一样了。
区别:1、占位符不同。odbc是“?”,而oracle是“:”。
2.字段绑定函数不同。odbc是addBindValue,而oracle是bindValue。
3.绑定顺序问题。odbc中绑定函数顺序要与字段一致。(sname,age,score) VALUE(?,?,?)。而oracle不需要一致。只需与自定义名一致即可。(":age",ageList) ,绑定的名字和值很清晰,与顺序无关
结果显示:
补充:
Qvariant类
可以将很多类型都存放进去,到需要使用的时候使用一系列的to函数取出来计科。比如把int包装成Qvariant,使用的时候要用Qvariant::toInt()重新取出来。
注意:Qvariant类型的放入和取出必须是向对应的,放入一个int类型就必须int取出,不能用toString(),Qt不会主动转换。
Qvariant可以保存很多qt的数据类型,包括:QBrush,QColor,QCursor,QDateTime,QFont,QKeyQSequence, QPalette,Qpen,QPixmap,QPoint,QRect,QRegion,Qsize和Qstring。
并且还用C++基本类型,如:int,float等。
以及很多集合类型,Qmap<QSTRING,QVQvariant>,QStringList, QVariantList, QvariantHash等。
源代码:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QtSql/QSqlDatabase>
#include <QSqlError>
#include <QtSql/QSqlQuery>
#include <QVariantList>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//查询qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
//添加数据库
QSqlDatabase db=QSqlDatabase::addDatabase( "QMYSQL");
//连接数据库
db.setHostName("localhost");
//db.setHostName("127.0.0.1");
db.setUserName("root");
//db.setPassword("123456");
db.setDatabaseName("stu");
//打开数据库
if(!db.open())
{
qDebug()<<db.lastError();
}
//提供执行和查询的状态,用于数据操作
QSqlQuery query;
//新建表
//query.exec("CREATE TABLE student(id INT AUTO_INCREMENT PRIMARY KEY,sname VARCHAR(10),age INT,score INT)AUTO_INCREMENT=1");
//向表中插入数据
//query.exec("INSERT INTO student (sname,age,score) VALUES('xiaohei',18,60);");
//query.exec("INSERT INTO student (sname,age,score) VALUES('xiaohei',18,60),('xiaohong',54,21);");
//插入多条数据 odbc风格
//预处理 ?是占位符,用于后面数值的一次性插入
query.prepare("INSERT INTO student (sname,age,score) VALUE(?,?,?)");
//给字段设置内容
QVariantList nameList;
nameList<<"xiaobai"<<"xiaohua"<<"xiaohong";
QVariantList scoreList;
scoreList<<222<<75<<85;
QVariantList ageList;
ageList<<14<<6<<25;
//给字段绑定相应的值,按顺序
query.addBindValue(ageList);
query.addBindValue(nameList);
query.addBindValue(scoreList);
//执行预处理命令
query.execBatch();
// //插入多条数据 oracle风格
// //预处理 :是占位符+自定义名字(多与字段同名)
// query.prepare("INSERT INTO student (sname,age,score) VALUES(:sname,:age,:score)");
// //给字段设置内容
// QVariantList nameList;
// nameList<<"xiaoming"<<"xiaoqiu"<<"xiaoning";
// QVariantList ageList;
// ageList<<22<<27<<31;
// QVariantList scoreList;
// scoreList<<69<<79<<99;
// //给对应的字段绑定对应的值,可以不按顺序
// query.bindValue(":age",ageList);
// query.bindValue(":score",scoreList);
// query.bindValue(":sname",nameList);
// //执行预处理命令
// query.execBatch();
// //查询数据库
// query.exec("SELECT * FROM student;");
// //查询数据库中的第一天数据
// query.first();
// qDebug()<<query.value("id").toInt()
// <<query.value("sname").toString()
// <<query.value("age").toString()
// <<query.value("score").toInt();
}
Widget::~Widget()
{
delete ui;
}
32Sql数据库的插入的更多相关文章
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.Da ...
- 使用JDBC向数据库中插入一条数据
原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * cre ...
- wpf linq数据库无法插入
最近做wpf应用程序,遇到一个很奇怪的问题,我用代码往数据库里插入数据成功了,但去vs的服务器资源管理器里查看数据库总是最开始的样子,什么都没有插入进去,然后就检查代码,打日志查看sql语句,发现都没 ...
- 向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据
向Oracle数据库中插入数据出错: 经过排查,因为Update数据时没有出错,所以OracleHelper没有问题: 看异常信息提示:无效的变量和数据,应该是SQL语句的问题,调试时所传的实例Use ...
- Oracle数据库中插入日期型数据(to_date的用法)(转载)
往Oracle数据库中插入日期型数据(to_date的用法) INSERT INTO FLOOR VALUES ( to_date ( '2007-12-20 18:31:34' , 'YYY ...
- python_如何通过twisted实现数据库异步插入?
如何通过twisted实现数据库异步插入? 1. 导入adbapi 2. 生成数据库连接池 3. 执行数据数据库插入操作 4. 打印错误信息,并排错 #!/usr/bin/python3 __auth ...
- 数据库中插入数据时发生ora-00984错误
操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报OR ...
- mysql数据库中插入数据INSERT INTO SET的优势
往mysql数据库中插入数据.以前常用 INSERT INTO 表名 (列名1,列名2…) VALUES(列值1,列值2); 如果在PHP程序中,就会写成如下示例(往商品库里增加商品) $sql = ...
- C# 数据库批量插入数据之 —— SqlBulkCopy、表值参数
创建了一个用来测试的Student表: CREATE TABLE [dbo].[Student]( [ID] [int] PRIMARY KEY NOT NULL, ) NULL, ) NULL, [ ...
随机推荐
- Android Studio 引入 so 文件
1.在build.gradle中添加配置 task nativeLibsToJar(type: Zip, description: "create a jar archive of the ...
- 微信jssdk批量添加卡券接口(踩坑经验)
1)首先是官方接口文档: 1.批量添加卡券接口:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.0861973 ...
- python常用BIF汇总
append():在列表末尾增加一个数据项:例如a.append('hello') pop():用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值:例如a.pop() extend(): ...
- Python 流程控制:while
while 语法如下,当条件为假时循环才退出,否则会一直循环下去: while 条件: 执行语句 当条件为假时,才会执行else语句: while 条件: 执行语句 else: 执行语句
- C++中的抽象基类示例
抽象基类(abstract base class,ABC)例子:圆与椭圆.建立一个基类BaseEllipse,建立它的恋歌继承了Ellipse和Circle.ellipse.h #ifndef ELL ...
- poj_3283 trie树
题目大意 将一副牌进行编号,四种花色分别标记为'C'.'D'.'H'.'S',数值标记为'A'.'1'.'2'.'3'.'4'.'5'.'6'.'7'.'8'.'9'.'10'.'J'.'Q'.'K' ...
- 树形dp-hdu-3721-Building Roads
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3721 题目意思: 给一颗树,求移动一条边(边权值不变)到另外的位置,还是一棵树.求最小的树的直径. ...
- java基础---->摘要算法的介绍
数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(Hash)算法. ...
- Compass(更新中。。。)
compass Compass是Sass的工具库,就好像jQuery是js的库一样. sass有了compass的配合,就会更加事半功倍. Sass本身只是一个编译器,Compass在它的基础上,封装 ...
- OLE工具套件分析OFFICE宏恶意样本
零.绪论:OLE工具套件的介绍 OLE工具套件是一款针对OFFICE文档开发的具有强大分析功能一组工具集.这里主要介绍基于Python2.7的OLEtools的安装和使用. (1)Python版本需求 ...