source: trunk/src/sql/kernel/qsqlquery.cpp@ 636

Last change on this file since 636 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 37.4 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtSql module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qsqlquery.h"
43
44//#define QT_DEBUG_SQL
45
46#include "qatomic.h"
47#include "qsqlrecord.h"
48#include "qsqlresult.h"
49#include "qsqldriver.h"
50#include "qsqldatabase.h"
51#include "private/qsqlnulldriver_p.h"
52#include "qvector.h"
53#include "qmap.h"
54
55QT_BEGIN_NAMESPACE
56
57class QSqlQueryPrivate
58{
59public:
60 QSqlQueryPrivate(QSqlResult* result);
61 ~QSqlQueryPrivate();
62 QAtomicInt ref;
63 QSqlResult* sqlResult;
64
65 static QSqlQueryPrivate* shared_null();
66};
67
68Q_GLOBAL_STATIC_WITH_ARGS(QSqlQueryPrivate, nullQueryPrivate, (0))
69Q_GLOBAL_STATIC(QSqlNullDriver, nullDriver)
70Q_GLOBAL_STATIC_WITH_ARGS(QSqlNullResult, nullResult, (nullDriver()))
71
72QSqlQueryPrivate* QSqlQueryPrivate::shared_null()
73{
74 QSqlQueryPrivate *null = nullQueryPrivate();
75 null->ref.ref();
76 return null;
77}
78
79/*!
80\internal
81*/
82QSqlQueryPrivate::QSqlQueryPrivate(QSqlResult* result)
83 : ref(1), sqlResult(result)
84{
85 if (!sqlResult)
86 sqlResult = nullResult();
87}
88
89QSqlQueryPrivate::~QSqlQueryPrivate()
90{
91 QSqlResult *nr = nullResult();
92 if (!nr || sqlResult == nr)
93 return;
94 delete sqlResult;
95}
96
97/*!
98 \class QSqlQuery
99 \brief The QSqlQuery class provides a means of executing and
100 manipulating SQL statements.
101
102 \ingroup database
103 \ingroup shared
104
105 \inmodule QtSql
106
107 QSqlQuery encapsulates the functionality involved in creating,
108 navigating and retrieving data from SQL queries which are
109 executed on a \l QSqlDatabase. It can be used to execute DML
110 (data manipulation language) statements, such as \c SELECT, \c
111 INSERT, \c UPDATE and \c DELETE, as well as DDL (data definition
112 language) statements, such as \c{CREATE} \c{TABLE}. It can also
113 be used to execute database-specific commands which are not
114 standard SQL (e.g. \c{SET DATESTYLE=ISO} for PostgreSQL).
115
116 Successfully executed SQL statements set the query's state to
117 active so that isActive() returns true. Otherwise the query's
118 state is set to inactive. In either case, when executing a new SQL
119 statement, the query is positioned on an invalid record. An active
120 query must be navigated to a valid record (so that isValid()
121 returns true) before values can be retrieved.
122
123 For some databases, if an active query that is a \c{SELECT}
124 statement exists when you call \l{QSqlDatabase::}{commit()} or
125 \l{QSqlDatabase::}{rollback()}, the commit or rollback will
126 fail. See isActive() for details.
127
128 \target QSqlQuery examples
129
130 Navigating records is performed with the following functions:
131
132 \list
133 \o next()
134 \o previous()
135 \o first()
136 \o last()
137 \o seek()
138 \endlist
139
140 These functions allow the programmer to move forward, backward
141 or arbitrarily through the records returned by the query. If you
142 only need to move forward through the results (e.g., by using
143 next()), you can use setForwardOnly(), which will save a
144 significant amount of memory overhead and improve performance on
145 some databases. Once an active query is positioned on a valid
146 record, data can be retrieved using value(). All data is
147 transferred from the SQL backend using QVariants.
148
149 For example:
150
151 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 7
152
153 To access the data returned by a query, use value(int). Each
154 field in the data returned by a \c SELECT statement is accessed
155 by passing the field's position in the statement, starting from
156 0. This makes using \c{SELECT *} queries inadvisable because the
157 order of the fields returned is indeterminate.
158
159 For the sake of efficiency, there are no functions to access a
160 field by name (unless you use prepared queries with names, as
161 explained below). To convert a field name into an index, use
162 record().\l{QSqlRecord::indexOf()}{indexOf()}, for example:
163
164 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 8
165
166 QSqlQuery supports prepared query execution and the binding of
167 parameter values to placeholders. Some databases don't support
168 these features, so for those, Qt emulates the required
169 functionality. For example, the Oracle and ODBC drivers have
170 proper prepared query support, and Qt makes use of it; but for
171 databases that don't have this support, Qt implements the feature
172 itself, e.g. by replacing placeholders with actual values when a
173 query is executed. Use numRowsAffected() to find out how many rows
174 were affected by a non-\c SELECT query, and size() to find how
175 many were retrieved by a \c SELECT.
176
177 Oracle databases identify placeholders by using a colon-name
178 syntax, e.g \c{:name}. ODBC simply uses \c ? characters. Qt
179 supports both syntaxes, with the restriction that you can't mix
180 them in the same query.
181
182 You can retrieve the values of all the fields in a single variable
183 (a map) using boundValues().
184
185 \section1 Approaches to Binding Values
186
187 Below we present the same example using each of the four
188 different binding approaches, as well as one example of binding
189 values to a stored procedure.
190
191 \bold{Named binding using named placeholders:}
192
193 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 9
194
195 \bold{Positional binding using named placeholders:}
196
197 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 10
198
199 \bold{Binding values using positional placeholders (version 1):}
200
201 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 11
202
203 \bold{Binding values using positional placeholders (version 2):}
204
205 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 12
206
207 \bold{Binding values to a stored procedure:}
208
209 This code calls a stored procedure called \c AsciiToInt(), passing
210 it a character through its in parameter, and taking its result in
211 the out parameter.
212
213 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 13
214
215 Note that unbound parameters will retain their values.
216
217 Stored procedures that uses the return statement to return values,
218 or return multiple result sets, are not fully supported. For specific
219 details see \l{SQL Database Drivers}.
220
221 \warning You must load the SQL driver and open the connection before a
222 QSqlQuery is created. Also, the connection must remain open while the
223 query exists; otherwise, the behavior of QSqlQuery is undefined.
224
225 \sa QSqlDatabase, QSqlQueryModel, QSqlTableModel, QVariant
226*/
227
228/*!
229 Constructs a QSqlQuery object which uses the QSqlResult \a result
230 to communicate with a database.
231*/
232
233QSqlQuery::QSqlQuery(QSqlResult *result)
234{
235 d = new QSqlQueryPrivate(result);
236}
237
238/*!
239 Destroys the object and frees any allocated resources.
240*/
241
242QSqlQuery::~QSqlQuery()
243{
244 if (!d->ref.deref())
245 delete d;
246}
247
248/*!
249 Constructs a copy of \a other.
250*/
251
252QSqlQuery::QSqlQuery(const QSqlQuery& other)
253{
254 d = other.d;
255 d->ref.ref();
256}
257
258/*!
259 \internal
260*/
261static void qInit(QSqlQuery *q, const QString& query, QSqlDatabase db)
262{
263 QSqlDatabase database = db;
264 if (!database.isValid())
265 database = QSqlDatabase::database(QLatin1String(QSqlDatabase::defaultConnection), false);
266 if (database.isValid()) {
267 *q = QSqlQuery(database.driver()->createResult());
268 }
269 if (!query.isEmpty())
270 q->exec(query);
271}
272
273/*!
274 Constructs a QSqlQuery object using the SQL \a query and the
275 database \a db. If \a db is not specified, the application's
276 default database is used. If \a query is not an empty string, it
277 will be executed.
278
279 \sa QSqlDatabase
280*/
281QSqlQuery::QSqlQuery(const QString& query, QSqlDatabase db)
282{
283 d = QSqlQueryPrivate::shared_null();
284 qInit(this, query, db);
285}
286
287/*!
288 Constructs a QSqlQuery object using the database \a db.
289
290 \sa QSqlDatabase
291*/
292
293QSqlQuery::QSqlQuery(QSqlDatabase db)
294{
295 d = QSqlQueryPrivate::shared_null();
296 qInit(this, QString(), db);
297}
298
299
300/*!
301 Assigns \a other to this object.
302*/
303
304QSqlQuery& QSqlQuery::operator=(const QSqlQuery& other)
305{
306 qAtomicAssign(d, other.d);
307 return *this;
308}
309
310/*!
311 Returns true if the query is \l{isActive()}{active} and positioned
312 on a valid record and the \a field is NULL; otherwise returns
313 false. Note that for some drivers, isNull() will not return accurate
314 information until after an attempt is made to retrieve data.
315
316 \sa isActive(), isValid(), value()
317*/
318
319bool QSqlQuery::isNull(int field) const
320{
321 if (d->sqlResult->isActive() && d->sqlResult->isValid())
322 return d->sqlResult->isNull(field);
323 return true;
324}
325
326/*!
327
328 Executes the SQL in \a query. Returns true and sets the query state
329 to \l{isActive()}{active} if the query was successful; otherwise
330 returns false. The \a query string must use syntax appropriate for
331 the SQL database being queried (for example, standard SQL).
332
333 After the query is executed, the query is positioned on an \e
334 invalid record and must be navigated to a valid record before data
335 values can be retrieved (for example, using next()).
336
337 Note that the last error for this query is reset when exec() is
338 called.
339
340 Example:
341
342 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 34
343
344 \sa isActive(), isValid(), next(), previous(), first(), last(),
345 seek()
346*/
347
348bool QSqlQuery::exec(const QString& query)
349{
350 if (d->ref != 1) {
351 bool fo = isForwardOnly();
352 *this = QSqlQuery(driver()->createResult());
353 d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy());
354 setForwardOnly(fo);
355 } else {
356 d->sqlResult->clear();
357 d->sqlResult->setActive(false);
358 d->sqlResult->setLastError(QSqlError());
359 d->sqlResult->setAt(QSql::BeforeFirstRow);
360 d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy());
361 }
362 d->sqlResult->setQuery(query.trimmed());
363 if (!driver()->isOpen() || driver()->isOpenError()) {
364 qWarning("QSqlQuery::exec: database not open");
365 return false;
366 }
367 if (query.isEmpty()) {
368 qWarning("QSqlQuery::exec: empty query");
369 return false;
370 }
371#ifdef QT_DEBUG_SQL
372 qDebug("\n QSqlQuery: %s", query.toLocal8Bit().constData());
373#endif
374 return d->sqlResult->reset(query);
375}
376
377/*!
378 Returns the value of field \a index in the current record.
379
380 The fields are numbered from left to right using the text of the
381 \c SELECT statement, e.g. in
382
383 \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 0
384
385 field 0 is \c forename and field 1 is \c
386 surname. Using \c{SELECT *} is not recommended because the order
387 of the fields in the query is undefined.
388
389 An invalid QVariant is returned if field \a index does not
390 exist, if the query is inactive, or if the query is positioned on
391 an invalid record.
392
393 \sa previous() next() first() last() seek() isActive() isValid()
394*/
395
396QVariant QSqlQuery::value(int index) const
397{
398 if (isActive() && isValid() && (index > QSql::BeforeFirstRow))
399 return d->sqlResult->data(index);
400 qWarning("QSqlQuery::value: not positioned on a valid record");
401 return QVariant();
402}
403
404/*!
405 Returns the current internal position of the query. The first
406 record is at position zero. If the position is invalid, the
407 function returns QSql::BeforeFirstRow or
408 QSql::AfterLastRow, which are special negative values.
409
410 \sa previous() next() first() last() seek() isActive() isValid()
411*/
412
413int QSqlQuery::at() const
414{
415 return d->sqlResult->at();
416}
417
418/*!
419 Returns the text of the current query being used, or an empty
420 string if there is no current query text.
421
422 \sa executedQuery()
423*/
424
425QString QSqlQuery::lastQuery() const
426{
427 return d->sqlResult->lastQuery();
428}
429
430/*!
431 Returns the database driver associated with the query.
432*/
433
434const QSqlDriver *QSqlQuery::driver() const
435{
436 return d->sqlResult->driver();
437}
438
439/*!
440 Returns the result associated with the query.
441*/
442
443const QSqlResult* QSqlQuery::result() const
444{
445 return d->sqlResult;
446}
447
448/*!
449 Retrieves the record at position \a index, if available, and
450 positions the query on the retrieved record. The first record is at
451 position 0. Note that the query must be in an \l{isActive()}
452 {active} state and isSelect() must return true before calling this
453 function.
454
455 If \a relative is false (the default), the following rules apply:
456
457 \list
458
459 \o If \a index is negative, the result is positioned before the
460 first record and false is returned.
461
462 \o Otherwise, an attempt is made to move to the record at position
463 \a index. If the record at position \a index could not be retrieved,
464 the result is positioned after the last record and false is
465 returned. If the record is successfully retrieved, true is returned.
466
467 \endlist
468
469 If \a relative is true, the following rules apply:
470
471 \list
472
473 \o If the result is currently positioned before the first record or
474 on the first record, and \a index is negative, there is no change,
475 and false is returned.
476
477 \o If the result is currently located after the last record, and \a
478 index is positive, there is no change, and false is returned.
479
480 \o If the result is currently located somewhere in the middle, and
481 the relative offset \a index moves the result below zero, the result
482 is positioned before the first record and false is returned.
483
484 \o Otherwise, an attempt is made to move to the record \a index
485 records ahead of the current record (or \a index records behind the
486 current record if \a index is negative). If the record at offset \a
487 index could not be retrieved, the result is positioned after the
488 last record if \a index >= 0, (or before the first record if \a
489 index is negative), and false is returned. If the record is
490 successfully retrieved, true is returned.
491
492 \endlist
493
494 \sa next() previous() first() last() at() isActive() isValid()
495*/
496bool QSqlQuery::seek(int index, bool relative)
497{
498 if (!isSelect() || !isActive())
499 return false;
500 int actualIdx;
501 if (!relative) { // arbitrary seek
502 if (index < 0) {
503 d->sqlResult->setAt(QSql::BeforeFirstRow);
504 return false;
505 }
506 actualIdx = index;
507 } else {
508 switch (at()) { // relative seek
509 case QSql::BeforeFirstRow:
510 if (index > 0)
511 actualIdx = index;
512 else {
513 return false;
514 }
515 break;
516 case QSql::AfterLastRow:
517 if (index < 0) {
518 d->sqlResult->fetchLast();
519 actualIdx = at() + index;
520 } else {
521 return false;
522 }
523 break;
524 default:
525 if ((at() + index) < 0) {
526 d->sqlResult->setAt(QSql::BeforeFirstRow);
527 return false;
528 }
529 actualIdx = at() + index;
530 break;
531 }
532 }
533 // let drivers optimize
534 if (isForwardOnly() && actualIdx < at()) {
535 qWarning("QSqlQuery::seek: cannot seek backwards in a forward only query");
536 return false;
537 }
538 if (actualIdx == (at() + 1) && at() != QSql::BeforeFirstRow) {
539 if (!d->sqlResult->fetchNext()) {
540 d->sqlResult->setAt(QSql::AfterLastRow);
541 return false;
542 }
543 return true;
544 }
545 if (actualIdx == (at() - 1)) {
546 if (!d->sqlResult->fetchPrevious()) {
547 d->sqlResult->setAt(QSql::BeforeFirstRow);
548 return false;
549 }
550 return true;
551 }
552 if (!d->sqlResult->fetch(actualIdx)) {
553 d->sqlResult->setAt(QSql::AfterLastRow);
554 return false;
555 }
556 return true;
557}
558
559/*!
560
561 Retrieves the next record in the result, if available, and positions
562 the query on the retrieved record. Note that the result must be in
563 the \l{isActive()}{active} state and isSelect() must return true
564 before calling this function or it will do nothing and return false.
565
566 The following rules apply:
567
568 \list
569
570 \o If the result is currently located before the first record,
571 e.g. immediately after a query is executed, an attempt is made to
572 retrieve the first record.
573
574 \o If the result is currently located after the last record, there
575 is no change and false is returned.
576
577 \o If the result is located somewhere in the middle, an attempt is
578 made to retrieve the next record.
579
580 \endlist
581
582 If the record could not be retrieved, the result is positioned after
583 the last record and false is returned. If the record is successfully
584 retrieved, true is returned.
585
586 \sa previous() first() last() seek() at() isActive() isValid()
587*/
588bool QSqlQuery::next()
589{
590 if (!isSelect() || !isActive())
591 return false;
592 bool b = false;
593 switch (at()) {
594 case QSql::BeforeFirstRow:
595 b = d->sqlResult->fetchFirst();
596 return b;
597 case QSql::AfterLastRow:
598 return false;
599 default:
600 if (!d->sqlResult->fetchNext()) {
601 d->sqlResult->setAt(QSql::AfterLastRow);
602 return false;
603 }
604 return true;
605 }
606}
607
608/*!
609
610 Retrieves the previous record in the result, if available, and
611 positions the query on the retrieved record. Note that the result
612 must be in the \l{isActive()}{active} state and isSelect() must
613 return true before calling this function or it will do nothing and
614 return false.
615
616 The following rules apply:
617
618 \list
619
620 \o If the result is currently located before the first record, there
621 is no change and false is returned.
622
623 \o If the result is currently located after the last record, an
624 attempt is made to retrieve the last record.
625
626 \o If the result is somewhere in the middle, an attempt is made to
627 retrieve the previous record.
628
629 \endlist
630
631 If the record could not be retrieved, the result is positioned
632 before the first record and false is returned. If the record is
633 successfully retrieved, true is returned.
634
635 \sa next() first() last() seek() at() isActive() isValid()
636*/
637bool QSqlQuery::previous()
638{
639 if (!isSelect() || !isActive())
640 return false;
641 if (isForwardOnly()) {
642 qWarning("QSqlQuery::seek: cannot seek backwards in a forward only query");
643 return false;
644 }
645
646 bool b = false;
647 switch (at()) {
648 case QSql::BeforeFirstRow:
649 return false;
650 case QSql::AfterLastRow:
651 b = d->sqlResult->fetchLast();
652 return b;
653 default:
654 if (!d->sqlResult->fetchPrevious()) {
655 d->sqlResult->setAt(QSql::BeforeFirstRow);
656 return false;
657 }
658 return true;
659 }
660}
661
662/*!
663 Retrieves the first record in the result, if available, and
664 positions the query on the retrieved record. Note that the result
665 must be in the \l{isActive()}{active} state and isSelect() must
666 return true before calling this function or it will do nothing and
667 return false. Returns true if successful. If unsuccessful the query
668 position is set to an invalid position and false is returned.
669
670 \sa next() previous() last() seek() at() isActive() isValid()
671 */
672bool QSqlQuery::first()
673{
674 if (!isSelect() || !isActive())
675 return false;
676 if (isForwardOnly() && at() > QSql::BeforeFirstRow) {
677 qWarning("QSqlQuery::seek: cannot seek backwards in a forward only query");
678 return false;
679 }
680 bool b = false;
681 b = d->sqlResult->fetchFirst();
682 return b;
683}
684
685/*!
686
687 Retrieves the last record in the result, if available, and positions
688 the query on the retrieved record. Note that the result must be in
689 the \l{isActive()}{active} state and isSelect() must return true
690 before calling this function or it will do nothing and return false.
691 Returns true if successful. If unsuccessful the query position is
692 set to an invalid position and false is returned.
693
694 \sa next() previous() first() seek() at() isActive() isValid()
695*/
696
697bool QSqlQuery::last()
698{
699 if (!isSelect() || !isActive())
700 return false;
701 bool b = false;
702 b = d->sqlResult->fetchLast();
703 return b;
704}
705
706/*!
707 Returns the size of the result (number of rows returned), or -1 if
708 the size cannot be determined or if the database does not support
709 reporting information about query sizes. Note that for non-\c SELECT
710 statements (isSelect() returns false), size() will return -1. If the
711 query is not active (isActive() returns false), -1 is returned.
712
713 To determine the number of rows affected by a non-\c SELECT
714 statement, use numRowsAffected().
715
716 \sa isActive() numRowsAffected() QSqlDriver::hasFeature()
717*/
718int QSqlQuery::size() const
719{
720 if (isActive() && d->sqlResult->driver()->hasFeature(QSqlDriver::QuerySize))
721 return d->sqlResult->size();
722 return -1;
723}
724
725/*!
726 Returns the number of rows affected by the result's SQL statement,
727 or -1 if it cannot be determined. Note that for \c SELECT
728 statements, the value is undefined; use size() instead. If the query
729 is not \l{isActive()}{active}, -1 is returned.
730
731 \sa size() QSqlDriver::hasFeature()
732*/
733
734int QSqlQuery::numRowsAffected() const
735{
736 if (isActive())
737 return d->sqlResult->numRowsAffected();
738 return -1;
739}
740
741/*!
742 Returns error information about the last error (if any) that
743 occurred with this query.
744
745 \sa QSqlError, QSqlDatabase::lastError()
746*/
747
748QSqlError QSqlQuery::lastError() const
749{
750 return d->sqlResult->lastError();
751}
752
753/*!
754 Returns true if the query is currently positioned on a valid
755 record; otherwise returns false.
756*/
757
758bool QSqlQuery::isValid() const
759{
760 return d->sqlResult->isValid();
761}
762
763/*!
764
765 Returns true if the query is \e{active}. An active QSqlQuery is one
766 that has been \l{QSqlQuery::exec()} {exec()'d} successfully but not
767 yet finished with. When you are finished with an active query, you
768 can make make the query inactive by calling finish() or clear(), or
769 you can delete the QSqlQuery instance.
770
771 \note Of particular interest is an active query that is a \c{SELECT}
772 statement. For some databases that support transactions, an active
773 query that is a \c{SELECT} statement can cause a \l{QSqlDatabase::}
774 {commit()} or a \l{QSqlDatabase::} {rollback()} to fail, so before
775 committing or rolling back, you should make your active \c{SELECT}
776 statement query inactive using one of the ways listed above.
777
778 \sa isSelect()
779 */
780bool QSqlQuery::isActive() const
781{
782 return d->sqlResult->isActive();
783}
784
785/*!
786 Returns true if the current query is a \c SELECT statement;
787 otherwise returns false.
788*/
789
790bool QSqlQuery::isSelect() const
791{
792 return d->sqlResult->isSelect();
793}
794
795/*!
796 Returns true if you can only scroll forward through a result set;
797 otherwise returns false.
798
799 \sa setForwardOnly(), next()
800*/
801bool QSqlQuery::isForwardOnly() const
802{
803 return d->sqlResult->isForwardOnly();
804}
805
806/*!
807 Sets forward only mode to \a forward. If \a forward is true, only
808 next() and seek() with positive values, are allowed for navigating
809 the results.
810
811 Forward only mode can be (depending on the driver) more memory
812 efficient since results do not need to be cached. It will also
813 improve performance on some databases. For this to be true, you must
814 call \c setForwardOnly() before the query is prepared or executed.
815 Note that the constructor that takes a query and a database may
816 execute the query.
817
818 Forward only mode is off by default.
819
820 Setting forward only to false is a suggestion to the database engine,
821 which has the final say on whether a result set is forward only or
822 scrollable. isForwardOnly() will always return the correct status of
823 the result set.
824
825 \sa isForwardOnly(), next(), seek(), QSqlResult::setForwardOnly()
826*/
827void QSqlQuery::setForwardOnly(bool forward)
828{
829 d->sqlResult->setForwardOnly(forward);
830}
831
832/*!
833 Returns a QSqlRecord containing the field information for the
834 current query. If the query points to a valid row (isValid() returns
835 true), the record is populated with the row's values. An empty
836 record is returned when there is no active query (isActive() returns
837 false).
838
839 To retrieve values from a query, value() should be used since
840 its index-based lookup is faster.
841
842 In the following example, a \c{SELECT * FROM} query is executed.
843 Since the order of the columns is not defined, QSqlRecord::indexOf()
844 is used to obtain the index of a column.
845
846 \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 1
847
848 \sa value()
849*/
850QSqlRecord QSqlQuery::record() const
851{
852 QSqlRecord rec = d->sqlResult->record();
853
854 if (isValid()) {
855 for (int i = 0; i < rec.count(); ++i)
856 rec.setValue(i, value(i));
857 }
858 return rec;
859}
860
861/*!
862 Clears the result set and releases any resources held by the
863 query. Sets the query state to inactive. You should rarely if ever
864 need to call this function.
865*/
866void QSqlQuery::clear()
867{
868 *this = QSqlQuery(driver()->createResult());
869}
870
871/*!
872 Prepares the SQL query \a query for execution. Returns true if the
873 query is prepared successfully; otherwise returns false.
874
875 The query may contain placeholders for binding values. Both Oracle
876 style colon-name (e.g., \c{:surname}), and ODBC style (\c{?})
877 placeholders are supported; but they cannot be mixed in the same
878 query. See the \l{QSqlQuery examples}{Detailed Description} for
879 examples.
880
881 Portability note: Some databases choose to delay preparing a query
882 until it is executed the first time. In this case, preparing a
883 syntactically wrong query succeeds, but every consecutive exec()
884 will fail.
885
886 Example:
887
888 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 9
889
890 \sa exec(), bindValue(), addBindValue()
891*/
892bool QSqlQuery::prepare(const QString& query)
893{
894 if (d->ref != 1) {
895 bool fo = isForwardOnly();
896 *this = QSqlQuery(driver()->createResult());
897 setForwardOnly(fo);
898 d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy());
899 } else {
900 d->sqlResult->setActive(false);
901 d->sqlResult->setLastError(QSqlError());
902 d->sqlResult->setAt(QSql::BeforeFirstRow);
903 d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy());
904 }
905 if (!driver()) {
906 qWarning("QSqlQuery::prepare: no driver");
907 return false;
908 }
909 if (!driver()->isOpen() || driver()->isOpenError()) {
910 qWarning("QSqlQuery::prepare: database not open");
911 return false;
912 }
913 if (query.isEmpty()) {
914 qWarning("QSqlQuery::prepare: empty query");
915 return false;
916 }
917#ifdef QT_DEBUG_SQL
918 qDebug("\n QSqlQuery::prepare: %s", query.toLocal8Bit().constData());
919#endif
920 return d->sqlResult->savePrepare(query);
921}
922
923/*!
924 Executes a previously prepared SQL query. Returns true if the query
925 executed successfully; otherwise returns false.
926
927 Note that the last error for this query is reset when exec() is
928 called.
929
930 \sa prepare() bindValue() addBindValue() boundValue() boundValues()
931*/
932bool QSqlQuery::exec()
933{
934 d->sqlResult->resetBindCount();
935
936 if (d->sqlResult->lastError().isValid())
937 d->sqlResult->setLastError(QSqlError());
938
939 return d->sqlResult->exec();
940}
941
942/*! \enum QSqlQuery::BatchExecutionMode
943
944 \value ValuesAsRows - Updates multiple rows. Treats every entry in a QVariantList as a value for updating the next row.
945 \value ValuesAsColumns - Updates a single row. Treats every entry in a QVariantList as a single value of an array type.
946*/
947
948/*!
949 \since 4.2
950
951 Executes a previously prepared SQL query in a batch. All the bound
952 parameters have to be lists of variants. If the database doesn't
953 support batch executions, the driver will simulate it using
954 conventional exec() calls.
955
956 Returns true if the query is executed successfully; otherwise
957 returns false.
958
959 Example:
960
961 \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 2
962
963 The example above inserts four new rows into \c myTable:
964
965 \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 3
966
967 To bind NULL values, a null QVariant of the relevant type has to be
968 added to the bound QVariantList; for example, \c
969 {QVariant(QVariant::String)} should be used if you are using
970 strings.
971
972 \note Every bound QVariantList must contain the same amount of
973 variants.
974
975 \note The type of the QVariants in a list must not change. For
976 example, you cannot mix integer and string variants within a
977 QVariantList.
978
979 The \a mode parameter indicates how the bound QVariantList will be
980 interpreted. If \a mode is \c ValuesAsRows, every variant within
981 the QVariantList will be interpreted as a value for a new row. \c
982 ValuesAsColumns is a special case for the Oracle driver. In this
983 mode, every entry within a QVariantList will be interpreted as
984 array-value for an IN or OUT value within a stored procedure. Note
985 that this will only work if the IN or OUT value is a table-type
986 consisting of only one column of a basic type, for example \c{TYPE
987 myType IS TABLE OF VARCHAR(64) INDEX BY BINARY_INTEGER;}
988
989 \sa prepare(), bindValue(), addBindValue()
990*/
991bool QSqlQuery::execBatch(BatchExecutionMode mode)
992{
993 return d->sqlResult->execBatch(mode == ValuesAsColumns);
994}
995
996/*!
997 Set the placeholder \a placeholder to be bound to value \a val in
998 the prepared statement. Note that the placeholder mark (e.g \c{:})
999 must be included when specifying the placeholder name. If \a
1000 paramType is QSql::Out or QSql::InOut, the placeholder will be
1001 overwritten with data from the database after the exec() call.
1002
1003 To bind a NULL value, use a null QVariant; for example, use
1004 \c {QVariant(QVariant::String)} if you are binding a string.
1005
1006 \sa addBindValue(), prepare(), exec(), boundValue() boundValues()
1007*/
1008void QSqlQuery::bindValue(const QString& placeholder, const QVariant& val,
1009 QSql::ParamType paramType
1010)
1011{
1012 d->sqlResult->bindValue(placeholder, val, paramType);
1013}
1014
1015/*!
1016 Set the placeholder in position \a pos to be bound to value \a val
1017 in the prepared statement. Field numbering starts at 0. If \a
1018 paramType is QSql::Out or QSql::InOut, the placeholder will be
1019 overwritten with data from the database after the exec() call.
1020*/
1021void QSqlQuery::bindValue(int pos, const QVariant& val, QSql::ParamType paramType)
1022{
1023 d->sqlResult->bindValue(pos, val, paramType);
1024}
1025
1026/*!
1027 Adds the value \a val to the list of values when using positional
1028 value binding. The order of the addBindValue() calls determines
1029 which placeholder a value will be bound to in the prepared query.
1030 If \a paramType is QSql::Out or QSql::InOut, the placeholder will be
1031 overwritten with data from the database after the exec() call.
1032
1033 To bind a NULL value, use a null QVariant; for example, use \c
1034 {QVariant(QVariant::String)} if you are binding a string.
1035
1036 \sa bindValue(), prepare(), exec(), boundValue() boundValues()
1037*/
1038void QSqlQuery::addBindValue(const QVariant& val, QSql::ParamType paramType)
1039{
1040 d->sqlResult->addBindValue(val, paramType);
1041}
1042
1043/*!
1044 Returns the value for the \a placeholder.
1045
1046 \sa boundValues() bindValue() addBindValue()
1047*/
1048QVariant QSqlQuery::boundValue(const QString& placeholder) const
1049{
1050 return d->sqlResult->boundValue(placeholder);
1051}
1052
1053/*!
1054 Returns the value for the placeholder at position \a pos.
1055*/
1056QVariant QSqlQuery::boundValue(int pos) const
1057{
1058 return d->sqlResult->boundValue(pos);
1059}
1060
1061/*!
1062 Returns a map of the bound values.
1063
1064 With named binding, the bound values can be examined in the
1065 following ways:
1066
1067 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 14
1068
1069 With positional binding, the code becomes:
1070
1071 \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 15
1072
1073 \sa boundValue() bindValue() addBindValue()
1074*/
1075QMap<QString,QVariant> QSqlQuery::boundValues() const
1076{
1077 QMap<QString,QVariant> map;
1078
1079 const QVector<QVariant> values(d->sqlResult->boundValues());
1080 for (int i = 0; i < values.count(); ++i)
1081 map[d->sqlResult->boundValueName(i)] = values.at(i);
1082 return map;
1083}
1084
1085/*!
1086 Returns the last query that was successfully executed.
1087
1088 In most cases this function returns the same string as lastQuery().
1089 If a prepared query with placeholders is executed on a DBMS that
1090 does not support it, the preparation of this query is emulated. The
1091 placeholders in the original query are replaced with their bound
1092 values to form a new query. This function returns the modified
1093 query. It is mostly useful for debugging purposes.
1094
1095 \sa lastQuery()
1096*/
1097QString QSqlQuery::executedQuery() const
1098{
1099 return d->sqlResult->executedQuery();
1100}
1101
1102/*!
1103 \fn bool QSqlQuery::prev()
1104
1105 Use previous() instead.
1106*/
1107
1108/*!
1109 Returns the object ID of the most recent inserted row if the
1110 database supports it. An invalid QVariant will be returned if the
1111 query did not insert any value or if the database does not report
1112 the id back. If more than one row was touched by the insert, the
1113 behavior is undefined.
1114
1115 For MySQL databases the row's auto-increment field will be returned.
1116
1117 \note For this function to work in PSQL, the table table must
1118 contain OIDs, which may not have been created by default. Check the
1119 \c default_with_oids configuration variable to be sure.
1120
1121 \sa QSqlDriver::hasFeature()
1122*/
1123QVariant QSqlQuery::lastInsertId() const
1124{
1125 return d->sqlResult->lastInsertId();
1126}
1127
1128/*!
1129
1130 Instruct the database driver to return numerical values with a
1131 precision specified by \a precisionPolicy.
1132
1133 The Oracle driver, for example, can retrieve numerical values as
1134 strings to prevent the loss of precision. If high precision doesn't
1135 matter, use this method to increase execution speed by bypassing
1136 string conversions.
1137
1138 Note: Drivers that don't support fetching numerical values with low
1139 precision will ignore the precision policy. You can use
1140 QSqlDriver::hasFeature() to find out whether a driver supports this
1141 feature.
1142
1143 Note: Setting the precision policy doesn't affect the currently
1144 active query. Call \l{exec()}{exec(QString)} or prepare() in order
1145 to activate the policy.
1146
1147 \sa QSql::NumericalPrecisionPolicy, numericalPrecisionPolicy()
1148*/
1149void QSqlQuery::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
1150{
1151 d->sqlResult->setNumericalPrecisionPolicy(precisionPolicy);
1152}
1153
1154/*!
1155 Returns the current precision policy.
1156
1157 \sa QSql::NumericalPrecisionPolicy, setNumericalPrecisionPolicy()
1158*/
1159QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const
1160{
1161 return d->sqlResult->numericalPrecisionPolicy();
1162}
1163
1164/*!
1165 \since 4.3.2
1166
1167 Instruct the database driver that no more data will be fetched from
1168 this query until it is re-executed. There is normally no need to
1169 call this function, but it may be helpful in order to free resources
1170 such as locks or cursors if you intend to re-use the query at a
1171 later time.
1172
1173 Sets the query to inactive. Bound values retain their values.
1174
1175 \sa prepare() exec() isActive()
1176*/
1177void QSqlQuery::finish()
1178{
1179 if (isActive()) {
1180 d->sqlResult->setLastError(QSqlError());
1181 d->sqlResult->setAt(QSql::BeforeFirstRow);
1182 d->sqlResult->detachFromResultSet();
1183 d->sqlResult->setActive(false);
1184 }
1185}
1186
1187/*!
1188 \since 4.4
1189
1190 Discards the current result set and navigates to the next if available.
1191
1192 Some databases are capable of returning multiple result sets for
1193 stored procedures or SQL batches (a query strings that contains
1194 multiple statements). If multiple result sets are available after
1195 executing a query this function can be used to navigate to the next
1196 result set(s).
1197
1198 If a new result set is available this function will return true.
1199 The query will be repositioned on an \e invalid record in the new
1200 result set and must be navigated to a valid record before data
1201 values can be retrieved. If a new result set isn't available the
1202 function returns false and the query is set to inactive. In any
1203 case the old result set will be discarded.
1204
1205 When one of the statements is a non-select statement a count of
1206 affected rows may be available instead of a result set.
1207
1208 Note that some databases, i.e. Microsoft SQL Server, requires
1209 non-scrollable cursors when working with multiple result sets. Some
1210 databases may execute all statements at once while others may delay
1211 the execution until the result set is actually accessed, and some
1212 databases may have restrictions on which statements are allowed to
1213 be used in a SQL batch.
1214
1215 \sa QSqlDriver::hasFeature() setForwardOnly() next() isSelect() numRowsAffected() isActive() lastError()
1216*/
1217bool QSqlQuery::nextResult()
1218{
1219 if (isActive())
1220 return d->sqlResult->nextResult();
1221 return false;
1222}
1223
1224QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.