Home · All Classes · Modules  · QSS HELP  · QSS 案例 · VER007 HOME

QSqlDatabase Class Reference
[QtSql module]

该QSqlDatabase类表示一个到数据库的连接。More...

Methods

Static Methods


Detailed Description

该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( ) 。


Method Documentation

QSqlDatabase.__init__ (self)

创建一个空的,无效的QSqlDatabase对象。使用addDatabase( )removeDatabase()和database( )来获取有效的QSqlDatabase对象。

QSqlDatabase.__init__ (self, QSqlDatabase other)

创建副本other

QSqlDatabase.__init__ (self, QString type)

这是一个重载函数。

创建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 DriversregisterSqlDriver()和drivers( ) 。

QSqlDatabase.__init__ (self, QSqlDriver driver)

这是一个重载函数。

创建使用给定的数据库连接driver

QSqlDatabase QSqlDatabase.addDatabase (QString type, QString connectionName = QLatin1String(QSqlDatabase.defaultConnection))

增加了一个数据库,以数据库连接使用的驱动程序的列表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

QSqlDatabase QSqlDatabase.addDatabase (QSqlDriver driver, QString connectionName = QLatin1String(QSqlDatabase.defaultConnection))

当你想创建一个数据库连接此重载很有用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( ) 。

QSqlDatabase QSqlDatabase.cloneDatabase (QSqlDatabase other, QString connectionName)

克隆数据库连接other和并将其存储为connectionName。所有从原始数据库的设置,例如databaseName( )hostName( )等,被复制的对面。什么都不做,如果other是一个无效的数据库。返回新创建的数据库连接。

Note:新的连接没有被打开。使用新的连接之前,你必须调用open( ) 。

QSqlDatabase.close (self)

关闭数据库连接,释放佔用的所有资源和无效的任何现有QSqlQuery所使用的数据库对象。

这也将影响到这个份QSqlDatabase对象。

See also removeDatabase( ) 。

bool QSqlDatabase.commit (self)

提交事务对数据库如果驱动程序支持事务和transaction( )已经启动。回报true如果操作成功。否则返回false

Note:对于某些数据库,提交会失败,并返回false如果有一个active query使用该数据库的SELECT。使查询inactive在做之前提交。

Call lastError( )以获取有关错误的信息。

See also QSqlQuery.isActive( )QSqlDriver.hasFeature()和rollback( ) 。

QString QSqlDatabase.connectionName (self)

返回连接的名称,这可能是空的。Note:连接名称是不database name

此功能被引入Qt的4.4 。

See also addDatabase( ) 。

QStringList QSqlDatabase.connectionNames ()

返回一个包含所有连接的名称的列表。

Note:这个功能是thread-safe

See also contains( )database()和Threads and the SQL Module

QString QSqlDatabase.connectOptions (self)

返回用于该连接的连接选项字符串。该字符串可能是空的。

See also setConnectOptions( ) 。

bool QSqlDatabase.contains (QString connectionName = QLatin1String(QSqlDatabase.defaultConnection))

返回True如果数据库连接的列表中包含connectionName否则返回False 。

Note:这个功能是thread-safe

See also connectionNames( )database()和Threads and the SQL Module

QSqlDatabase QSqlDatabase.database (QString connectionName = QLatin1String(QSqlDatabase.defaultConnection), bool open = True)

返回称为数据库连接connectionName。数据库连接必须已经添加了addDatabase( ) 。如果open为True(默认值),数据库连接是不是已经打开,现在打开。如果没有connectionName是指定使用的默认连接。如果connectionName在数据库列表中不存在,则返回一个无效的连接。

Note:这个功能是thread-safe

See also isOpen()和Threads and the SQL Module

QString QSqlDatabase.databaseName (self)

返回连接的数据库名,它可能是空的。Note:数据库名是没有连接名称。

See also setDatabaseName( ) 。

QSqlDriver QSqlDatabase.driver (self)

返回用于访问数据库连接的数据库驱动程序。

See also addDatabase()和drivers( ) 。

QString QSqlDatabase.driverName (self)

返回连接的驱动程序名称。

See also addDatabase()和driver( ) 。

QStringList QSqlDatabase.drivers ()

返回所有可用的数据库驱动程序的列表。

See also registerSqlDriver( ) 。

QSqlQuery QSqlDatabase.exec_ (self, QString query = QString())

执行一条SQL语句在数据库上,并返回一个QSqlQuery对象。使用lastError( )来检索错误信息。如果query是空的,空的,无效的查询将返回和lastError()不受影响。

