简介:
     Qt SQL 是 Qt 的重要模块之一,为了方便,Qt 对 SQL 进行了一系列的封装,并将 SQL API 分为如下三层:
     (1)驱动层
     (2)SQL API 层
     (3)用户接口层
 
目录:
一、使用前提
二、数据库类
三、连接到数据库
     · SQL 数据库驱动
四、执行 SQL 语句
     · Qt 支持的数据库系统的数据类型
五、使用 SQL Model 类
 
 
一、使用前提:
(1)在C++文件中加入相应头文件
#include <QtSql>
(2)在Qt 工程文件中加入Qt SQL 模块
QT += sql
 
二、数据库类
(1)驱动层
     驱动层包含如下几个类:
     QSqlDriver, QSqlDriverCreator, QSqlDriverCreatorBase, QSqlDriverPlugin, and QSqlResult.
     驱动层在特定的数据库系统和SQL API之间架设了一个底层的桥梁,这使得其是数据库无关的,也就是说,Qt将各种不同的数据库当作一个对象,而使用它们的方法则是通过驱动插件将其载入程序当中。我们可以这样理解:只要Qt版本的驱动程序支持,该数据库就是可用的。如图是Qt支持的数据库类型:
 
(2)SQL API 层
     这个类的集合的主要功能是访问数据库,言外之意就是对数据库进行各种操作的方法类的集合。例如可以通过QSqlDatabase建立连接,通过QSqlQuery进行数据库交互(查询等)。此外,还包括几个常用类: QSqlError, QSqlField, QSqlIndex, and QSqlRecord.
 
(3)用户接口层
     用户接口层的类包括: QSqlQueryModel, QSqlTableModel, and QSqlRelationalTableModel.
     它们可用于将数据投射到具体的部件上,当然该部件必须具备Qt的模型与视图model/view框架。
 
注意:在使用Qt Sql 类之前,必须将QCoreApplication对象实例化。 
 
 
三、连接到数据库
     通过QSqlQuery和QSqlQueryModel访问数据库将创建一个或多个数据库连接。数据库连接用数据库连接名称[ConnectionName]来区别,而非数据库名称[DatabaseName]。对同一数库可以有多个连接。此外,QSqlDatabase也支持默认连接的概念,当然这个默认连接是未命名的。当调用QSqlQuery或QSqlQueryModel的带连接名参数的成员函数时,如果不传递连接名,将使用默认连接。
     请注意创建连接和打开连接是有差别的。创建连接将创建一个QSqlDatabase对象,而在打开此连接之前,该连接是不可用的。
     Qt官方举了一个例子:
     第一行创建了一个默认的数据库连接,因为该程序中并未将具体的连接名作为第二个参数传递给addDatabase(),可以这样修改:"
     这样就创建了名为"first"和"second两个连接。值得一提的是,在打开连接之前,需要对连接进行初始化操作,包括:setHostName()、setDatabaseName()、setUserName()和setPassword()。连接初始化之后,就可以调用open()打开,如果打开失败,将返回false,通过调用lastError()可以获得错误信息。另外,连接建立之后,调用database()将返回连接名,移除连接之前先调用close()关闭之,然后再调用removeDatabase()移除。
 
     
四、执行SQL语句
 
执行查询
     QSqlQuery类提供执行SQL语句和查询的接口,而QSqlQueryModel和QSqlTableModel则提供数据库操作的高级接口。
     执行一条SQL语句之前,需要创建一个QSqlQuery对象,之后再调用QSqlQuery::exec(),例如:
     QSqlQeury构造器允许接收一个可选的QSqlDataBase对象,该对象必须是数据库连接所使用的,上例中没有传递数据库连接对象,因此将采用默认的数据库连接。
 
操作结果集
     QSqlQuery同样提供对结果集的访问,在调用exec()之后,QSqlQuery的内部指针将指向结果集中的第一条记录之前,通过调用next()可以取得第一条记录,之后再调用next()就可以取得下一条记录。如下例,其效果相当于遍历结果集:
     QSqlQeury::value()返回当前记录的指定字段值,其返回值类型是QVariant,QVariant实际上是一种联合体类型,因此需要将其转换成需要的格式(int/QString/QByteArray等)。
 
     我们也可以把QSqlQuery当作一个迭代器来看,因为它支持 QSqlQuery::next(), QSqlQuery::previous(), QSqlQuery::first(), QSqlQuery::last(), and QSqlQuery::seek().QSqlQuery::at()返回当前记录的行索引, QSqlQuery::size()返回结果集的记录条数,但前提是 QSqlQuery::size() 要求对应数据库驱动的支持。
 
