0、说明

QSqlDatabase类处理与数据库连接相关的操作。一个QSqlDatabase实例就代表了一个连接,连接时要提供访问数据库的driver,driver继承自QSqlDriver。

通过静态方法addDatabase()构造一个QSqlDatabase来构造一个连接,调用这个方法时可以指定driver或driver type和连接名。

不同连接通过连接的name进行区分,而不是它要连接的数据库的name。我们可以通过多种连接连接到一个数据库。QSqlDatabase也支持默认连接——无名连接。为了构造这个默认连接,当我们调用addDatabase()时,不传入连接name。之后,当我们调用任何static成员函数时,如果不指定连接名,都会采用该默认连接。

下面的代码段展示了如何构造一个默认连接来连接一个PostgreSQL database:

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("Administrator");
db.setDatabaseName("Mydb");
db.setUserName("User");
db.setPassword("123456");
bool ok = db.open();

构造完成QSqlDatabase对象之后,要分别调用setHostName()、setDatabaseName()、setUserName()、setPassword()、setPort()、setConnectOptions()来设置连接配置项。之后,调用open()方法激活和数据库的连接。在open()之前,连接是不可用的。

上文我们构造了一个默认连接,因为我们在调用addDatabase()时并没有给这个连接命名。接下来,我们可以通过调用database()来得到这个默认连接对应的QSqlDatabase对象:

QSqlDatabase db = QSqlDatabase::database();

QSqlDatabase是一个值相关类,也就是说,在这个连接上进行的操作会影响到其它代表同一个连接的QSqlDatabase对象的内容。调用cloneDatabase()可以用已存在的连接构造一个独立的数据库连接。

注意

强烈推荐不要为QSqlDatabase构造副本,不然可能会在关闭时导致清理异常。如果我们需要访问一个存在的QSqlDatabase,应该通过database()来进行。如果我们获取并记录了一个QSqlDatabase类型的成员字段,那么它在QCoreApplication实例关闭前需要将其delete。

如果我们构造了多个连接,那么需要在调用addDatabase()时为每个连接指定一个独特的名字。通过调用database()时传入连接名来获取对应的连接。

调用removeDatabase()并传入相应的连接名来实现取消连接。如果我们想关闭一个正在被其他QSqlDatabase使用的连接,那么会输出一个警告信息。可以调用contains()可以检查某个连接名是否包含在连接List中。

QSqlDatabase::exec()已经过时了,现在应该用QSqlQuery::exec()。

使用事务时,必须在创建查询前启动事务。

1、模块和加载项

Header: #include <QSqlDatabase>
qmake: QT += sql

2、构造

QSqlDatabase(QSqlDatabase other) 复制一个QSqlDatabase
QSqlDatabase()

构造一个空的、非法的QSqlDatabase。

需要使用addDatabase()、removeDatabase()、database()来获取合法的QSqlDatabase

通常不用构造方法构造一个QSqlDatabase,而用静态方法addDatabase()。

5、静态方法

返回值类型

方法

说明

QSqlDatabase

addDatabase(QString type, QString connectionName = QLatin1String(defaultConnection))

addDatabase(QSqlDriver *driver, QString connectionName = QLatin1String(defaultConnection))

用driver type和连接名构造一个连接,如果和之前的连接重名,那么会删除之前的连接,而返回新构造的连接。

如果type不可用,isValid()会返回false。

如果连接名未指定,那么新构建的连接将成为默认连接,可以通过调用无参database()来访问这个默认连接。如果提连接名,将会返回连接名对应的连接。

如果多次调用该方法且不指定连接名,那么后建立的默认连接会覆盖之前的默认连接。

在使用连接前,需要先初始化,也就是调用 setDatabaseName(), setUserName(), setPassword(), setHostName(), setPort(), and setConnectOptions()这些方法或其中的一些方法。最后,open()

该方法用一个driver来实例化数据库连接,这个driver可以是我们自写的。

这个方法我们用到的比较少,有需要的可以去官网查看addDatabase

QSqlDatabase

cloneDatabase(QSqlDatabase other, QString connectionName)

cloneDatabase(QString other, QString connectionName)

复制一个连接,返回它的副本,并为该副本命名。

所有原连接的内容如databaseName()、hostName()都会原封不动的保存下来。

这个新的连接并不是open的,在使用它之前,要先用open()打开。