See also QSqlQuerylastError( ) 。

QString QSqlDatabase.hostName (self)

返回连接的主机名,它可能是空的。

See also setHostName( ) 。

bool QSqlDatabase.isDriverAvailable (QString name)

返回True如果一个叫做驱动程序name可用;否则返回False。

See also drivers( ) 。

bool QSqlDatabase.isOpen (self)

返回True如果数据库连接是当前打开,否则返回False 。

bool QSqlDatabase.isOpenError (self)

返回True如果有一个错误打开数据库连接,否则返回False 。错误信息可使用检索到的lastError()函数。

bool QSqlDatabase.isValid (self)

返回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

QSqlError QSqlDatabase.lastError (self)

返回有关数据库上发生的最后一个错误信息。

发生在与一个单独的查询相结合的故障报告通过QSqlQuery.lastError( ) 。

See also QSqlErrorQSqlQuery.lastError( ) 。

QSql.NumericalPrecisionPolicy QSqlDatabase.numericalPrecisionPolicy (self)

返回数据库连接的当前默认精度的政策。

此功能被引入Qt的4.6 。

See also QSql.NumericalPrecisionPolicysetNumericalPrecisionPolicy( )QSqlQuery.numericalPrecisionPolicy()和QSqlQuery.setNumericalPrecisionPolicy( ) 。

bool QSqlDatabase.open (self)

打开使用当前连接的值的数据库连接。成功时返回TRUE ,否则返回False 。错误信息可以使用检索lastError( ) 。

See also lastError( )setDatabaseName( )setUserName( )setPassword( )setHostName( )setPort()和setConnectOptions( ) 。

bool QSqlDatabase.open (self, QString user, QString password)

这是一个重载函数。

打开使用给定的数据库连接user命名并password。成功时返回TRUE ,否则返回False 。错误信息可使用检索到的lastError()函数。

此功能不能存储它被赋予的密码。相反,该密码被直接传递给驱动程序以打开连接且随后被丢弃。

See also lastError( ) 。

QString QSqlDatabase.password (self)

返回连接的密码。如果密码没有被设置setPassword( ),并且如果该密码是在给定的open( )调用,或者如果没有使用密码,则返回一个空字符串。

See also setPassword( ) 。

int QSqlDatabase.port (self)

返回连接的端口号。该值是不确定的,如果该端口号没有被设置。

See also setPort( ) 。

QSqlIndex QSqlDatabase.primaryIndex (self, QString tablename)

返回表的主索引tablename。如果没有主索引存在一个空QSqlIndex返回。

See also tables()和record( ) 。

QSqlRecord QSqlDatabase.record (self, QString tablename)

返回QSqlRecord在该表中的所有字段(或视图)的名称叫做填充tablename。在该领域出现的记录的顺序是不确定的。如果没有这样的表(或视图)存在,则返回一个空的记录。

QSqlDatabase.registerSqlDriver (QString name, QSqlDriverCreatorBase creator)

creator说法有它的所有权转移给Qt的。

此功能寄存器称为一个新的SQL驱动程序name,内部的SQL框架。如果你有一个自定义的SQL驱动程序,并且不希望将它编译为一个插件,这是很有用的。

例如:

 QSqlDatabase.registerSqlDriver("MYDRIVER",
                                 new QSqlDriverCreator<MyDatabaseDriver>);
 QSqlDatabase db = QSqlDatabase.addDatabase("MYDRIVER");

QSqlDatabase采取所有权creator指针,所以你一定不要自己将它删除。

See also drivers( ) 。

QSqlDatabase.removeDatabase (QString connectionName)

删除数据库连接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

bool QSqlDatabase.rollback (self)

回滚数据库事务,如果驱动程序支持事务和transaction( )已经启动。回报true如果操作成功。否则返回false

Note:对于某些数据库,回滚将失败,并返回false如果有一个active query使用该数据库的SELECT。使查询inactive之前做回滚。

Call lastError( )以获取有关错误的信息。

See also QSqlQuery.isActive( )QSqlDriver.hasFeature()和commit( ) 。

QSqlDatabase.setConnectOptions (self, QString options = QString())

设置数据库特定的options。这必须是打开连接前或不会有任何效果(或者你可以close( )的连接,调用这个函数,并open( )再次连线) 。

的格式options字符串是选项名或选项=值对的分号分隔的列表。该选项取决于所使用的数据库客户端上:

