QT数据库连接的几个重要函数的使用及注意事项(原创)

注:在这里数据库对象等同于数据库连接对象,也就是QSqlDatabase类的对象


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

功能:将某种类型的数据库加入到数据库连接列表中,可指定连接名,如果没有指定,将使用缺省的数据库连接名;返回数据库连接

参数:type——数据库类型,如QDB2 QSQLITE QODBC等等

   connectionName ——连接名,由用户自定义,如果该连接名已经存在,那么新的连接会代替原有的连接,即旧的连接将被删除。

注:连接名不同于数据库名,两者一定要区分开;连接在不指定连接名时会使用默认连接名,而默认连接只能存在一个,如果下一个连接也未指定连接名,那么上一个连接将被下一个连接代替,将不能实现多连接,所以为了实现多连接,最好为每个连接自定义连接名!!!!

例:QSqlDatabase db=QSqlDatabase::addDatabase(“QODBC”,"OTHER");

QPSQL为数据库类型,OTHER为连接名。


 void QSqlDatabase::setDatabaseName ( const QString & name )

功能:设置数据库名,数据库名必须在数据库连接打开前被设置。

参数:name——数据库名,即数据库文件名,可传递给该参数绝对路径,也可只传递文件名(将会有一条缺省路径),但后者要求将文件放到指定位置;

注:QODBC数据库较为特殊,请看例子

例:

设置QODBC数据库名实例

db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");


QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]

功能:通过连接名返回数据库连接对象,这个数据库连接对象必须在之前被加入到了数据库连接列表中(通过addDatabase函数加入),并且可根据open标志及数据库状态决定是否打开数据库。

参数:connectionName ——数据库连接名

   open——标志用户是否需要打开数据库


 void QSqlDatabase::removeDatabase ( const QString & connectionName ) [static]

功能:根据提供的连接名从数据库连接列表中移除数据库连接;

参数:connectionName ——数据库连接名

注:使用该函数容易出错,只有在某连接下没有绑定查询对象时,才能将其删除,如果有其他指向该数据库连接对象的指针,需要在关闭该连接后将该指针释放。

例:

// 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

The correct way to do it:

{
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


QSqlQuery::QSqlQuery(const QString & query = QString(), QSqlDatabase db = QSqlDatabase())

功能:根据SQL查询语句及数据库对象创建一个QSqlQuery 对象,我们可指定数据库对象,如未指定,则使用缺省对象;

参数:query ——查询语句

   db ——数据库对象

注:在某些情况下,要为QSqlQuery对象指定明确的数据库连接,否则执行查询时会出现”QSqlQuery::exec: database not open“错误提示

例如,如果我们为数据库对象自定义了数据库连接名(connectionName),并且建立了连接,那么使用QSqlQuery创建对象时要为该对象指定数据库对象,否则就会访问缺省对象了,进而会出现“database not open”错误提示。

正确使用示例:


1 QSqlDatabase  db = QSqlDatabase::addDatabase("QSLITE",connectionName);//connectionName为数据库连接名
2 db.setDatabaseName(fileName);
3 if (!db.open()) {
4         QMessageBox::warning(0, QObject::tr("Database Error"),
5                              db.lastError().text());
6         return false;
7     }
1 QSqlDatabase db = QSqlDatabase::database(connectionName);//根据连接名获取数据库对象
2 QSqlQuery query(db);//为QSqlQuery对象指定数据库对象