插入,更新和删除
     QSqlQuery可以执行任意的SQL语句,并非仅限于SELECTS。如插入记录:
     如果你想在同一时间插入多个记录,可以使用binding来做:
     更新记录或称修改记录,类似于插入记录:
     最后,删除记录:
 
事务处理
     如果底层数据库引擎支持事务处理,那么QSqlDriver::hasFeature(QSqlDriver::Transactions)会返回true。通过调用QSqlDatabase::transactions()可以初始化一个事务,之后就可以进行执行SQL语句的操作,或者调用QSqlDatabase::commit()或者QSqlDatabase::rollback()了。
     值得注意的是:在使用事务处理的时候,必须在创建query之前启动事务transaction。如下:
     事务处理可用于数据的保护,因为其操作是原子的(例如查询外键和创建记录),且提供一套回滚机制。
 
 
五、使用 SQL Model 类
     除了QSqlQuery,Qt还提供了三种更高级的类以访问数据库,它们是QSqlQueryModel, QSqlTableModel, and QSqlRelationalTableModel.
 
     这些类派生于QAbstractTableModel,且使得数据库中的数据可以方便在视图类中显示,例如QListView和QTableView。
 
The SQL Query Model
     QSqlQueryModel提供一个基于SQL query的只读模型。示例如下:
     使用QSqlQeuryModel::setQuery()设置query之后,可以使用QSqlQueryModel::record(int)来访问单独的记录,或者调用QSqlQueryModel::data()或者其他继承自QAbstractItemModel的方法。
 
The SQL Table Model
     QSqlTableModel提供一个基于简单SQL表格的可读可写的模型。如下例:
     QSQlTableModel是QSqlQuery的高级替代方案,它可用于浏览和修改单个SQL表,而且,它也并不需要用户熟悉SQL的语法。
     使用QSqlTableModel::record()可以检索表中的一行记录,QSqlTableModel::setRecord()用于修改行记录。如下例所示:
当然,也可以使用QSqlTableModel::data() and QSqlTableModel::setData()来访问数据库。如下例所示:
     setData():
     插入一条记录:
     删除五条连续的记录:
 
     当记录改变之后,必须调用QSqlTableModel::submitAll()提交保存,否则数据是不写入的。何时又是否调用QSqlTableModel::submitAll()取决于表格的edit strategy(编辑策略),默认的编辑策略是 QSqlTableModel::OnRowChange(随行变化),其他的策略如下所示:
     
The SQL Relational Table Model
     QSqlRelationalTableModel 扩展了 QSqlTableModel 以提供对外键的支持。外键是一张表中的一个字段和另一张表中的主键字段之间的一对一的映射。
               
     表1是使用QSqlTableModel展现在QTableView中的一张表格,外键city和country还没有解析为可读的数值。表2采用了QSqlRelationalTableModel来展示,其外键已经转换为可读的字符串数值。下列代码片段展示了QSqlRelationalTableModel的建立过程:
 

PS:
    这篇文章翻译于Qt的SQL模块,中间有删减,另外加了一些个人的理解。
    整篇Qt SQL Programming并未完全翻译出来,之后还有Qt的两个例子,大家可以自己去看看。
    由于英文功底有限,翻译中可能存在多个不当之处,望不吝指出,共同进步。

http://blog.csdn.net/jan5_reyn/article/details/40164389