QStringList connectionNames() 返回包含所有连接名的QStringList
bool contains(QString connectionName = QLatin1String(defaultConnection)) 如果连接名List中包含指定连接名,返回true
QSqlDatabase database(QString connectionName = QLatin1String(defaultConnection), bool open = true)

返回指定连接名的连接。

如果参数open = true(默认),那么如果返回的连接原本没有open,那么现在它会open。

如果不指定连接名,会返回默认连接;如果连接名不存在,会返回一个非法连接。

该方法是线程安全的。

QStringList drivers() 返回所有可用的drivers组成的QStringList
bool isDriverAvailable(QString name) 如果名字为name的driver可用,就返回true
void registerSqlDriver(QString name, QSqlDriverCreatorBase *creator)

注册一个新的名为name的driver。

如果我们有一个定制SQL driver并且并不想将它编译成一个接口时,可以调用该方法。

void removeDatabase(QString connectionName)

在连接List中删除某个连接。

需要注意的是,在该连接上不能有某个启动的Query,否则可能导致资源泄漏。

也就是说,Query语句必须与removeDatabase不在一个代码块中

错误示范:

// WRONG
QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
QSqlDatabase::removeDatabase("sales"); // will output a warning
// "db" is now a dangling invalid database connection,
// "query" contains an invalid result set

正确示范:

{
QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// 当db和query离开代码块之后,它们就会被销毁,此时再销毁是安全的
QSqlDatabase::removeDatabase("sales"); // correct

为了移除默认连接,可以通过database().connectionName()来获取默认连接name。

该方法是线程安全的。

QString的Drive type

Driver Type Description
QDB2 IBM DB2
QIBASE Borland InterBase Driver
QMYSQL MySQL Driver
QOCI Oracle Call Interface Driver
QODBC ODBC Driver (includes Microsoft SQL Server)
QPSQL PostgreSQL Driver
QSQLITE SQLite version 3 or above
QSQLITE2 SQLite version 2
QTDS Sybase Adaptive Server

6、实例方法

返回值类型

方法

说明

QSqlDatabase & operator=(QSqlDatabase other) 赋值
void close() 关闭连接,释放所有资源,取消建立在该连接上的所有查询相关的QSqlQuery对象
bool commit()

如果driver支持事务,那么就向数据库提交事务,此时transaction()会启动。如果操作成功,返回true。

对于某些数据库,当在数据库上有活动查询正在执行,那么事务提交会失败并返回false。在事务提交之前应使查询失效。

调用lastError()可以得知错误信息。

QString connectOptions() 返回该连接所用到的一些连接配置
QString connectionName() 返回连接名
QString databaseName() 返回数据库名
QSqlDriver * driver() 返回该连接用的QSqlDriver
QString driverName() 返回driver名
QSqlQuery exec(QString query = QString()) 执行一段SQL语句,返回QSqlQuery对象。
QString hostName() 返回连接的Host名
bool isOpen() 连接是否open
isOpenError()

是否存在打开错误。

错误信息通过lastError()查询

isValid()

如果该QSqlDatabase有一个合法driver返回true。

QSqlDatabase db;
qDebug() << db.isValid(); // Returns false db = QSqlDatabase::database("sales");
qDebug() << db.isValid(); // 如果连接"sales"存在,返回true QSqlDatabase::removeDatabase("sales");
qDebug() << db.isValid(); // Returns false
QSqlError lastError()

返回最近的错误信息。

查询相关的错误会被QSqlQuery::lastError()抛出

QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() 返回当前数据库连接的默认精度策略。
bool

open()

open(QString user, QString password)

启动一个数据库连接
QString password() 返回连接密码
int port() 返回连接端口
QSqlIndex primaryIndex(QString tablename 返回表tablename上的索引。
QSqlRecord record(QString tablename) 返回表tablename(或视图)上所有字段组成的QSqlRecord
bool rollback() 如果事务transaction()已经启动,回滚数据库上的事务。

void

这些方法必须在连接open()前调用,否则是无效的。

不然就只能先close(),再调用该方法,再open()。

setConnectOptions(QString options = QString())

设置连接配置项。

参数options字符串是以分号';'分隔的option=value对。不同的数据库的配置是不同的,具体可查看官方文档setConnectOptions

setDatabaseName(QString name)

设置数据库名。

如果数据库服务器上有多个数据库,就要用该项指明用哪个数据库。

setHostName(QString host) 设置Host名(服务器IP/域名)。
setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) 设置数字精度策略。
setPassword(QString password) 设置密码。
setPort(int port) 设置端口。
setUserName(QString name) 设置用户名。
QStringList tables(QSql::TableType type = QSql::Tables) 返回数据库中所有的table、system table、view构成的QStringList,具体返回哪种,由参数type指定。
bool transaction() 启动一项事务,成功则返回true
QString userName() 返回用户名

事务

在以上方法中,我们提到了事务(transaction)一词,它的意思是我们对数据库进行的各项操作,需要注意的是,对数据库修改的事务,必须commit()提交事务,才能真正实现对数据库修改,否则只是对它的映像进行修改。

7、用法

1)构造数据库连接

