简介:
     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. UBER人民优步司机注册攻略

        注意:本文驾驶证行驶证图片为本人拍摄,请广大网友勿作它用 转载请修改! 详细的介绍注册优步uber司机端步骤; uber对司机的要求: 车辆为本地牌照 车龄在5年以内 裸车价格在10万以上 目 ...

  2. Android发展简单介绍

    Android一词的本义指“机器人”,同一时候也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动 ...

  3. 七日筑基——C#第一天(下)

    继续C#第一天的内容,昨天我们简单说了一下如何用C#代码来让学生做自我介绍,介绍的格式要求:“我叫威震天,今年20岁,我喜欢踢足球和上网,希望接下来的三年能跟大家一起成长.”威震天介绍完了,继续下一个 ...

  4. BootStrap 智能表单系列 八 表单配置json详解

    本章属于该系列的高级部分,将介绍表单中一些列的配置 1.config列的配置: 主要用于控制布局 :config:{autoLayout:true|'1,2,2,4'} true:根据配置项最里层的数 ...

  5. HDOJ 1308.Is It A Tree?

    2015-07-15 问题简述: 给出一组节点关系,判断由这些节点组成的图是否为一颗树. 树只有一个根节点,每个节点只有一条边指向它,没有环. 原题链接:http://poj.org/problem? ...

  6. 【转】QT QString, wchar_t *, TCHAR, CString和其他字符或字符串类型的转化

    //QString to wchar_t *: const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(fileNa ...

  7. C++对象模型6--对象模型对数据访问的影响

    如何访问成员? 前面介绍了C++对象模型,下面介绍C++对象模型的对访问成员的影响.其实清楚了C++对象模型,就清楚了成员访问机制.下面分别针对数据成员和函数成员是如何访问到的,给出一个大致介绍. 对 ...

  8. Cloudera Manager Service Monitor 定期挂掉问题排查

    显示:查询 Service Monitor 时发生内部错误(Error sending messages to firehose: mgmt-SERVICEMONITOR-) 1.初步排查出是smon ...

  9. 数据可视化开源系统(python开发)

    Caravel 是 Airbnb (知名在线房屋短租公司)开源的数据探查与可视化平台(曾用名Panoramix),该工具在可视化.易用性和交互性上非常有特色,用户可以轻松对数据进行可视化分析. 核心功 ...

  10. Linux下使用ps命令来查看Oracle相关的进程

    Linux下可以使用ps命令来查看Oracle相关的进程 Oracle Listener 这个命令会列出Oracle Net Listener的进程 [oracle@ www.linuxidc.com ...