Qt SQL Programming 部分翻译的更多相关文章

  1. What is probabilistic programming? | 中文翻译

    What is probabilistic programming? | 中文翻译 Probabilistic languages can free developers from the compl ...

  2. macOS平台下Qt应用程序菜单翻译及调整

    一.翻译 在macOS平台上,系统会为应用程序菜单添加一些额外的菜单项.先来看一些典型的例子: 这个是Qt Creator的菜单,系统为应用程序菜单添加了一些桌面显示操作相关的菜单项: 这个是Qt D ...

  3. Teradata SQL programming

    Teradata的SQL设计和Oracle真不是一个水平, 一点美感的没有.  上个世纪它靠着MPP一招鲜吃变天, 居然做了十多年数据仓库的老大,  时过境迁, 现在有不少SQL On Hadoop ...

  4. pl/sql programming 15 数据提取

    数据提取 -- 游标 游标只是一个指向某个结果集的指针. 声明游标: cursor employee_cur IS select * from employees; 打开游标: open employ ...

  5. pl/sql programming 06 异常处理

    如果 PLSQL发生了错误, 无论是系统错误还是应用错误, 都会抛出一个异常, 当前 PL/SQL 块中执行单元会暂停处理, 如果当前块有一个异常处理单元的话, 控制会转移到当前块的异常处理单元来处理 ...

  6. pl/sql programming 03 语言基础

    PL/SQL 块结构 最小的有意义的代码单元叫做 块(block). 一个块是一组代码, 这个块给出了执行边界, 也为变量声明和异常处理提供了作用范围, pl/sql 准许我们创建匿名块和命名块, 命 ...

  7. pl/sql programming 02 创建并运行plsql代码

    /* * chap 02 * ------------------------------------------------- */ create or replace function wordc ...

  8. [转载][QT][SQL]sql学习记录5_sqlite视图(View)

    转载自:http://www.runoob.com/sqlite/sqlite-view.html SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLi ...

  9. [转载][QT][SQL]sq]学习记录1_模糊搜索

    转载自:sql学习网站: http://www.w3school.com.cn/sql/index.asp 用于模糊搜索数据库的数据 语句:http://www.w3school.com.cn/sql ...

随机推荐

  1. mybatis-generator生成model和dao层代码

    .建立文件夹myibatisGen 2.下载mybatis-generator-core-1.3.1.jar或者其它版本的jar包,到myibatisGen文件夹下 3.为生成代码建立配置文件“gen ...

  2. Objective-C中math.h数学计算公式介绍

    1. 三角函数  double sin (double); 正弦  double cos (double);余弦  double tan (double);正切 2 .反三角函数   double a ...

  3. 在SSIS包中使用 Checkpoint从失败处重新启动包

    使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...

  4. LOJ 1370 Bi-shoe and Phi-shoe(欧拉函数的简单应用)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1370 题意:给你n个整数,第i个整数为Xi.定义phi(k)为k的欧拉函数值,设pi为 ...

  5. mapreduce 关于小文件导致任务缓慢的问题

    小文件导致任务执行缓慢的原因: 1.很容易想到的是map task 任务启动太多,而每个文件的实际输入量很小,所以导致了任务缓慢 这个可以通过 CombineTextInputFormat,解决,主要 ...

  6. .net format 中 大括号{}处理

    1.string string.format(string format,object arg0) 错误:因为方法中使用{n}做占位符号了,所以其他需要括号{}的地方,就需要{{}}

  7. ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'

    在我想把备份的数据库导入到本地数据的时候,发生这个错误,我使用的工具是dbForge Studio for MySQL ERROR 1044 (42000): Access denied for us ...

  8. 从PHP程序员到RAW开发~

    RAW是一款PHP网站开发系统,即使不懂PHP,也可以使用RAW进行PHP程序开发,当然如果已经掌握了PHP,那么使用RAW开发将会是如虎添翼! 怎么理解“如虎添翼”:我们平时要做一个项目的话,我们要 ...

  9. Protel 99SE铺铜问题总结

    一.PCB电路板放置铺铜有什么作用? 散热: 屏蔽 抗干扰 pcb板子带有寄生电容: 提高板子强度: 美观: 增加被抄板的难度,尤其是覆铜+黑油.   二.PROTEL不规则铺铜的方法: 1.先要知道 ...

  10. javascript 变量 命名规范 变量的作用域

    原文:javascript 变量 命名规范 变量的作用域 大家好,我是小强老师,今天讲解的是变量 变量 小时候我们学过  这个 应用题 :  X+1=2; 问  X 等于几?  答案是 1 对了,很聪 ...