QSqlDatabase类学习笔记

    Qt中的QSqlDatabase类表示一个数据库的连接。

    数据库连接的创建通过静态方法addDatabase来实现,在创建时可以给数据库连接指定一个名称(ConnectionName),如果不指定名称也可以,会创建一个默认连接。如:

QSqlDatabase a = QSqlDatabase::addDatabase("QMYSQL", "YourName");
QSqlDatabase b = QSqlDatabase::addDatabase("QMYSQL");

这里会创建两个数据库连接,一个名为“YourName”, 另一个没有指定名称,称之为默认连接(Default Connection)[注意:默认数据库连接的名称不一定是空的,可以通过database().connectionName()来得到默认数据库连接的名称]。在创建数据库连接时发现已经有相同名称的连接存在,原来的连接会删除并重新创建一个新连接。

    数据库连接创建后,通过一些setXXX方法给此连接定义主机名,数据库名,用户名,密码等属性,然后执行open函数创建实际的物理连接,在没有执行open之前是无法执行查询操作的。

    Qt中的数据库以连接名来区分的,通过database方法可以获得在前面已经创建的连接,而相同名称的连接实际是同一个连接,如:

QSqlDatabase c = QSqlDatabase::database("YourName");
QSqlDatabase d = QSqlDatabase::database("YourName");
QSqlDatabase e = QSqlDatabase::database();
QSqlDatabase f = QSqlDatabase::database("UnCreated");

这里的c和d都和前面的a一样,指向的是同一个连接,当对象d的参数改变后(如调用setUserName),c和a的属性会同时变化。而调用database方法如果忽略连接名时, 则会返回已创建的默认连接,就是说e和b时一样的连接。当调用QSqlDatabase::database时此连接并不存在(没有在调用前首先创建),那么返回的是一个无效连接(如f)。

    QSqlDatabase::cloneDatabase()提供了复制数据库连接的方法,它返回与源对象不同的一个新的连接,但他们指向的物理数据库仍然是相同的。注意:返回的新连接必须先执行open操作才可使用。这也说明了Qt中允许多个QSqlDatabase连接到同一个数据库。

    contains方法可以查询是否已经建立了相同名称的连接。

    removeDatabase方法将删除指定名称的数据库连接,当还有其他的数据库对象引用该连接时,Qt会输出一个警告信息。注意:在调用remove方法前,需要确保已经没有打开的QSqlQuery对象,否则会造成内存泄露。如:(以下代码摘自Qt参考文档)

 // 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);
 }
 // Both "db" and "query" are destroyed because they are out of scope
 QSqlDatabase::removeDatabase("sales"); // correct


你可能感兴趣的:(QT,database,数据库,qt,query,output,文档)