QSqlDatabase类学习笔记

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

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

  1. QSqlDatabase a = QSqlDatabase::addDatabase("QMYSQL""YourName");  
  2. QSqlDatabase b = QSqlDatabase::addDatabase("QMYSQL");  

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

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

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

  1. QSqlDatabase c = QSqlDatabase::database("YourName");  
  2. QSqlDatabase d = QSqlDatabase::database("YourName");  
  3. QSqlDatabase e = QSqlDatabase::database();  
  4. 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参考文档)

  1. // WRONG  
  2. QSqlDatabase db = QSqlDatabase::database("sales");  
  3. QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);  
  4. QSqlDatabase::removeDatabase("sales"); // will output a warning  
  5.   
  6. // "db" is now a dangling invalid database connection,  
  7. // "query" contains an invalid result set  
上述写法不正确,会有错误发生的危险。正确的写法应该是:

  1. {  
  2.     QSqlDatabase db = QSqlDatabase::database("sales");  
  3.     QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);  
  4. }  
  5. // Both "db" and "query" are destroyed because they are out of scope  
  6. QSqlDatabase::removeDatabase("sales"); // correct  
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页