原文出处:http://zhan.renren.com/cxymst?gid=3602888498027818437&from=template&checked=true
QSqlQuery类提供了一种执行和操纵SQL语句的方式。 详情请见……
#include <qsqlquery.h>
被QSqlCursor继承。
公有成员
-
QSqlQuery ( QSqlResult * r )
-
QSqlQuery ( const QString & query = QString::null, QSqlDatabase * db = 0 )
-
QSqlQuery ( const QSqlQuery & other )
-
QSqlQuery & operator= ( const QSqlQuery & other )
-
virtual ~QSqlQuery ()
-
bool isValid () const
-
bool isActive () const
-
bool isNull ( int field ) const
-
int at () const
-
QString lastQuery () const
-
int numRowsAffected () const
-
QSqlError lastError () const
-
bool isSelect () const
-
int size () const
-
const QSqlDriver * driver () const
-
const QSqlResult * result () const
-
virtual bool exec ( const QString & query )
-
virtual QVariant value ( int i ) const
-
virtual bool seek ( int i, bool relative = FALSE )
-
virtual bool next ()
-
virtual bool prev ()
-
virtual bool first ()
-
virtual bool last ()
保护成员
-
virtual void beforeSeek ()
-
virtual void afterSeek ()
详细描述
QSqlQuery类提供了一种执行和操纵SQL语句的方式。
QSqlQuery包括了所有的功能,像在一个QSqlDatabase上执行SQL查询创建、导航和索取数据等等。 它可以执行DML(数据操作语言)语句,比如 SELECT, INSERT, UPDATE 和 DELETE, 还可以执行DDL(数据定义语言)语句,比如:CREATE TABLE。 不仅如此,它还可以用于执行特定数据库而不是标准SQL语句的指令(比如 SET DATESTYLE=ISO 用于 PostgreSQL).
成功执行一SQL语句设置query为活动状态( isActive() 返回TRUE)否则查询置为非活动状态。无论那种情况,执行一条新的 SQL 语句之后,查询都被定位在一个无效的记录上;所以在数据被获取之前,查询都必须被导航到一个有效的记录上 (isValid()可以确定查询是否处在一个有效的记录上)。
在记录之间进行导航用以下一条函数:
这些函数允许程序员向前、向后或随心所欲地在查询返回的记录之间移动。一旦一个处于活动状态的查询 被定位在一个有效的记录上时,就可以通过value()获取数据。所有的数据都被用QVariants从SQL后端转换过来。
比如:
QSqlQuery query( "select name from customer" ); while ( query.next() ) { QString name = query.value(0).toString(); doSomething( name ); }
要获得从一个查询中返回的数据,用value()方法。由SELECT语句返回的数据中的每个域可以通过指定一个索引来访问,索引从0开始。没有一个方法可以通过指定名字来定位域的,因为这不能得到可能确认。(请看QSqlCursor,它提供一个更加有弹性的接口用于从一个表单中选择数据或在一个数据库中查看数据)。
也可以参考QSqlDatabase、QSqlCursor、QVariant和数据库类。
成员函数文档
QSqlQuery::QSqlQuery ( QSqlResult * r )
创建一个QSqlQuery对象,用QSqlResult r 用于和一个数据库进行通信。
QSqlQuery::QSqlQuery ( const QString & query = QString::null, QSqlDatabase * db = 0 )
用 SQL query 和数据库db创建一个QSqlQuery对象。如果db为0(默认),则使用程序的默认数据库。
也可以参考QSqlDatabase。
QSqlQuery::QSqlQuery ( const QSqlQuery & other )
构建一个other的副本。
QSqlQuery::~QSqlQuery () [virtual]
清空此对象并释放所有的资源。
void QSqlQuery::afterSeek () [virtual protected]
保护虚函数,当内部记录指针被移动到一个新的记录时被调用。默认的操作什么都不做。
int QSqlQuery::at () const
返回查询的当前的内部位置。第一个记录的位置是0。如果位置是无效的,一个描述无效位置的QSql::Location将返回。
S也可以参考 isValid()。
例子: sql/overview/navigating/main.cpp。
void QSqlQuery::beforeSeek () [virtual protected]
保护虚函数,内部记录指针被移动到一个新的记录之前被调用。默认的操作什么都不做。
const QSqlDriver * QSqlQuery::driver () const
返回一个指向与查询对应的数据库驱动的指针。
bool QSqlQuery::exec ( const QString & query ) [virtual]
执行 SQL query。如果查询成功了便设置查询的状态为活动,并且返回TRUE。否则返回false并且查询变为非活动状态。 query 语句必须必须符合数据数据库的语法要求,比如说,标准的SQL。
执行之后,查询被定位在一个无效的记录上,所以在获得数据之前,必须先导航到一个有效的记录上。
注意:执行exec()之后,查询的最后错误会被得新设置。
也可以参考 isActive()、isValid()、next()、prev()、first()、last() 和 seek()。
例子: sql/overview/basicbrowsing/main.cpp、sql/overview/basicbrowsing2/main.cpp 和 sql/overview/basicdatamanip/main.cpp。
bool QSqlQuery::first () [virtual]
检索结果集中的第一个记录,如果有效的话,还将定位查询在检索的记录上。注意,在调用这个函数之前,结果集必须处于一个有效的状态,并且 isSelect() 必须返回TRUE,否则它将什么都不做,返回FALSE。成功执行返回TRUE。如果不成功,查询被设置到一个无效的位置上,并返回FALSE。
例子: sql/overview/navigating/main.cpp。
bool QSqlQuery::isActive () const
如果查询当前是处于一个活动的状态返回 TRUE,否则返回 FALSE。
例子:sql/overview/basicbrowsing/main.cpp、sql/overview/basicbrowsing2/main.cpp、sql/overview/basicdatamanip/main.cpp、sql/overview/navigating/main.cpp和 sql/overview/retrieve1/main.cpp。
bool QSqlQuery::isNull ( int field ) const
如果field 当前为 NULL 返回,否则返回 FALSE 。在调用这个函数之前,查询必须是活动的并且被定位在一个有效的记录上,否则将返回 FALSE 。注意,对于一些驱动来说,isNull() 不会返回准确的信息,直到尝试去检索数据。
也可以参考 isActive()、isValid() 和 value()。
bool QSqlQuery::isSelect () const
如果当前的查询是 SELECT 语句返回TRUE,否则返回 FALSE。
bool QSqlQuery::isValid () const
如果查询当前处在一个有效的记录上返回TRUE,否则返回FALSE。
bool QSqlQuery::last () [virtual]
R检索结果集中的最后一个记录,如果有效的话,将定位查询在检索的记录上。注意,在调用这个函数之前,结果集必须处于有效的状态,而且 isSelect() 必须返回 TRUE。否则它将什么都不做还返回 FALSE。如果成功将返回 TRUE。如果失败查询被定位到一个无效的位置上并且返回FALSE。
例子:sql/overview/navigating/main.cpp。
QSqlError QSqlQuery::lastError () const
返回最后产生的错误信息。
也可以参考 QSqlError。
QString QSqlQuery::lastQuery () const
返回当前正被使用的查询的文本,如果没有查询文本则返回 QString::null。
bool QSqlQuery::next () [virtual]
在结果集中检索下一个记录,如果有效,定位查询在被检索的记录上。注意,在调用这个函数之前,结果集必须处于有效的状态,而且isSelect() 必须返回 TRUE。否则它将什么都不做返回 FALSE。
应用以下一些规则:
- 如果如果集被定位在第一个记录之前,刚刚执行完一个查询就处于这种状态,那么可以用此函数来检索第一个记录。
- 如果如果集被定位在最后一个记录之后,那么什么都不会改变,返回FALSE。
- 如果结果集被定位在中间,此函数可以检索下一个记录。
如果记录不能被检索,结果集将被定位在最后一个记录之后,并返回 FALSE 。如果记录成功检索,那么返回 TRUE 。
例子:sql/overview/basicbrowsing/main.cpp、sql/overview/basicbrowsing2/main.cpp、sql/overview/retrieve1/main.cpp、sql/overview/subclass3/main.cpp、sql/overview/subclass4/main.cpp、sql/overview/subclass5/main.cpp和sql/sqltable/main.cpp。
int QSqlQuery::numRowsAffected () const
返回有多少行记录被结果集的 SQL 语句影响了,如果不能确定将返回 -1 。注意,对于 SELECT语句,此值等同于 size()如果查询处于非活动状态(isActive()返回FALSE),将反回 -1。
也可以参考 size() 和 QSqlDriver::hasFeature()。
例子: sql/overview/basicbrowsing2/main.cpp 和 sql/overview/basicdatamanip/main.cpp。
QSqlQuery & QSqlQuery::operator= ( const QSqlQuery & other )
分配other 给查询。
bool QSqlQuery::prev () [virtual]
在结果集中检索前一个记录,如果有效,查询被这位在检索的记录上。注意,在调用这个函数之前,结果集必须处于有效的状态,而且isSelect() 必须返回 TRUE。否则它将什么都不做返回 FALSE。
应用以下一些规则:
- 如果结果集被定位在第一个记录之前,什么都不会改变,返回 FALSE。
- 如果结果集被定位在最后一个记录之后,调用此函数可以检索到最后一个记录。
- 如果结果集被定位在中间位置,调用此函数可以检索前一个记录。
如果记录不能被检索,结果集将被定位在第一个记录之前,并返回 FALSE 。如果记录成功检索,那么返回 TRUE 。
也可以参考 at()。
const QSqlResult * QSqlQuery::result () const
返回查询对应的指针。
bool QSqlQuery::seek ( int i, bool relative = FALSE ) [virtual]
检索位置为 i(偏移) 的记录,如果有效,查询被定位在检索的记录上。第一个记录在位置0上。注意,在调用这个函数之前,查询必须处于活动状态,而且 isSelect() 必须返回TRUE。
应用以下一些规则:
如果 relative 为FALSE(默认), 应用以下规则:
- 如果i 是负的,结果集被定位在第一个记录之前,并返回 FALSE。
- 否则,将定位查询到位置 i 。如果位置 i 上的记录不能被检索,结果集被定位到最后一个记录之后返回FALSE。如果记录被成功检索,返回TRUE。
如果 relative为TRUE,应用以下规则:
- 如果结果集当前处于第一个记录之前,或者就在第一个记录之上,而且 i 是负的,那么什么都不会改变,FALSE 将被返回。
- 如果结果集处于在最后一个记录之后,而且 i 是负的,那么什么都不改变,返回 FALSE。
- 如果结果集处于中间的某个位置,相对偏移量 i 移动结果集在0 之下,那么结果集将定位在第一个记录之前,返回FALSE。
- 否则,调用此函数将向前移动结果集到记录 i (或者向后移动到记录i如果i 是负的)。如果记录偏移量 i不能被检索,当那么i >=0时,结果集将被定位在最后一个记录之后(或者当i是负时,在第一个记录之前),返回 FALSE。如果记录成功检索,返回TRUE。
例子: sql/overview/navigating/main.cpp。
int QSqlQuery::size () const
返回结果集的大小,(多少行被返回),如果大小不能确定或者数据库不支持报告查询大小的信息时返回-1。注意,对于那些非 SELECT 语句(isSelect()返回FALSE), size() 将返回 -1,如果查询处于非活动状态(isActive()返回FALSE),将返回-1。
想得一个非 SELECT 语句影响的行数,用 numRowsAffected()。
也可以参考 isActive()、numRowsAffected() 和 QSqlDriver::hasFeature()。
例子 sql/overview/navigating/main.cpp。
QVariant QSqlQuery::value ( int i ) const [virtual]
返回域 i 的值(基于0)。
用SELECT 语句的文本,域被从左到右编号,比如:在"select forename, surname from people",域0是forename 而域1 是surname。推荐使用 SELECT * * 语句,因为这样的话查询中的域没有定义。
如果域 i 不存在的话,如果查询处于非活动状态,或查询被定位在一个无效的记录上,一个无效的QVariant被返回。
也可以参考 prev()、next()、first()、last()、seek()、isActive()和isValid()。
例子:sql/overview/basicbrowsing/main.cpp、sql/overview/basicbrowsing2/main.cpp、sql/overview/retrieve1/main.cpp、sql/overview/subclass3/main.cpp、sql/overview/subclass4/main.cpp、sql/overview/subclass5/main.cpp和sql/sqltable/main.cpp。