转载自http://blog.csdn.net/rogeryi/article/details/1424852
QT为数据库编程提供了一个类似JDBC的统一操作模型,它的底层是具体数据库或数据库接口的插件,由它们负责完成真正的数据库操作。
QT自带有QODBC Driver,在Windows平台上通过系统提供的ODBC Driver可以访问支持ODBC的数据库,如Ms Access、SQL Server等 (Windows XP 自带有Access和SQL Server的ODBC Driver)。
QT数据库模型的基础类是QSqlDatabase对象,拥有一个QSqlDatabase对象代表着拥有一个数据库的连接,在一个已经Open的QSqlDatabase对象上,我们就可以执行各种数据库操作。
要得到一个QSqlDatabase对象的方法是QSqlDatabase的静态函数addDatabase,它创建一个新的QSqlDatabase对象,并注册在内部的Hash表中,最后返回该对象。 (另外静态函数database可用于查询一个已经注册的QSqlDatabase对象)
当我们得到一个新的还没有Open的QSqlDatabase对象,我们要先设置数据库的DSN(Data Source Name),DSN的设置是通过成员函数setDatabaseName,在QODBC中,DSN可以是多种形式 ——
1: 操作系统注册的DSN名字
2:一个外部的DSN文件
3:可以被解释的字符串
1和2我们可以在管理面板的ODBC管理面板里面设置或者生成,但是无疑第3种形式更具备灵活性,连接Access的DSN字符串具备类似的形式:
"DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=xxx.mdb"
下面是一段用于获得某个指定的mdb文件的数据库连接的代码,函数会先检测是否系统已有该文件的数据库连接,如果有则再检查该连接是否已打开,如果已打开则直接返回,如果有连接但处于关闭状态中则打开后返回,如果还未有任何连接则创建一个新的连接,打开后返回。最后打开失败会抛出一个KDBException异常。
QT自带有QODBC Driver,在Windows平台上通过系统提供的ODBC Driver可以访问支持ODBC的数据库,如Ms Access、SQL Server等 (Windows XP 自带有Access和SQL Server的ODBC Driver)。
QT数据库模型的基础类是QSqlDatabase对象,拥有一个QSqlDatabase对象代表着拥有一个数据库的连接,在一个已经Open的QSqlDatabase对象上,我们就可以执行各种数据库操作。
要得到一个QSqlDatabase对象的方法是QSqlDatabase的静态函数addDatabase,它创建一个新的QSqlDatabase对象,并注册在内部的Hash表中,最后返回该对象。 (另外静态函数database可用于查询一个已经注册的QSqlDatabase对象)
当我们得到一个新的还没有Open的QSqlDatabase对象,我们要先设置数据库的DSN(Data Source Name),DSN的设置是通过成员函数setDatabaseName,在QODBC中,DSN可以是多种形式 ——
1: 操作系统注册的DSN名字
2:一个外部的DSN文件
3:可以被解释的字符串
1和2我们可以在管理面板的ODBC管理面板里面设置或者生成,但是无疑第3种形式更具备灵活性,连接Access的DSN字符串具备类似的形式:
"DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=xxx.mdb"
下面是一段用于获得某个指定的mdb文件的数据库连接的代码,函数会先检测是否系统已有该文件的数据库连接,如果有则再检查该连接是否已打开,如果已打开则直接返回,如果有连接但处于关闭状态中则打开后返回,如果还未有任何连接则创建一个新的连接,打开后返回。最后打开失败会抛出一个KDBException异常。
QSqlDatabase KDBConnection::getAccessConnection(
const QString & accessFile, const QString & userName,
const QString & password)
... {
const QString PREFIX("puremilk.access.connection");
QString connID = PREFIX + "-" + accessFile;
QSqlDatabase connection = QSqlDatabase::database(connID, false);
if (connection.isValid())
...{
if (connection.isOpen())
return connection;
}
else
connection = QSqlDatabase::addDatabase("QODBC", connID);
QString dsn = QString(
"DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=%1").arg(accessFile);
qDebug()<<"Get Access Database connection - "<<dsn;
connection.setDatabaseName(dsn);
if (!connection.open(userName, password))
...{
THROW_EXCEPTION(KDBException, connection.lastError().text());
}
return connection;
}
const QString & accessFile, const QString & userName,
const QString & password)
... {
const QString PREFIX("puremilk.access.connection");
QString connID = PREFIX + "-" + accessFile;
QSqlDatabase connection = QSqlDatabase::database(connID, false);
if (connection.isValid())
...{
if (connection.isOpen())
return connection;
}
else
connection = QSqlDatabase::addDatabase("QODBC", connID);
QString dsn = QString(
"DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=%1").arg(accessFile);
qDebug()<<"Get Access Database connection - "<<dsn;
connection.setDatabaseName(dsn);
if (!connection.open(userName, password))
...{
THROW_EXCEPTION(KDBException, connection.lastError().text());
}
return connection;
}