大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述QT数据库访问技术简介相关的知识,希望能为你提供帮助。
背景介绍本人使用过php/C#/VB/VB.NET/java等编程语言开发过基于数据库方面的应用,相对于其它编程语言来说,个人感觉QT的数据库访问框架在设计时有些混乱,所以在最开始使用的时候一度有些困惑。在后来多次使用QT开发应用的过程中,才慢慢使用了QT的数据库访问框架。
功能对比一般来说,涉及到数据库访问的框架会有如下功能的类:数据库驱动管理类、数据库连接类、执行增删改查的数据库操作类、用于接收执行查询操作返回的结果集的类、数据库事务管理类以及数据库异常方面的类。
例如在Java和C#中大概的对应关系如下:
Java | C# | |
数据库驱动层 | java.sql.Driver | System.Data.Common.DbProviderFactory |
数据库连接层 | java.sql.Connection | System.Data.Common.DbConnection |
数据库执行层 | java.sql.Statement java.sql.PreparedStatement | System.Data.Common.DbCommand 【QT数据库访问技术简介】System.Data.Common.DbDataAdapter |
结果集表示层 | java.sql.ResultSet | System.Data.Common.DataReader System.Data.Common.DataTable System.Data.DataRow System.Data.DataColumn |
数据库事务层 | java.sql.Connection.commit(); java.sql.Connection.rollback(); | System.Data.Common.DbTransaction.commit() System.Data.Common.DbTransaction.rollback() |
数据库异常 | java.sql.SQLException | System.Data.Common.DbException |
说明:在Java SE中定义的以接口居多,需要具体的数据库实现。在C#中微软分别提供了接口(位于System.Data命名空间下)、抽象类(位于System.Data.Common命名空间下)和针对一些具体数据库的实现类。在上表中C#部分主要是抽象类。另外,由于语言的不同,很难将相关的类或接口完全严格地填入上面的表中,只能是近似。
在QT的数据库编程访问体系中,主要提供了QSqlDatabase、QSqlDriver、QSqlError、QSqlField、QSqlIndex、QSqlQuery、QSqlQueryModel、QSqlRecord、QSqlResult、QSqlTableModel类,除了上述类之外还有QSqlDriverCreator、QSqlDriverCreatorBase、QSqlRelationalTableModel类。如果按照上述的功能划分,那么表格基本可以理解:
QT | 说明 | |
数据库驱动层 | QSqlDriver | |
数据库连接层 | QSqlDatabase | QSqlDatabase.exec(const QString& query = QString())可以直接执行SQL语句 |
数据库执行层 | QSqlQuery | |
结果集表示层 | QSqlRecord QSqlField QSqlIndex QSqlResult QSqlQueryModel QSqlTableModel | |
数据库事务层 | QSqlDatabase.commit(); QSqlDatabase.rollback(); | |
数据库异常 | QSqlError |
QT中数据库操作常用类介绍在QT的帮助文档里,QT将上述的数据库相关的类分为三个层级,最底层的一个层级为驱动层,在这个层级的类有:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase等,在驱动层之上是SQL接口层,在这个层级的类有QSqlDatabase、QSqlQuery、QSqlField、QSqlRecord、QSqlIndex、QSqlError等,在SQL接口层之上是用户接口层,用户接口层的类有QSqlQueryModel、QSqlTableModel及QSqlRelationalTableModel等。
对于上面的类的作用介绍如下:
序号 | 类 | 说明 |
1 | QSqlDriver | 这个类一般不会直接使用,除非想开发自己的数据库驱动。它是用于访问特定数据库的抽象类。 |
2 | QSqlDatabase | 用于连接数据库的类,提供了数据库连接、访问和事务控制等功能,并且还支持获取当前支持的驱动(QSqlDatabase::drivers())、直接支持SQL语句(QSqlDatabase.exec(const QString & query = QString()))、获取指定表的主键(QSqlDatabase::primaryIndex(const QString & tablename))、获取指定表的字段信息(QSqlDatabase::record(const QString & tablename))等操作。 |
3 | QSqlQuery | 用于执行SQL语句的类,支持通过QSqlQuery::boundValue()的重载形式来执行参数化SQL语句。通过QSqlQuery::record()方法返回结果集中的一行记录,通过QSqlResult*QSqlQuery::result()返回结果集,通过QSqlQuery::value()重载形式返回指定字段的值。 |
4 | QSqlRecord | 用于封装数据库记录的类,QSqlRecord封装了数据库表或视图中的一行记录,一个QSqlRecord可能包含0到多个QSqlField,可以用QSqlRecord::field()的重载形式获取QSqlRecord中包含的QSqlField,也可以用QSqlRecord::value()的重载形式获取QSqlRecord各字段的值(返回值为QVariant,需要根据实际字段类型进行转换) |
5 | QSqlField | 用于封装数据库表或视图中的字段,通过QSqlField类可以获取字段的名称、所属表名、是否允许为空、默认值、字段长度、是否为空、字段类型、字段值等信息。 |
6 | QSqlIndex | 用于封装数据库索引的类,通过QSqlIndex类可以获取索引的名称、索引是降序或升序等信息。 |
7 | QSqlResult | 用于封装数据库特定的数据而抽象的类,通常情况应尽量使用QSqlQuery而不是QSqlResult,QSqlQuery在QSqlResult的基础上提供了一层封装。如果需要实现自己的数据库驱动,那么就需要实现自己的QSqlResult类,一般情况下尽量使用QSqlQuery吧。 |
8 | QSqlError | 用于封装数据库错误信息的类,可以通过QSqlError::isValid()来判断是否发生了数据库错误,在发生错误的情况下可以通过QSqlError::databaseText()获取数据库报告的错误,通过QSqlError::driverText()获取驱动程序报告的错误,还可以通过QSqlError::nativeErrorCode()获取数据库层面的本地错误代码,QSqlError::nativeErrorCode() 推荐阅读
|