QT数据库访问技术简介

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述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()

    推荐阅读