----------------------------

http://blog.csdn.net/reborntercel/article/details/6991147

http://blog.csdn.net/fzu_dianzi/article/details/6959268

--------------------------------

需要说明,当刚执行完query.exec(“select * from student”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from student”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。

#include <QtSql>
QT += sql
QSqlDatabase类实现了数据库连接的操作
QSqlQuery类执行SQL语句
QSqlRecord类封装数据库所有记录

QSqlDatabase类

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
  2. db.setHostName("localhost");    //数据库主机名
  3. db.setDatabaseName("scott");    //数据库名
  4. db.setUserName("stott");        //数据库用户名
  5. db.setPassword("tiger");        //数据库密码
  6. db.open();          //打开数据库连接
  7. db.close();         //释放数据库连接

建立数据库文件

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  2. db.setDatabaseName("database.db");
  3. if (!db.open())
  4. {
  5. qDebug("数据库不能打开");
  6. }
  7. return false;
  1. 建立数据库文件后创建表并插入两条数据
  1. QSqlQuery query;
  2. query.exec("create table student(id INTEGER PRIMARY KEY autoincrement,
  3. name nvarchar(20), age int)"); //id自动增加
  4. query.exec("insert into student values(1,'小明', 14)");
  5. query.exec("insert into student values(2,'小王',15)");

QSqlQuery类

插入值到数据库操作

一、直接用SQL语句插入(参照上面)

二、利用预处理方式插入(ORACLE语法和ODBC语法)

适合插入多条记录,或者避免将值转换成字符串(即正确地转义),调用prepare()函数指定一个包含占位符的query,然后绑定要插入的值

ORACLE语法

  1. QSqlQuery query;
  2. query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //准备执行SQL查询
  3. query.bindValue(":name", "小王");   //在绑定要插入的值
  4. query.bindValue(":age", 11);
  5. query.exec();

ODBC语法

  1. QSqlQuery query;
  2. query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //准备执行SQL查询
  3. query.addBindValue("小王");   //在绑定要插入的值
  4. query.bindValue(11);
  5. query.exec();

三、批量插入到数据库中

  1. QSqlQuery query;
  2. query.prepare(“insert into student values (?, ?)”);
  3. QVariantList names;
  4. names << "小王" << "小明" << "小张" << "小新"; // 如果要提交空串,用QVariant(QVariant::String)代替名字
  5. query.addBindValue(names);
  6. QVariantList ages;
  7. ages << 11 << 13 << 12 << 11;
  8. query.addBindValue(ages);
  9. if (!q.execBatch()) //进行批处理,如果出错就输出错误
  10. qDebug() << q.lastError();

查询数据库操作

  1. QSqlQuery query;
  2. query.exec("SELECT * FROM t_STUDENT"); // 查询的结果可能不止一条记录,所以我们称之为结果集
  3. while (query.next())
  4. {
  5. QString name = query.value(0).toString(); //取第i条记录第1个字段(从0开始计数)的结果
  6. int age = query.value(0).toInt(); //取第i条记录第2个字段的结果
  7. // ... 处理name,age变量数据
  8. }

seek(int n) :query指向结果集的第n条记录。指定当前的位置

first() :query指向结果集的第一条记录。

last() :query指向结果集的最后一条记录。

next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。

previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。

record() :获得现在指向的记录。

value(int n) :获得属性的值。其中n表示你查询的第n个属性

int rowNum = query.at(); //获取query所指向的记录在结果集中的编号

int fieldNo = query.record().indexOf(“name”); //返回"name"的列号

int columnNum = query.record().count(); //获取每条记录中属性(即列)的个数

事务操作

操作函数:transaction(),commit()提交,rollback()回滚
操作事务前,先判断该数据库是否支持事务操作。hasFeature是QSQLDriver类函数

  1. if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //

插入一条记录,然后提交事务

    1. QSqlDatabase::database().transaction();
    2. QSqlQuery query;
    3. query.exec("SELECT id FROM T_STUDENT WHERE class=1");
    4. if (query.next())
    5. {
    6. query.exec("INSERT INTO T_STUDENT (id,name,age) VALUES (3,'小李',13)");
    7. }
    8. QSqlDatabase::database().commit();

Qt之SQL数据库的更多相关文章

  1. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  2. Qt之操作数据库(SQLite)

    SQLite 简介 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需 ...

  3. qt调用sql server存储过程并获取output参数

    最近新做的一个项目需要使用qt5连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章: <Q ...

  4. Qt之操作数据库(SQLite)实例

    QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持.QSqlDatabase对象象征了数据库的关联.Qt使用驱动 ...

  5. Qt 操作SQLite数据库

    项目中通常需要采用各种数据库(如 Qracle.SQL Server.MySQL等)来实现对数据的存储.查询等功能.下面讲解如何在 Qt 中操作 SQlite 数据库. 一.SQLite 介绍 Sql ...

  6. KTV项目 SQL数据库的应用 结合C#应用窗体

    五道口北大青鸟校区 KTV项目 指导老师:袁玉明 歌曲播放原理 SQL数据库关系图 C#解决方案类图 第一步:创建数据库连接方法和打开方法和关闭方法! public class DBHelper { ...

  7. jquery autocomplete实现读取sql数据库自动补全TextBox

    转自我本良人 原文 jquery autocomplete实现读取sql数据库自动补全TextBox 项目需要这样子一个功能,其他部门提的意见,只好去实现了哦,搞了好久才弄出来,分享一下. 1.前台页 ...

  8. SQL数据库

    SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出“做什么”的命令,“怎么做” ...

  9. matlab连接sql数据库

    最近项目还涉及到matlab连接数据库,下面我就记录如何进行配置使得matlab能够连接sql数据库.由于最近工程做的多一些,所以分享的都在工程配置上,当初为了这些配置可是反复卸载与重装,算法其实也有 ...

随机推荐

  1. 【Hibernate 3】一对一映射配置

    一.一对一映射简介 一对一关联映射有两种实现策略: 第一种:主键关联,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 ...

  2. [Hibernate 2]session的三种状态

    一.Session的特点和获取 特点: Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间.  Session也称为持久化管理器, ...

  3. 【Linux】Zabbix + MPM + msmtp + mutt 监控MySQL + 邮件报警

    Zabbix部署参考博文 http://blog.sina.com.cn/s/blog_5611597901017oe0.html  MPM安装配置参考博文和MPM官网下载地址 http://blog ...

  4. ajax success 和complete 的区别

    Function) success - 当请求成功时调用的函数.这个函数会得到一个参数:从服务器返回的数据(根据“dataType”进行了格式化). Function) complete - 当请求完 ...

  5. ASP.NET的SEO:目录

    ASP.NET的SEO:基础知识 ASP.NET的SEO:Global.asax和HttpModule中的RewritePath()方法--友好的URL ASP.NET的SEO:正则表达式 ASP.N ...

  6. Distant Supervision for relation extraction without labeled data

    Distant Supervision for relation extraction without labeled data 远程监督:使用未标注语料做关系抽取 1. 背景: 关系抽取(某个人是否 ...

  7. 《你是我的小羊驼》游戏ios源码

    <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op>源码下载:http://code. ...

  8. mysql中union与union all的区别

    当查询表结构完全相同的多张表的数据时: 1.当查询条件完全相同且不包括主键,此时用union查询会过滤掉查询出的重复的记录,及漏查记录:使用union all进行查询,则会查出所有的符合条件的记录,保 ...

  9. CSS网页布局错位:CSS宽度计算

    为什么计算宽度计算网页像素宽度是为了CSS网页布局整齐与兼容.常见的我们布局左右结构网页或使用padding.margin布局的时候将计算整页宽度,如果不计算无论是宽度过大过小就会出现错位问题. 怎么 ...

  10. Silverlight - GPU加速

    1. 在Silverlight plug-in上设置 <param name="enableGPUAcceleration" value="true" / ...