Qt数据库连接

Qt数据库连接

Qt是通过数据库连接来进行数据库访问的
 QSqlDatabase类提供了连接访问数据库的接口。

QSqlDatabase简介

 一个QSqlDatabase的实例表示一个数据库的连接。每个连接通过Qt所支持的数据库驱动提供对数据库的访问(数据库驱动程序派生自QSqlDriver)。你也可以编写自己的数据库驱动。
 通过调用静态addDatabase()函数中的一个来指定要使用的驱动程序(数据库驱动类型)或驱动程序类型(取决于数据库的类型)和连接名(connectionName)。

[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))

每个连接是通过连接名与数据库连接的。并且一个数据库可以有多个数据库连接。
QSqlDatabase支持默认连接,即未命名连接(只需要指定驱动类型)。创建默认连接,只需要在addDatabase()时不传递连接名即可。之后,你调用任何静态成员函数不指定连接名,则都认为是使用默认连接。


      QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
      db.setHostName("acidalia");
      db.setDatabaseName("customdb");
      db.setUserName("mojito");
      db.setPassword("J0a1m8");
      bool ok = db.open();

 上面代码展示了如何创建和打开PostgreSQL的默认连接。创建QSqlDatabase对象后,使用setDatabaseName()、setUserName()、setPassword()、setHostName()、setPort()和setConnectOptions()设置连接参数。然后调用open()来打开到数据库的物理连接,在打开之前,连接是不可用的
 上面定义的连接是默认连接,因为没有为addDatabase()提供连接名,之后可以通过调用database()来获得默认连接,而不需要连接名参数。

	QSqlDatabase db = QSqlDatabase::database();

 QSqlDatabase是一个值类(value class)。通过一个QSqlDatabase实例对数据库连接所做的操作将影响表示相同连接的其他QSqlDatabase实例。使用cloneDatabase()可以创建一个基于已有的数据库连接的连接。
警告:强烈建议不要将QSqlDatabase的拷贝作为类成员,因为这将阻止关闭时正确清理实例。如果需要访问现有的QSqlDatabase,应该使用database()访问。如果你选择使用作为成员变量的QSqlDatabase,则需要在删除QCoreApplication实例之前删除它,否则可能会导致未定义的行为。

 如果你创建了多个数据库连接,在调用addDatabase()时为每个连接指定一个唯一的连接名。使用带有连接名的database()来获得该连接。对连接名使用removeDatabase()来删除连接,如果试图删除由其他QSqlDatabase对象引用的连接,则QSqlDatabase输出一个警告。使用contains()查看指定的连接名是否在该数据库的连接列表中。

多线程使用数据库注意

 Qt使用时,常常将GUI线程与各种数据处理线程分开,这时会涉及到多线程操作数据库。

Threads and the SQL Module
A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.
In addition, the third party libraries used by the QSqlDrivers can impose further restrictions on using the SQL Module in a multithreaded program. Consult the manual of your database client for more information

 官方文档有明确的说明,每个连接只能在创建它的线程中使用,不支持跨线程
 如果你试图跨线程使用同一个数据库连接,可能会出现以下警告,

QSqlDatabasePrivate::database: requested database does not belong to the calling thread.

 一个连接不同跨线程操作,不代表不能多线程操作一个数据库。使用方法很简单,创建一个不同的连接或者销毁原连接再打开。

发布了60 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/BadAyase/article/details/103726147