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对象指定数据库对象