- The QSqlDatabase class 对连接的数据库进行操作
Header: #include <QSqlDatabase>
qmaker: Qt += sql
- 关于函数的详细的描述
QSqlDatabase 类对连接的数据库进行操作
QSqlDatabase类提供了通过连接来访问数据库的接口,一个QSqlDatabase的名称为代表一个连接。这个连接提供了一种支持的数据库驱动的数据库的访问接口,这个数据库驱动可以从QSqlDriver类中去导出,或者你可以基于QSqlDriver类中创建自己的子类,这一点请看:
通过使用static addDatabase()功能来创造一个连接,你可以指定一个驱动或者驱动的类型来使用(取决于数据库的类型)和一个连接的名字,一个连接是通过其名字来判断的,而不是通过连接的数据库的名称,你可以对一个数据库有很多的连接,QSqlDatabase也支持默认连接(没有命名的连接)的概念,为了创建默认的连接,当使用addDatabase()函数的时候不要略过连接的名称原则,如果你使用任何静态成员函数而不指定连接的名字,默认的连接将会指定,下面的代码段展示了如何创造和打开一个到PostfreSQL 数据库的默认连接:
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("acidalia");
db.setDatabaseName("customdb");
db.setUserName("mojito");
db.setPassword("J0a1m8");
bool ok = db.open();
一旦QSqlDatabase项目被创建后,就可以通过setDatabaseName(), setUserName(), setPassword(), setHostName(), setPort(), 和setConnectOptions()来设置连接的数据库的参数,然后使用open()函数来激活对数据库的物理连接,连接是不可使用的,除非激活它。
上面定义的连接是默认的连接,因为我们没有给addDatabase()一个连接的名称,你可以使用database()函数来得到默认的连接而不使用连接的名称。
QSqlDatabase db = QSqlDatabase::database();
QSqlDatabase是一个带值的类,每一个对数据的改变都会影响连接到此数据库的其他值,使用cloneDatabase()来基于一个存在的数据库创建独立的连接。
- 警告:特别建议的是不要保留一个QSqlDatabase()的副本来做为类的一部分,这样会阻值这个示例在关闭的时候不能被销毁,如果你想访问一个存在的数据库,应该使用database()来访问,如果你想有一个QSqlDatabase的成员变量,这需要你在QCoreApplication销毁前销毁它,要不然会有意想不到的后果。
如果你想创造多个数据库连接,请指定每一个连接的名称都唯一,当你使用addDatabase()的时候,使用database()和连接的名称来得到这个连接,使用removeDatadbase()和连接的名称来移除这个连接,QSqlDatabase输出一个异常,如果你尝试通过其他的QSqlDatabase对象来移除一个连接,使用contains()来看是否一个给定的连接的名称在连接的列表中。
一些实用的方法 | |
---|---|
tables() | 返回tables的列表 |
primaryindex() | 返回表的主要的列 |
record() | 返回表的域的变化信息 |
transaction() | 开始一个事务 |
commit() | 保存并完成一个事务 |
rollback() | 取消一个事务 |
hasFeature() | 检查是否驱动支持这个事务 |
lastError() | 返回最后一个错误的信息 |
drivers() | 返回可用的SQL驱动 |
isDriverAvailable() | 检查这个驱动是否可用 |
registerAqlDriver() | 登记一个客户驱动 |
- 注意:QSqlDatabase::exec()是不可以用的,使用QSqlQuery::exec()来代替
- 注意:当使用事务时,你必须在创建查询前开始这个事务
其他部分可以看:QSqlDriver, QSqlQuery, 和 Threads and SQL Module.
- 成员功能文档
- QSqlDatabase::QSqlDatabase()
创建一个空的,无效的QSqlDatabase对象,使用addDatabase(), removeDatabase(), 和database()来得到有效的QSqlDatabase对象 - QSqlDatabase::QSqlDatabase(const QSqlDatabase &other)
创建一个其他的副本 - QSqlDatabase::QSqlDatabase(const QString &type) [私有的]
这是一个重载函数
创建一个QSqlDatabase的连接,使用指定的驱动类型,如果这个类型不能被识别,这个数据库的连接是无效的。
现在可以使用的驱动类型如下:
驱动类型 | 描述 |
---|---|
QDB2 | IBM DB2 |
QIBASE | Borland InterBase Driver |
QMYSQL | MySQL 驱动 |
QOCI | Oracle 调用接口驱动 |
QODBC | ODBC 驱动(包括微软的SQL服务) |
QPSQL | PostgreSQL 驱动 |
QSQLITE | SQL 3或者更高 |
QSQLITE2 | SQLite 2 |
QTDS | Sybase Adaptive server |
如果需要第三方驱动的支持,包括自己的第三方驱动,可以被动态的加载
其他的部分可以看:SQL Database Drivers, registerSqlDriver(), and drivers().
-
QSqlDatabase::QSqlDatabase(QSqlDriver *driver()) [私有的]
这是一个重载函数
使用给定的驱动创造一个数据库 -
QSqldatabase::~QSqlDatabase()
销毁这个对象,销毁所有的存在连接的源
注意:当最后一个连接被销毁的时候,析构函数会隐式调用close()函数如释放数据库连接
其他的部分请看close() -
QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin 1 String(defaultConnection)) [静态]
使用驱动类型添加一个数据库到数据库的连接列表中,而且连接的名字为连接名,如果已经存在一个名为连接的名字的数据库连接,这个连接会被移除。
数据库通过连接名被引用,新添加的数据库的连接被返回。
如果这个类型不存在或者不能被加载,isVaild()函数将返回false.
如果连接名没有被规定,新的连接将会变成对应用的默认连接,后面的对于database()的不带连接名的声明的内容将会返回默认的连接,如果一个连接名在这里是私有的,使用database(连接名)来返回这个连接。
警告:如果你添加了一个现在存在的连接相同名字的连接,新的连接将会取代旧的,如果你多次没有指定连接的名的调用这个函数,默认的连接将会被替代。
注意:这个功能是线程安全的
其他的部分请看database(), removeDatabase(), 和Threads and the SQL Module