QtSQL学习笔记(2)- 连接到数据库

时间:2024-07-14 16:07:14

  要使用QSqlQuery或者QSqlQueryModel访问一个数据库,首先需要创建并打开一个或多个数据库连接(database connections)。

  一般地,数据库连接是根据连接名(connection name)来识别的,而不是依靠数据库名称。你可以建立多个连接,但连接到同一个数据库。QSqlDatabase还支持一个默认连接(default connection)的概念,这是一个未命名的连接。当调用QSqlQuery或者QSqlQueryModel中需要指定一个连接名参数的成员函数时,如果你不传递一个连接名,那么就会使用默认连接。当你的应用中仅需要使用一个数据库连接时,创建一个默认连接会非常方便。

  注意创建一个连接和打开一个连接之间的区别。创建一个连接包括创建一个QSqlDatabase类实例。这打开连接之前,这个连接是不可用的。下面的代码片段展示了如何创建一个默认连接并打开它:

  QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("bigblue");
db.setDatabaseName("flightdb");
db.setUserName("acarlson");
db.setPassword("1uTbSbAs");
bool ok = db.open();

  第一行代码创建一个连接对象,而最后一行打开这个连接以备后面使用。而中间的代码,我们用来初始化一些连接信息,包括主机名、数据库名、用户名和密码。在这种情况下,我们正连接到主机名为bigblue的数据库名为flightdb的MYSQL数据库。QSqlDatabase::addDatabase()方法的参数“QMYSQL”用来指定用于连接的数据库驱动类型。

注意:如果第一次使用MYSQL,你可能会遇到如下所示的错误提示:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

按理说,我使用的是Qt 5.4.1,这个版本已经提供了MYSQL的驱动了,但是这里却出现了驱动不能加载的情况。在网上查阅资料,绝大多数人给出的解决方案是将MySQL安装目录下的libmysql.dll文件放到C:\Qt\Qt5.4.1\5.4\mingw491_32\bin目录下即可解决。但是,本人尝试,并非任意版本的此动态链接库文件都能解决此问题,比如本人在官网下载安装的最新版MYSQL中的此文件就不能解决问题,可能还跟本人使用的Qt是基于MinGW编译器,而有些是使用VS编译的有关。这里我提供一个我的平台上可用的一个文件,连接地址如下:http://pan.baidu.com/s/1sjM9x2t

  以上代码片段中创建的连接是一个默认连接,因为我们没有为addDatabase()方法传递第二个参数,用以指定一个连接名。例如,下面的代码我们就建立了两个MYSQL数据库连接,并且分别命名为“first”和“second”:

QSqlDatabase firstDB = QSqlDatabase::addDatabase("QMYSQL", "first");
QSqlDatabase secondDB = QSqlDatabase::addDatabase("QMYSQL", "second");

  在这些连接被初始化以后,分别对每一个连接调用open()方法来激活连接。如果open()失败,该方法将返回false。在这种情况下,可以调用QSqlDatabase::lastError()方法来获取错误信息,该方法将返回一个QSqlError对象,可以使用QSqlError::databaseText()方法来得到该错误的QString表示形式的信息。

  一旦一个连接被建立,我们可以在任何地方通过调用带有一个连接名参数的静态函数QSqlDatabase::database()来获取一个指向该连接的指针,如果我们不传递一个连接名,它将返回默认连接。例如:

QSqlDatabase defaultDB = QSqlDatabase::database();
QSqlDatabase firstDB = QSqlDatabase::database("first");
QSqlDatabase secondDB = QSqlDatabase::database("second");

要移除一个数据库连接,首先使用QSqlDatabase::close()关闭数据库,然后使用静态方法QSqlDatabase::removeDatabase()移除它。