简介:
     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. Linux中环境变量到底写在哪个文件中?解析login shell 和 no-login shell

    login shell:取得bash 时需要完整的登入流程,就称为login shell.举例来说,同tty1~tty6登入时, 需要输入用户名和密码,此时取得的bash就称为login shell ...

  2. Android中自己定义组件和它的属性

    好长时间没有更新博客了.本来想积累点有深度的东西发,但一直没有找到非常好的点.所以.写一些基础的东西.就当积累吧. Android开发中难免会用到自己定义的组件.以下以ImageButton为例来介绍 ...

  3. Objective-c 深浅复制

    深浅复制的定义: 浅复制:在复制时,对于被复制对象的每一层都是指针复制. 深复制:在复制时,对于被复制的对象至少有一层是对象复制. 完全复制:在复制时,对于被复制对象的每一层都是完全复制. retai ...

  4. Unity 通过NGUI 完成单摄像机 制作地图

    本次思想主要是通过 Ngui的Scroll View 主要是UIPanel的Clipping属性的Alipha Clip 调节窗口大小,遮蔽地图试地图实现在屏幕的部分显示.此方法的好处是不用担心sha ...

  5. MYSQL—加写锁,加读锁,解锁

    链接地址:http://blog.sina.com.cn/s/blog_7fa2bcf50101j1lu.html 表级锁: 加写锁:          lock   tables   table_n ...

  6. [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)

    dfs出邮票的各种面值,然后dp求解. ------------------------------------------------------------------------------- ...

  7. jQuery学习之结构解析

    jQuery内核解析 1.jQuery整体的结构是一个匿名函数 (function( window, undefined ) {})(window); 2.jQuery就是一个很普通的函数,也是一个很 ...

  8. mysql修改用户名和密码

    修改用户名 mysql> use mysql;  选择数据库Database changedmysql> update user set user="dns" wher ...

  9. pprint模块解析

    pprint模块提供了打印任意python数据结构的方法,如果这个数据结构不是python的基本类型,则可能无法打印结果.         pprint模块定义了一个类:         pprint ...

  10. LintCode-两数之和

    题目描述: 给一个整数数组,找到两个数使得他们的和等于一个给定的数target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是1到n,不是以 ...