上一节讲了数据库的连接,本例直接将数据库的插入操作,重点还是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数据库的插入的更多相关文章

  1. java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间

    java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.Da ...

  2. 使用JDBC向数据库中插入一条数据

    原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * cre ...

  3. wpf linq数据库无法插入

    最近做wpf应用程序,遇到一个很奇怪的问题,我用代码往数据库里插入数据成功了,但去vs的服务器资源管理器里查看数据库总是最开始的样子,什么都没有插入进去,然后就检查代码,打日志查看sql语句,发现都没 ...

  4. 向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据

    向Oracle数据库中插入数据出错: 经过排查,因为Update数据时没有出错,所以OracleHelper没有问题: 看异常信息提示:无效的变量和数据,应该是SQL语句的问题,调试时所传的实例Use ...

  5. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  6. python_如何通过twisted实现数据库异步插入?

    如何通过twisted实现数据库异步插入? 1. 导入adbapi 2. 生成数据库连接池 3. 执行数据数据库插入操作 4. 打印错误信息,并排错 #!/usr/bin/python3 __auth ...

  7. 数据库中插入数据时发生ora-00984错误

    操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报OR ...

  8. mysql数据库中插入数据INSERT INTO SET的优势

    往mysql数据库中插入数据.以前常用 INSERT INTO 表名 (列名1,列名2…) VALUES(列值1,列值2); 如果在PHP程序中,就会写成如下示例(往商品库里增加商品) $sql = ...

  9. C# 数据库批量插入数据之 —— SqlBulkCopy、表值参数

    创建了一个用来测试的Student表: CREATE TABLE [dbo].[Student]( [ID] [int] PRIMARY KEY NOT NULL, ) NULL, ) NULL, [ ...

随机推荐

  1. 转的:burp suite小例子

    Web安全测试时经常会遇到一些蹩脚的注射点,而因各种原因利用注射又无法获取网站管理账号或拥有网站管理权限却迟迟不能upload一个shell的时候,可能会权衡一下web权限与数据库信息,哪个是我们所需 ...

  2. Keil(MDK-ARM)在线调试(Ⅰ)(转)

    Ⅰ.写在前面 Keil在线调试的内容有很多,本文带来在线调试常用的内容:Debug Toolbar调试工具栏(复位.全速运行.停止运行.单步调试.逐行调试.跳出调试.运行到光标行.跳转到暂停行.调试窗 ...

  3. 检测你的php代码执行效率

    在写程序的时候,经常会为是改用empty()还是isset好,或是用单引号还是双引号来显示连接字符串而发出疑问,现在好了.我们其实可以通过程序很科学的得出精确的答案.知道我们的程序到底怎样写效率会更好 ...

  4. zookeeper集群的安装和配置

    Zookeeper的目的是封装好复杂易出错的关键服务,将简单易用的接口和性能高效.功能稳定的系统提供给用户.Zookeeper有两种运行模式,单机模式(Standalone)和集群模式(Distrib ...

  5. 【Laravel】Mac下玩转Laravel

    1 apache 首先Mac系统是自带了Apache,只需要执行 sudo apachectl start 就可以打开Apache服务,然后访问 http://localhost 就可以访问到,it' ...

  6. MQTT的学习研究(一)MQTT学习网站

    MQTT的官方推荐网站: http://mqtt.org/software 使用IBM 的MQTT协议实现push消息地址: http://tokudu.com/2010/how-to-impleme ...

  7. LeetCode——Pascal's Triangle II

    Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3 ...

  8. python 进行抓包嗅探

    一.绪论 最近一直想弄一个代理,并且对数据包进行解读,从而完成来往流量的嗅探.于是今天学习了一下如何使用Python抓包并进行解包. 首先要用到两个模块 dpkt(我这边ubuntu16.04 LTS ...

  9. 【BZOJ2901】矩阵求和

    Description 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. Input 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一个矩阵. 接下来n行,每行n个非负整数 ...

  10. 【Android】Scrollview 相关问题汇总

    去除Scrollview 滑动边界渐变颜色 去掉滚动条,并将在滑动时,边界不会变成灰白 <horizontalscrollview android:overScrollMode="ne ...