Qt之SQL数据库

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

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类

[cpp] view plaincopyprint?

  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();         //释放数据库连接

建立数据库文件

[cpp] view plaincopyprint?

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  2. db.setDatabaseName("database.db");
  3. if (!db.open())
  4. {
  5. qDebug("数据库不能打开");
  6. }
  7. return false;

[cpp] view plaincopyprint?

  1. 建立数据库文件后创建表并插入两条数据

[cpp] view plaincopyprint?

  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语法

[cpp] view plaincopyprint?

  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语法

[cpp] view plaincopyprint?

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

三、批量插入到数据库中

[cpp] view plaincopyprint?

  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();

查询数据库操作

[cpp] view plaincopyprint?

  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类函数

[cpp] view plaincopyprint?

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

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

[cpp] view plaincopyprint?

    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();
时间: 2024-10-14 10:47:41

Qt之SQL数据库的相关文章

Qt操作Sqlite数据库

总算在Qt中把Sqlite操作成功了,写点总结吧.其实早就弄对了的,但查看数据库就是没有想要的结果.最后发现生成的执行文件在Dbug目录,与先前设定的路径不同,这才恍然大悟. 一.使用到数据库模块,需在pro文件中加入:QT += sql 二.所需数据库操作的相关头文件:#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlRecord>#include <QSqlField> 三.连接Sqlite

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

最近新做的一个项目需要使用qt连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章,如果是连接另一台机器的sql server就不用执行第一步“开启ODBC驱动”了 http://www.cnblogs.com/shaolw/p/3411285.html 另外指定数据库用户名和密码可以使用Uid和Pwd,即原文dsn参数可以这样写: QString dsn = QString("Driver={

QT SQLite 多数据库操作大全

QT SQLite 多数据库操作大全 一.单数据库模型 一般QT都是把打开一个缺省数据库连接,操作一个数据库连接,但是对Sqlite中频率修改容易加锁,因此有一种设计模式是把频率修改的表放在不同的数据库文件中,但这样要修改代码操作数据库部分 通常打开代码 http://developer.nokia.com/community/wiki/Creating_an_SQLite_database_in_Qt bool DatabaseManager::openDB() { // Find QSLit

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

作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/  感觉我要火~~这比我是装定了!! 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数据库.以及TTS文本识别语音单词朗读的一款软件. 第一款软件的sql数据库软件的编写:http://www.cnblogs.com/xiaobo-Linux/p/4676950.html 现在来讲解我的第二款高大上的代码: 这个是.pro的代码,其中axconta

QT访问QSqlite数据库的实例

QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持.QSqlDatabase对象象征了数据库的关联.Qt使用驱动程序与各种数据库的应用编程接口进行通信.Qt的桌面版(Desktop Edition)包括如下一些驱动程序: 驱动程序 数据库  QDB2 IBM DB2 7.1版以及更新的版本  QIBASE Borland InterBase QMYSQL MySql  QOCI 甲骨文公司(Oracle Ca

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

QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持.QSqlDatabase对象象征了数据库的关联.Qt使用驱动程序与各种数据库的应用编程接口进行通信.Qt的桌面版(Desktop Edition)包括如下一些驱动程序: 驱动程序 数据库  QDB2 IBM DB2 7.1版以及更新的版本  QIBASE Borland InterBase QMYSQL MySql  QOCI 甲骨文公司(Oracle Ca

QT之SQL的使用

SQL类分成三层: 用户接口层:这些类提供了基于数据的窗口部件,这些窗口部件不仅连接数据库还可为用户所浏览.Qt设计器集成了这些类并可用来创建基于数据的窗体.这些窗口部件可以在程序中与C++代码直接交互.支持这一层的类包括:QSqlEditorFactory, QSqlForm, QSqlPropertyMap, QDataTable, QDataBrowser和QDataView. SQL应用编程接口层:这些类存取数据库.QSqlDatabase类用来连接数据库,数据交互的实现要么使用QSql

SQL 数据库T-SQL语句查询

         SQL 数据库T-SQL语句查询 附加数据库的数据文件 查询表中种类是水果的出厂日期在201-04-01之后的 查询所有种类的总成本 以倒序的方式查询表中水果的成本 查询种类是蔬菜的并且价格在1-5之间 将product表中的名称,种类,出厂日期的数据保存在另一个名为product_new的表中,并查看 在products表和sales表中查询产品的名称.种类.成本.销售地点和销售价格. 在products表和sales表中查询销往海南的产品名称.种类.成本和销售价格. 查询年

根据.mdf文件查看 SQL数据库的版本信息

手上有 经理带来的一个教学管理系统,由于不知道开发环境,在向SQL2000附件数据库的时候 报出附加失败的信息 ,上网查知说的2005的数据库不能向2000添加,好吧 那我在安装一个2005的行吧?但是安装SQL2005的时候确出现了问百度一段时间后知道因为我的机器上安装VS2005的时候他会给你带一个SQL2005的简化版(sql2005express),正是这个原因在安装SQL2005开发版的时候才会出现问题,所以需要把自带的sql2005express删除在重新安装;2005的安装上之后