Home · All Classes · Modules · QSS HELP · QSS 案例 · VER007 HOME |
该QSqlDatabase类表示一个到数据库的连接。More...
该QSqlDatabase类表示一个到数据库的连接。
该QSqlDatabase类提供了通过连接访问数据库的接口。 QSqlDatabase的实例代表连接。连接经由一个可访问数据库supported database drivers,其衍生自QSqlDriver。或者,您也可以从继承自己的数据库驱动程序QSqlDriver。看How to Write Your Own Database Driver了解更多信息。
通过调用静态的创建一个连接(即QSqlDatabase的实例)addDatabase( )函数,在这里您可以指定the driver or type of driver使用(比如,你要访问什么样的数据库? )和一个连接名称。一个连接是由它自己的名字众所周知,not由数据库的名称将其连接到。你可以有多个连接到一个数据库。 QSqlDatabase还支持的概念default连接,这是未命名的连接。要创建默认的连接,当你调用不通过连接名称参数addDatabase( ) 。随后,当你调用任何静态成员函数,它的连接名称的说法,如果你不通过连接名称参数,则假定为默认连接。下面的代码片断显示了如何创建并打开一个默认连接到PostgreSQL数据库:
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( )来激活到数据库的物理连接。该连接不可用,直到你打开它。
上面定义的连接将是default连接,因为我们没有给一个连接名称addDatabase()。随后,您可以通过调用得到的默认连接database( )无连接名称参数:
QSqlDatabase db = QSqlDatabase.database();
QSqlDatabase是一个值类。通过QSqlDatabase的一个实例数据库连接所做的更改将影响QSqlDatabase ,代表相同的连接其他实例。使用cloneDatabase()来创建基于现有一个独立的数据库连接。
如果你创建多个数据库连接,为每一个指定一个唯一的连接名称,当你调用addDatabase( ) 。使用database( )有一个连接名称来获取连接。使用removeDatabase( )有一个连接名称删除的连接。如果您尝试删除其他QSqlDatabase对象引用的连接QSqlDatabase输出一个警告。使用contains( ),看看是否一个给定的连接名称为连接列表。
一旦建立了连接,你可以调用tables()来获取数据库中,调用表的列表primaryIndex()来获取一个表的主索引,并调用record( )来获取有关表的字段(例如,字段名)的元信息。
Note: QSqlDatabase.exec( )已过时。使用QSqlQuery.exec( )来代替。
如果驱动程序支持的交易,使用transaction( )来启动一个事务,commit()或rollback()来完成它。使用hasFeature()请问如果驱动程序支持的交易。Note:当使用事务时,必须启动该交易在创建查询之前。
如果一个错误发生,lastError( )将返回有关它的信息。
获取可用的SQL驱动程序的名称与drivers( ) 。检查与特定驱动程序的存在isDriverAvailable( ) 。如果您已经创建自己的自定义驱动程序,您必须进行注册registerSqlDriver( ) 。
创建一个空的,无效的QSqlDatabase对象。使用addDatabase( )removeDatabase()和database( )来获取有效的QSqlDatabase对象。
创建副本other。
这是一个重载函数。
创建QSqlDatabase使用由所述的驱动程序连接type。如果type无法识别,数据库连接将没有任何功能。
目前可用的驱动器类型有:
Driver Type | Description |
---|---|
QDB2 | IBM DB2 |
QIBASE | Borland InterBase Driver |
QMYSQL | MySQL Driver |
QOCI | Oracle Call Interface Driver |
QODBC | ODBC Driver (includes Microsoft SQL Server) |
QPSQL | PostgreSQL Driver |
QSQLITE | SQLite version 3 or above |
QSQLITE2 | SQLite version 2 |
QTDS | Sybase Adaptive Server |
额外的第三方驱动程序,包括您自己的自定义驱动程序,可以动态加载。
See also SQL Database Drivers,registerSqlDriver()和drivers( ) 。
这是一个重载函数。
创建使用给定的数据库连接driver。
增加了一个数据库,以数据库连接使用的驱动程序的列表type和连接名称connectionName。如果已经存在一个名为数据库连接connectionName,则该连接被删除。
数据库连接是通过被称为connectionName。返回新添加的数据库连接。
If type不可用或无法加载,isValid( )返回False 。
If connectionName没有指定,则新的连接成为应用程序的默认连接,并随后调用database( )无连接名称参数将返回默认的连接。如果connectionName这里提供的,使用的数据库(connectionName)来检索连接。
Warning:如果您添加了具有相同名称的现有连接的连接,新的连接将会取代旧的。如果你调用这个函数一次以上,而无需指定connectionName,默认的连接将是一个替代。
使用连接之前,它必须被初始化。例如,调用一些或全部setDatabaseName( )setUserName( )setPassword( )setHostName( )setPort()和setConnectOptions( ) ,最后是open( ) 。
Note:这个功能是thread-safe。
See also database( )removeDatabase()和Threads and the SQL Module。
当你想创建一个数据库连接此重载很有用driver你实例化你自己。这可能是你自己的数据库驱动程序,或者你可能只需要自己实例化Qt的驱动力之一。如果你这样做,建议您在您的应用程序的驱动程序代码。例如,您可以创建自己的QPSQL驱动这样一个PostgreSQL连接:
#include "qtdir/src/sql/drivers/psql/qsql_psql.cpp" PGconn *con = PQconnectdb("host=server user=bart password=simpson dbname=springfield"); QPSQLDriver *drv = new QPSQLDriver(con); QSqlDatabase db = QSqlDatabase.addDatabase(drv); // becomes the new default connection QSqlQuery query; query.exec_("SELECT NAME, ID FROM STAFF"); ...
上面的代码设置了一个PostgreSQL连接并实例化一个QPSQLDriver对象。接下来,addDatabase()被调用,以连接添加到已知的连接,这样它可用于通过Qt的SQL类。当驱动程序被实例化一个连接句柄(或一组手柄) , Qt的假设你已经打开了数据库连接。
Note:我们假设qtdir是安装Qt的目录。这将拉动中所需要使用的PostgreSQL客户端库和实例化一个QPSQLDriver对象的代码,假设你有PostgreSQL的头放在你的头文件搜索路径。
请记住,你必须链接您的应用程序对数据库客户端库。确保客户端库是在你的链接器的搜索路径,并添加像这些行到你的.pro文件:
unix:LIBS += -lpq win32:LIBS += libpqdll.lib
该方法描述的作品,所有提供的驱动程序。唯一的区别是在驱动程序构造器参数。下面是包含了Qt的驱动程序,其源代码文件,以及它们的构造函数的参数表:
Driver | Class name | Constructor arguments | File to include |
---|---|---|---|
QPSQL | QPSQLDriver | PGconn *connection | qsql_psql.cpp |
QMYSQL | QMYSQLDriver | MYSQL *connection | qsql_mysql.cpp |
QOCI | QOCIDriver | OCIEnv *environment, OCISvcCtx *serviceContext | qsql_oci.cpp |
QODBC | QODBCDriver | SQLHANDLE environment, SQLHANDLE connection | qsql_odbc.cpp |
QDB2 | QDB2 | SQLHANDLE environment, SQLHANDLE connection | qsql_db2.cpp |
QTDS | QTDSDriver | LOGINREC *loginRecord, DBPROCESS *dbProcess, const QString &hostName | qsql_tds.cpp |
QSQLITE | QSQLiteDriver | sqlite *connection | qsql_sqlite.cpp |
QIBASE | QIBaseDriver | isc_db_handle connection | qsql_ibase.cpp |
主机名称(或服务名称)正在建设中的QTDSDriver建立内部查询的新连接时需要。这是为了防止阻塞几个时QSqlQuery物同时使用。
Warning:添加具有相同的连接名称与现有连接的数据库连接,使现有连接被新的所取代。
Warning:在SQL框架采用的所有权driver。它不能被删除。要删除连接,请使用removeDatabase( ) 。
See also drivers( ) 。
克隆数据库连接other和并将其存储为connectionName。所有从原始数据库的设置,例如databaseName( )hostName( )等,被复制的对面。什么都不做,如果other是一个无效的数据库。返回新创建的数据库连接。
Note:新的连接没有被打开。使用新的连接之前,你必须调用open( ) 。
关闭数据库连接,释放佔用的所有资源和无效的任何现有QSqlQuery所使用的数据库对象。
这也将影响到这个份QSqlDatabase对象。
See also removeDatabase( ) 。
提交事务对数据库如果驱动程序支持事务和transaction( )已经启动。回报true如果操作成功。否则返回false。
Note:对于某些数据库,提交会失败,并返回false如果有一个active query使用该数据库的SELECT。使查询inactive在做之前提交。
Call lastError( )以获取有关错误的信息。
See also QSqlQuery.isActive( )QSqlDriver.hasFeature()和rollback( ) 。
返回连接的名称,这可能是空的。Note:连接名称是不database name。
此功能被引入Qt的4.4 。
See also addDatabase( ) 。
返回一个包含所有连接的名称的列表。
Note:这个功能是thread-safe。
See also contains( )database()和Threads and the SQL Module。
返回用于该连接的连接选项字符串。该字符串可能是空的。
See also setConnectOptions( ) 。
返回True如果数据库连接的列表中包含connectionName否则返回False 。
Note:这个功能是thread-safe。
See also connectionNames( )database()和Threads and the SQL Module。
返回称为数据库连接connectionName。数据库连接必须已经添加了addDatabase( ) 。如果open为True(默认值),数据库连接是不是已经打开,现在打开。如果没有connectionName是指定使用的默认连接。如果connectionName在数据库列表中不存在,则返回一个无效的连接。
Note:这个功能是thread-safe。
See also isOpen()和Threads and the SQL Module。
返回连接的数据库名,它可能是空的。Note:数据库名是没有连接名称。
See also setDatabaseName( ) 。
返回用于访问数据库连接的数据库驱动程序。
See also addDatabase()和drivers( ) 。
返回连接的驱动程序名称。
See also addDatabase()和driver( ) 。
返回所有可用的数据库驱动程序的列表。
See also registerSqlDriver( ) 。
执行一条SQL语句在数据库上,并返回一个QSqlQuery对象。使用lastError( )来检索错误信息。如果query是空的,空的,无效的查询将返回和lastError()不受影响。
See also QSqlQuery和lastError( ) 。
返回连接的主机名,它可能是空的。
See also setHostName( ) 。
返回True如果一个叫做驱动程序name可用;否则返回False。
See also drivers( ) 。
返回True如果数据库连接是当前打开,否则返回False 。
返回True如果有一个错误打开数据库连接,否则返回False 。错误信息可使用检索到的lastError()函数。
返回True如果QSqlDatabase有一个有效的驱动程序。
例如:
QSqlDatabase db; qDebug() << db.isValid(); // Returns false db = QSqlDatabase.database("sales"); qDebug() << db.isValid(); // Returns true if "sales" connection exists QSqlDatabase.removeDatabase("sales"); qDebug() << db.isValid(); // Returns false
返回有关数据库上发生的最后一个错误信息。
发生在与一个单独的查询相结合的故障报告通过QSqlQuery.lastError( ) 。
See also QSqlError和QSqlQuery.lastError( ) 。
返回数据库连接的当前默认精度的政策。
此功能被引入Qt的4.6 。
See also QSql.NumericalPrecisionPolicy,setNumericalPrecisionPolicy( )QSqlQuery.numericalPrecisionPolicy()和QSqlQuery.setNumericalPrecisionPolicy( ) 。
打开使用当前连接的值的数据库连接。成功时返回TRUE ,否则返回False 。错误信息可以使用检索lastError( ) 。
See also lastError( )setDatabaseName( )setUserName( )setPassword( )setHostName( )setPort()和setConnectOptions( ) 。
这是一个重载函数。
打开使用给定的数据库连接user命名并password。成功时返回TRUE ,否则返回False 。错误信息可使用检索到的lastError()函数。
此功能不能存储它被赋予的密码。相反,该密码被直接传递给驱动程序以打开连接且随后被丢弃。
See also lastError( ) 。
返回连接的密码。如果密码没有被设置setPassword( ),并且如果该密码是在给定的open( )调用,或者如果没有使用密码,则返回一个空字符串。
See also setPassword( ) 。
返回连接的端口号。该值是不确定的,如果该端口号没有被设置。
See also setPort( ) 。
返回表的主索引tablename。如果没有主索引存在一个空QSqlIndex返回。
返回QSqlRecord在该表中的所有字段(或视图)的名称叫做填充tablename。在该领域出现的记录的顺序是不确定的。如果没有这样的表(或视图)存在,则返回一个空的记录。
该creator说法有它的所有权转移给Qt的。
此功能寄存器称为一个新的SQL驱动程序name,内部的SQL框架。如果你有一个自定义的SQL驱动程序,并且不希望将它编译为一个插件,这是很有用的。
例如:
QSqlDatabase.registerSqlDriver("MYDRIVER", new QSqlDriverCreator<MyDatabaseDriver>); QSqlDatabase db = QSqlDatabase.addDatabase("MYDRIVER");
QSqlDatabase采取所有权creator指针,所以你一定不要自己将它删除。
See also drivers( ) 。
删除数据库连接connectionName从数据库连接列表中。
Warning:不应该有开放的查询时,这个函数被调用的数据库连接上,否则会发生资源洩漏。
例如:
// 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
做正确的方法:
{ 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
要删除默认的连接,它可能已经创建了一个调用addDatabase( )不指定连接名,你可以通过调用检索默认连接名称connectionName( )返回的数据库上database( ) 。请注意,如果尚未创建一个默认的数据库无效的数据库将被退回。
Note:这个功能是thread-safe。
See also database( )connectionName()和Threads and the SQL Module。
回滚数据库事务,如果驱动程序支持事务和transaction( )已经启动。回报true如果操作成功。否则返回false。
Note:对于某些数据库,回滚将失败,并返回false如果有一个active query使用该数据库的SELECT。使查询inactive之前做回滚。
Call lastError( )以获取有关错误的信息。
See also QSqlQuery.isActive( )QSqlDriver.hasFeature()和commit( ) 。
设置数据库特定的options。这必须是打开连接前或不会有任何效果(或者你可以close( )的连接,调用这个函数,并open( )再次连线) 。
的格式options字符串是选项名或选项=值对的分号分隔的列表。该选项取决于所使用的数据库客户端上:
ODBC | MySQL | PostgreSQL |
---|---|---|
|
|
|
DB2 | OCI | TDS |
|
|
none |
SQLite | Interbase | |
|
|
示例:
... // MySQL connection db.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1"); // use an SSL connection to the server if (!db.open()) { db.setConnectOptions(); // clears the connect option string ... } ... // PostgreSQL connection db.setConnectOptions("requiressl=1"); // enable PostgreSQL SSL connections if (!db.open()) { db.setConnectOptions(); // clear options ... } ... // ODBC connection db.setConnectOptions("SQL_ATTR_ACCESS_MODE=SQL_MODE_READ_ONLY;SQL_ATTR_TRACE=SQL_OPT_TRACE_ON"); // set ODBC options if (!db.open()) { db.setConnectOptions(); // don't try to set this option ... }
请参阅客户端库文件有关不同选项的详细信息。
See also connectOptions( ) 。
设置连接的数据库名name。有效果,数据库名称必须设置before该连接是opened。或者,您可以close( )的连接,设置数据库名,调用open( )一次。Note:该database name是不connection name。连接名称必须传递给addDatabase( )在连接对象创建的时间。
对于QOCI ( Oracle)的驱动程序,数据库名是TNS服务名称。
为QODBC驱动程序,name可以是一个DSN , DSN的一个文件名(在这种情况下,该文件必须有一个.dsn扩展名) ,或连接字符串。
例如, Microsoft Access中用户可以使用下面的连接字符串打开一个.mdb直接文件,而不必在ODBC管理器创建一个DSN入口, :
... db = QSqlDatabase.addDatabase("QODBC"); db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb"); if (db.open()) { // success! } ...
没有默认值。
See also databaseName( )setUserName( )setPassword( )setHostName( )setPort( )setConnectOptions()和open( ) 。
设置连接的主机名host。有效,主机名必须设置before该连接是opened。或者,您可以close( )的连接,设置主机名,并调用open( )一次。
没有默认值。
See also hostName( )setUserName( )setPassword( )setDatabaseName( )setPort( )setConnectOptions()和open( ) 。
设置使用这个数据库连接创建查询的默认数值精度的政策precisionPolicy。
注意:不支持用低精度取数值的驱动程序将忽略精度政策。您可以使用QSqlDriver.hasFeature( )来找出驱动程序是否支持此功能。
注意:默认精度策略设置来precisionPolicy不影响任何当前活动的查询。
此功能被引入Qt的4.6 。
See also QSql.NumericalPrecisionPolicy,numericalPrecisionPolicy( )QSqlQuery.setNumericalPrecisionPolicy()和QSqlQuery.numericalPrecisionPolicy( ) 。
设置连接的密码password。有效果,必须设置密码before该连接是opened。或者,您可以close( )的连接,设置密码,并调用open( )一次。
没有默认值。
Warning:此功能会将密码中的Qt纯文本。使用open( )调用,需要一个密码作为参数,以避免这种行为。
See also password( )setUserName( )setDatabaseName( )setHostName( )setPort( )setConnectOptions()和open( ) 。
设置连接的端口号port。有效的端口号必须设置before该连接是opened。或者,您可以close( )的连接,设置端口号,并调用open( )再次..
没有默认值。
See also port( )setUserName( )setPassword( )setHostName( )setDatabaseName( )setConnectOptions()和open( ) 。
设置连接的用户名name。有效果,用户名必须设置before该连接是opened。或者,您可以close( )的连接,设置用户名和调用open( )一次。
没有默认值。
See also userName( )setDatabaseName( )setPassword( )setHostName( )setPort( )setConnectOptions()和open( ) 。
返回数据库的表,系统表和视图的列表,所指定的参数type。
See also primaryIndex()和record( ) 。
开始一个事务在数据库上,如果驱动程序支持的交易。回报true如果操作成功。否则返回false。
See also QSqlDriver.hasFeature( )commit()和rollback( ) 。
返回连接的用户名,它可能是空的。
See also setUserName( ) 。
PyQt 4.10.3 for X11 | Copyright © Riverbank Computing Ltd and Nokia 2012 | Qt 4.8.5 |