ODBC MySQL PostgreSQL
  • SQL_ATTR_ACCESS_MODE
  • SQL_ATTR_LOGIN_TIMEOUT
  • SQL_ATTR_CONNECTION_TIMEOUT
  • SQL_ATTR_CURRENT_CATALOG
  • SQL_ATTR_METADATA_ID
  • SQL_ATTR_PACKET_SIZE
  • SQL_ATTR_TRACEFILE
  • SQL_ATTR_TRACE
  • SQL_ATTR_CONNECTION_POOLING
  • SQL_ATTR_ODBC_VERSION
  • CLIENT_COMPRESS
  • CLIENT_FOUND_ROWS
  • CLIENT_IGNORE_SPACE
  • CLIENT_SSL
  • CLIENT_ODBC
  • CLIENT_NO_SCHEMA
  • CLIENT_INTERACTIVE
  • UNIX_SOCKET
  • MYSQL_OPT_RECONNECT
  • connect_timeout
  • options
  • tty
  • requiressl
  • service
DB2 OCI TDS
  • SQL_ATTR_ACCESS_MODE
  • SQL_ATTR_LOGIN_TIMEOUT
  • OCI_ATTR_PREFETCH_ROWS
  • OCI_ATTR_PREFETCH_MEMORY
none
SQLite Interbase
  • QSQLITE_BUSY_TIMEOUT
  • QSQLITE_OPEN_READONLY
  • QSQLITE_ENABLE_SHARED_CACHE
  • ISC_DPB_LC_CTYPE
  • ISC_DPB_SQL_ROLE_NAME

示例:

 ...
 // 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( ) 。

QSqlDatabase.setDatabaseName (self, QString name)

设置连接的数据库名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( ) 。

QSqlDatabase.setHostName (self, QString host)

设置连接的主机名host。有效,主机名必须设置before该连接是opened。或者,您可以close( )的连接,设置主机名,并调用open( )一次。

没有默认值。

See also hostName( )setUserName( )setPassword( )setDatabaseName( )setPort( )setConnectOptions()和open( ) 。

QSqlDatabase.setNumericalPrecisionPolicy (self, QSql.NumericalPrecisionPolicy precisionPolicy)

设置使用这个数据库连接创建查询的默认数值精度的政策precisionPolicy

注意:不支持用低精度取数值的驱动程序将忽略精度政策。您可以使用QSqlDriver.hasFeature( )来找出驱动程序是否支持此功能。

注意:默认精度策略设置来precisionPolicy不影响任何当前活动的查询。

此功能被引入Qt的4.6 。

See also QSql.NumericalPrecisionPolicynumericalPrecisionPolicy( )QSqlQuery.setNumericalPrecisionPolicy()和QSqlQuery.numericalPrecisionPolicy( ) 。

QSqlDatabase.setPassword (self, QString password)

设置连接的密码password。有效果,必须设置密码before该连接是opened。或者,您可以close( )的连接,设置密码,并调用open( )一次。

没有默认值。

Warning:此功能会将密码中的Qt纯文本。使用open( )调用,需要一个密码作为参数,以避免这种行为。

See also password( )setUserName( )setDatabaseName( )setHostName( )setPort( )setConnectOptions()和open( ) 。

QSqlDatabase.setPort (self, int p)

设置连接的端口号port。有效的端口号必须设置before该连接是opened。或者,您可以close( )的连接,设置端口号,并调用open( )再次..

没有默认值。

See also port( )setUserName( )setPassword( )setHostName( )setDatabaseName( )setConnectOptions()和open( ) 。

QSqlDatabase.setUserName (self, QString name)

设置连接的用户名name。有效果,用户名必须设置before该连接是opened。或者,您可以close( )的连接,设置用户名和调用open( )一次。

没有默认值。

See also userName( )setDatabaseName( )setPassword( )setHostName( )setPort( )setConnectOptions()和open( ) 。

QStringList QSqlDatabase.tables (self, QSql.TableType type = QSql.Tables)

返回数据库的表,系统表和视图的列表,所指定的参数type

See also primaryIndex()和record( ) 。

bool QSqlDatabase.transaction (self)

开始一个事务在数据库上,如果驱动程序支持的交易。回报true如果操作成功。否则返回false

See also QSqlDriver.hasFeature( )commit()和rollback( ) 。

QString QSqlDatabase.userName (self)

返回连接的用户名,它可能是空的。

See also setUserName( ) 。




PyQt 4.10.3 for X11 Copyright © Riverbank Computing Ltd and Nokia 2012 Qt 4.8.5