简介:
     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. kbengine环境搭建(2)

    做好准备工作后,可以开始搭建我们的kbengine服务端,运行成功kbengine服务端,共有9个服务会相应的被打开,并会全部提示[info]found all components! 准备工作 1. ...

  2. 使用COCOS2D-X JSB开发,在js页面中设置iOS键盘模式

    XYSDK.h void setKeyboardType(int type); XYSDK.cpp voidXYSDK::setKeyboardType(int type) { #if (CC_TAR ...

  3. 生产环境提升rman备份速度----启动块跟踪

    生产环境提升rman备份速度----启动块跟踪 [环境] AIX(5300-08).oracle10g(10.2.0.1.0-64bit) [目标] 因为生产环境数据量较大,欲加快rman备份的速度 ...

  4. windows service 的创建 安装 调试 错误回发

    关于如何快速创建一个windows服务 1.在vs中创建windows服务 名称:你要写的服务名称 位置:创建服务所在的位置 点击确定 2.代码编写 3.添加安装程序 点击添加安装程序出现 分别右击设 ...

  5. API和DLL

    API API(Application Programming Interface,应用编程接口)其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的 API 而使操作系统去执行应用 ...

  6. zoj 2067 White Rectangles

    这题解决的算法处理,真的很难想清楚!!尤其是最后的正矩形如何处理.不过终于看懂了 #include<stdio.h> #include<stdlib.h> #include&l ...

  7. SqlServer 2015修改表时出现“save changes is not permitted…”的解决方法

    使用SqlServer 2015的过程中,会出现如下情况: 在修改完表字段名或是类型后点击保存时会弹出一个对话框,且无法保存已做的修改.对话框内容大致如下: Saving changes is not ...

  8. SQL数据库关键字和列名冲突处理

    在设计SQL数据库的时候可能由于考虑不全,使列名和数据库内关键字冲突,可能导致Query不能被正确识别,对列名要加[]处理.

  9. JS中的replace方法

    JavaScript中replace() 方法如果直接用str.replace("-","!") 只会替换第一个匹配的字符. 而str.replace(/\-/ ...

  10. android--email发送邮件,文本还有附件形式的邮件

    1.首先用的jar包为javaemail 下载地址: https://yunpan.cn/cB3kY8WIvcGtU (提取码:e042) 2.工具包 package com.kllayhello.u ...