int main(int argc, char *argv[])
{
QSqlDatabase db =QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("Mysql");
db.setPort(1234);
db.setUserName("User");
db.setPassword("pwd1");
db.setDatabaseName("Table1");
if( !db.open() ){ //数据库打开失败
qDebug()<<db.lastError().text();
}
}

Qt:QSqlDatabase的更多相关文章

  1. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  2. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  3. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  4. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  5. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

  6. Qt:QUrl构造时的qrc前缀

    参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...

  7. 解决方式:QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins

    在用QSqlDatabase时遇到报错QSqlDatabase: an instance of QCoreApplication is required for loading driver plug ...

  8. Qt:QSqlQuery

    0.说明 QSqlQuery提供了执行SQL代码的方法. QSqlQuery封装了在QSqlDatabase中查询.检索数据的相关函数.它可以用来执行如SELECT.INSERT.UPDATE.DEL ...

  9. Qt:正则表达式语法:

         正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式;        Qt 提供了一个Q ...

随机推荐

  1. SpringBoot使用异步线程池实现生产环境批量数据推送

    前言 SpringBoot使用异步线程池: 1.编写线程池配置类,自定义一个线程池: 2.定义一个异步服务: 3.使用@Async注解指向定义的线程池: 这里以我工作中使用过的一个案例来做描述,我所在 ...

  2. glibc-2.18升级

    1.下载文件下载地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.18.tar.gz 2.安装部署解压tar -zxvf glibc- ...

  3. 如何在pyqt中通过调用 SetWindowCompositionAttribute 实现Win10亚克力效果

    亚克力效果 在<如何在pyqt中实现窗口磨砂效果>和<如何在pyqt中实现win10亚克力效果>中,我们调用C++ dll来实现窗口效果,这种方法要求电脑上必须装有MSVC.V ...

  4. ApacheCN PHP 译文集 20211101 更新

    PHP 入门指南 零.序言 一.PHP 入门 二.数组和循环 三.函数和类 四.数据操作 五.构建 PHP Web 应用 六.搭建 PHP 框架 七.认证与用户管理 八.建立联系人管理系统 使用 PH ...

  5. 洛谷 P4708 画画(无标号欧拉子图计数)

    首先还是类似于无标号无向图计数那样,考虑点的置换带动边的置换,一定构成单射,根据 Burnside 引理: \[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} ...

  6. git merge -ff --no-ff --squash 的区别

    感谢原文作者:futureme 原文链接:https://www.cnblogs.com/taylorluo/articles/10810762.html git merge #没有参数(默认为–ff ...

  7. Maven多环境配置实战 filter

    目前在开发一个wap项目,主要有开发.测试和最终部署上线几个阶段,每个阶段对配置(数据库.日志)都有不同的设置.以前都是以开发环境为主,在测试和部署上线时由部署工程师负责修改配置并上线.但是公司并非都 ...

  8. IP分组和分片

    本文讨论两个问题①IP数据报的首部②IP数据报的分片 TCP/IP模型分为五层,从上到下依次是应用层.传输层.网络层.数据链路层和物理层. IP数据报是网络层的概念. IP数据报的首部 版本号:0~3 ...

  9. PHP面试常考内容之面向对象(1)

    PHP中面向对象常考的知识点有以下几点,我将会从以下几点进行详细介绍说明,帮助你更好的应对PHP面试常考的面向对象相关的知识点和考题. 整个面向对象文章的结构涉及的内容模块有: 一.面向对象与面向过程 ...

  10. MindSpore多元自动微分

    技术背景 当前主流的深度学习框架,除了能够便捷高效的搭建机器学习的模型之外,其自动并行和自动微分等功能还为其他领域的科学计算带来了模式的变革.本文我们将探索如何用MindSpore去实现一个多维的自动 ...