diff options
Diffstat (limited to 'doc/sql-driver.doc')
-rw-r--r-- | doc/sql-driver.doc | 739 |
1 files changed, 739 insertions, 0 deletions
diff --git a/doc/sql-driver.doc b/doc/sql-driver.doc new file mode 100644 index 000000000..584e24bb7 --- /dev/null +++ b/doc/sql-driver.doc @@ -0,0 +1,739 @@ +/**************************************************************************** +** +** Documentation for sql driver programming +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free Qt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.QPL +** included in the packaging of this file. Licensees holding valid Qt +** Commercial licenses may use this file in accordance with the Qt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +/*! \page sql-driver.html + +\title SQL Module - Drivers + +\list +\i \link #Introduction Introduction\endlink +\i \link #building Building the drivers using configure\endlink +\i \link #buildingmanually Building the plugins manually\endlink + \list + \i \link #QDB2 QDB2\endlink - IBM DB2 Driver (v7.1 and higher) + \i \link #QIBASE QIBASE\endlink - Borland Interbase Driver + \i \link #QMYSQL3 QMYSQL3\endlink - MySQL Driver + \i \link #QOCI8 QOCI8\endlink - Oracle Call Interface Driver, version 8, 9 and 10 + \i \link #QODBC3 QODBC3\endlink - Open Database Connectivity Driver + \i \link #QPSQL7 QPSQL7\endlink - PostgreSQL v6.x and v7.x Driver + \i \link #QSQLITE QSQLITE\endlink - SQLite Driver + \i \link #QTDS7 QTDS7\endlink - Sybase Adaptive Server + \endlist +\i \link #troubleshooting Troubleshooting\endlink +\i \link #development How to write your own database driver\endlink +\endlist + +\target Introduction +\section1 Introduction + +The \link sql.html SQL Module\endlink uses driver \link +plugins-howto.html plugins\endlink in order to communicate with +different database APIs. Since the SQL Module API is +database-independent, all database-specific code is contained within +these drivers. Several drivers are supplied with Qt and other drivers +can be added. The driver source code is supplied and can be used as a +model for \link #development writing your own drivers\endlink. + +\e{Note:} To build a driver plugin you need to have the appropriate +client library for your Database Management System (DBMS). This provides +access to the API exposed by the DBMS, and is typically shipped with it. +Most installation programs also allow you to install "development +libraries", and these are what you need. These libraries are responsible +for the low-level communication with the DBMS. + +The drivers shipped with Qt are: +\list +\i \link #QDB2 QDB2\endlink - IBM DB2 Driver (v7.1 and higher) +\i \link #QIBASE QIBASE\endlink - Borland Interbase Driver +\i \link #QMYSQL3 QMYSQL3\endlink - MySQL Driver +\i \link #QOCI8 QOCI8\endlink - Oracle Call Interface Driver, version 8, 9 and 10 +\i \link #QODBC3 QODBC3\endlink - Open Database Connectivity Driver +\i \link #QPSQL7 QPSQL7\endlink - PostgreSQL v6.x and v7.x Driver +\i \link #QSQLITE QSQLITE\endlink - SQLite Driver +\i \link #QTDS7 QTDS7\endlink - Sybase Adaptive Server +\endlist + +Note that not all of the plugins are shipped with the Qt Open Source Edition +due to license incompatibilities with the GPL. + +\target building +\section1 Building the drivers using configure + +The Qt configure script automatically detects the available client +libraries on your machine. Run "configure -help" to see what drivers +can be built. You should get an output similar to this: + +\code +Possible values for <driver>: [ mysql oci odbc psql tds ] +Auto-Detected on this system: [ mysql psql ] +\endcode + +Note that on Windows, the configure script doesn't do any +auto-detection. + +The configure script cannot detect the neccessary libraries and include +files if they are not in the standard paths, so it may be necessary to +specify these paths using the "-I" and "-L" switches. For example, if +your MySQL include files are installed in \c /usr/local/mysql (or in +\c{C:\mysql\include} on Windows), then pass the following parameter to +configure: \c -I/usr/local/mysql (or \c{-I C:\mysql\include} for +Windows). + +On Windows the -I parameter doesn't accept spaces in +filenames, so use the 8.3 name instead, i.e. use \c{C:\progra~1\mysql} +instead of \c{C:\program files\mysql}. + +Use the \c{-qt-sql-<driver>} parameter to build the database driver +statically into your Qt library or \c{-plugin-sql-<driver>} to build +the driver as a plugin. Look at the sections that follow for +additional information about retquired libraries. + +\target buildingmanually +\section1 Building the plugins manually + +\target QMYSQL3 +\section2 QMYSQL3 - MySQL 3.x and MySQL 4.x + +\keyword QMYSQL3 + +\section3 General information + +MySQL 3.x doesn't support SQL transactions by default. There are some +backends which offer this functionality. Recent versions of the MySQL +client libraries (>3.23.34) allow you to use transactions on those +modified servers. + +If you have a recent client library and connect to a +transaction-enabled MySQL server, a call to the +QSqlDriver::hasFeature( QSqlDriver::Transactions ) function returns +TRUE and SQL transactions can be used. + +If the plugin is compiled against MySQL 4.x client libraries, +transactions are enabled by default. + +You can find information about MySQL on \l http://www.mysql.com + +\section3 How to build the plugin on Unix/Linux + +You need the MySQL header files and as well as the shared library +\c{libmysqlclient.so}. Depending on your Linux distribution you need to +install a package which is usually called "mysql-devel". + +Tell \link qmake-manual.book qmake\endlink where to find the MySQL +header files and shared libraries (here it is assumed that MySQL is +installed in \c{/usr/local}) and run \c{make}: + +\code +cd $QTDIR/plugins/src/sqldrivers/mysql +qmake -o Makefile "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lmysqlclient" mysql.pro +make +\endcode + +\section3 How to build the plugin on Windows + +You need to get the MySQL installation files. Run SETUP.EXE and +choose "Custom Install". Install the "Libs & Include Files" Module. +Build the plugin as follows (here it is assumed that MySQL is +installed in \c{C:\MYSQL}): + +\code +cd %QTDIR%\plugins\src\sqldrivers\mysql +qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.LIB" mysql.pro +nmake +\endcode + +If you are not using a Microsoft compiler, replace \c nmake with \c +make in the statement above. + +\target QOCI8 +\section2 QOCI8 - Oracle Call Interface (OCI) + +\keyword QOCI8 + +\section3 General information + +The Qt OCI plugin supports Oracle 8, 9 and 10. After +connecting to the Oracle server, the plugin will auto-detect the +database version and enable features accordingly. + +\section3 Unicode support + +If the Oracle server supports Unicode, the OCI plugin will use UTF-8 +encoding to communicate with the server. + +\section3 BLOB/LOB support + +Binary Large Objects (BLOBs) can be read and written, but be aware +that this process may retquire a lot of memory. + +Note that Oracle 9 doesn't support scrollable result sets with LOB +columns, you have to use a forward only query to select LOB fields +(see QSqlQuery::setForwardOnly()). + +Inserting BLOBs should be done using either a prepared query where the +BLOBs are bound to placeholders, or QSqlCursor which uses a prepared +query to do this internally (see $QTDIR/examples/sql/blob). + +\section3 Know problems + +When a query is in forward only mode a call to QSqlQuery::last() will +position the query on the last record and return TRUE, but subsequent +calls to QSqlQuery::value() will only return NULLs. + +\section3 How to build the plugin on Unix/Linux + +All files retquired to build driver should ship with the standard Oracle +Client install. + +Oracle library files retquired to build driver: + +\list +\i \c libclntsh.so (all versions) +\i \c libwtc8.so (only Oracle 8) or \c libwtc9.so (only Oracle 9) +\endlist + +Tell \c qmake where to find the Oracle header files and shared +libraries (it is assumed that the variable \c $ORACLE_HOME points to +the directory where Oracle is installed) and run make: + +If you are using Oracle 8: +\code +cd $QTDIR/plugins/src/sqldrivers/oci +qmake -o Makefile "INCLUDEPATH+=$ORACLE_HOME/rdbms/public $ORACLE_HOME/rdbms/demo" "LIBS+=-L$ORACLE_HOME/lib -lclntsh -lwtc8" oci.pro +make +\endcode + +For Oracle version 9: +\code +cd $QTDIR/plugins/src/sqldrivers/oci +qmake -o Makefile "INCLUDEPATH+=$ORACLE_HOME/rdbms/public $ORACLE_HOME/rdbms/demo" "LIBS+=-L$ORACLE_HOME/lib -lclntsh -lwtc9" oci.pro +make +\endcode + +For Oracle version 10: +\code +cd $QTDIR/plugins/src/sqldrivers/oci +qmake -o Makefile "INCLUDEPATH+=$ORACLE_HOME/rdbms/public $ORACLE_HOME/rdbms/demo" "LIBS+=-L$ORACLE_HOME/lib -lclntsh" oci.pro +make +\endcode + +Note that some versions of the OCI client libraries contain a bug +that makes programs linked to these libraries segfault on exit. This +only happens if the QOCI8 driver is compiled as a plugin. To work +around this problem, either compile the driver into the Qt libray +itself, or configure Qt with the option '-DQT_NO_LIBRARY_UNLOAD'. +For Oracle 9, it is possible to link to the static OCI library by +using "LIBS+=$ORACLE_HOME/lib/libclntst9.a". + +\section3 How to build the plugin on Windows + +Choosing the option "Programmer" in the Oracle Client Installer from +the Oracle Client Installation CD is sufficient to build the plugin. + +Build the plugin as follows (here it is assumed that Oracle Client is +installed in \c{C:\oracle}): + +\code +set INCLUDE=%INCLUDE%;c:\oracle\oci\include +set LIB=%LIB%;c:\oracle\oci\lib\msvc +cd %QTDIR%\plugins\src\sqldrivers\oci +qmake -o Makefile oci.pro +nmake +\endcode + +When you run your application you will also need to add the \c oci.dll +path to your \c PATH environment variable: + +\code +set PATH=%PATH%;c:\oracle\bin +\endcode + +If you are not using a Microsoft compiler, replace \c nmake with \c +make in the statement above. + +\target QODBC3 +\section2 QODBC3 - Open Database Connectivity (ODBC) + +\keyword QODBC3 + +\section3 General information + +ODBC is a general interface that allows you to connect to multiple +DBMS using a common interface. The QODBC3 driver allows you to connect +to an ODBC driver manager and access the available data sources. Note +that you also need to install and configure ODBC drivers for the ODBC +driver manager that is installed on your system. The QODBC3 plugin +then allows you to use these data sources in your Qt project. + +On Windows systems after 95 an ODBC driver manager should be installed +by default, for Unix systems there are some implementations which must +be installed first. Note that every client that uses your application +is retquired to have an ODBC driver manager installed, otherwise the +QODBC3 plugin will not work. + +Be aware that when connecting to an ODBC datasource you must pass in +the name of the ODBC datasource to the QSqlDatabase::setDatabaseName() +function: not the actual database name. + +The QODBC3 Plugin needs an ODBC compliant driver manager version 2.0 or +later to work. Some ODBC drivers claim to be version 2.0 compliant, +but do not offer all the necessary functionality. The QODBC3 plugin +therefore checks whether the data source can be used after a +connection has been established and refuses to work if the check +fails. If you don't like this behaviour, you can remove the \c{#define +ODBC_CHECK_DRIVER} line from the file \c{qsql_odbc.cpp}. Do this at +your own risk! + +If you experience very slow access of the ODBC datasource, make sure +that ODBC call tracing is turned off in the ODBC datasource manager. + +\section3 Unicode support + +The QODBC3 Plugin will use the Unicode API if UNICODE is defined. On +Windows NT based systems, this is the default. Note that the ODBC +driver and the DBMS have to support Unicode as well. + +For the Oracle 9 ODBC driver (Windows), it is neccessary to check +"SQL_WCHAR support" in the ODBC driver manager otherwise Oracle +will convert all Unicode strings to local 8 bit. + +\section3 How to build the plugin on Unix/Linux + +It is recommended that you use unixODBC. You can find the latest +version and ODBC drivers at \l http://www.unixodbc.org. +You need the unixODBC header files and shared libraries. + +Tell \c qmake where to find the unixODBC header files and shared +libraries (here it is assumed that unixODBC is installed in +\c{/usr/local/unixODBC}) and run \c{make}: + +\code +cd $QTDIR/plugins/src/sqldrivers/odbc +qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc" +make +\endcode + +\section3 How to build the plugin on Windows + +The ODBC header and include files should already be installed in the +right directories. You just have to build the plugin as follows: + +\code +cd %QTDIR%\plugins\src\sqldrivers\odbc +qmake -o Makefile odbc.pro +nmake +\endcode + +If you are not using a Microsoft compiler, replace \c nmake with \c +make in the statement above. + +\target QPSQL7 +\section2 QPSQL7 - PostgreSQL version 6 and 7 + +\keyword QPSQL7 + +\section3 General information + +The QPSQL7 driver supports both version 6 and 7 of PostgreSQL. We +recommend compiling the plugin with a recent version of the PostgreSQL +client library (libpq) because it is more stable and still backwards +compatible. + +If you want to link the plugin against the libpq shipped with version +6 we recommend a recent version like PostgreSQL 6.5.3, otherwise a +connection to a version 7 server may not work. + +The driver auto-detects the server version of PostgreSQL after a +connection was successful. If the server is too old or the version +information cannot be determined a warning is issued. + +For more information about PostgreSQL visit \l http://www.postgresql.org. + +\section3 Unicode support + +The QPSQL7 driver automatically detects whether the PostgreSQL +database you are connecting to supports Unicode or not. Unicode is +automatically used if the server supports it. Note that the driver +only supports the UTF-8 encoding. If your database uses any other +encoding, the server must be compiled with Unicode conversion +support. + +Unicode support was introduced in PostgreSQL version 7.1 and it will +only work if both the server and the client library have been compiled +with multibyte support. More information about how to set up a +multibyte enabled PostgreSQL server can be found in the PostgreSQL +Administrator Guide, Chapter 5. + +\section3 BLOB support + +Binary Large Objects are supported through the \c BYTEA field type in +PostgreSQL versions >= 7.1. Fields of type \c OID can be read, but not +written. Use the PostgreSQL command \c lo_import to insert binary data +into \c OID fields. + +\section3 How to build the plugin on Unix/Linux + +Just installing the pq client library and the corresponding header +files is not sufficient. You have to get the PostgreSQL source +distribution and run the configure script. If you've already installed +a binary distribution you don't need to build it. The source +distribution is needed because the QPSQL7 plugin relies on a couple of +header files that are usually not a part of the binary distribution. + +To make \c qmake find the PostgreSQL header files and shared +libraries, run \c qmake the following way (assuming that the +PostgreSQL sources can be found in \c{/usr/src/psql}): + +\code +cd $QTDIR/plugins/src/sqldrivers/psql +qmake -o Makefile "INCLUDEPATH+=/usr/src/psql/src/include /usr/src/psql/src/interfaces/libpq" "LIBS+=-L/usr/lib -lpq" psql.pro +make +\endcode + +\section3 How to build the plugin on Windows + +Unpack and build the PostgreSQL source distribution as described in +the PostgreSQL documentation. Assuming the PostgreSQL sources resides +in \c{C:\psql}, build the plugin as follows: + +\code +cd %QTDIR%\plugins\src\sqldrivers\psql +qmake -o Makefile "INCLUDEPATH+=C:\psql\src\include C:\psql\src\interfaces\libpq" psql.pro +nmake +\endcode + +Remember to add the path to the \c{libpq.dll} library to your PATH +environment variable so that Windows can find it. In this case that +would be \c{C:\psql\src\interfaces\libpq\Release}. If you are not using a +Microsoft compiler, replace \c nmake with \c make in the statement +above. + +\target QTDS7 +\section2 QTDS7 - Sybase Adaptive Server + +\keyword QTDS7 + +\section3 How to build the plugin on Unix/Linux + +Under Unix, two libraries are available which support the TDS protocol: + +- FreeTDS, a free implementation of the TDS protocol + (\l{http://www.freetds.org}). Note that FreeTDS is not yet stable, + so some functionality may not work as expected. + +- Sybase Open Client, available from \l{http://www.sybase.com}. + Note for Linux users: Get the Open Client RPM from + \l{http://linux.sybase.com}. + +Regardless of which library you use, the shared object file +\c{libsybdb.so} is needed. Set the SYBASE environment variable to +point to the directory where you installed the client library and +execute \c{qmake}: + +\code +cd $QTDIR/plugins/src/sqldrivers/tds +qmake -o Makefile "INCLUDEPATH=$SYBASE/include" "LIBS=-L$SYBASE/lib -lsybdb" +make +\endcode + +\section3 How to build the plugin on Windows + +You can either use the DB-Library supplied by Microsoft or the Sybase +Open Client (\l{http://www.sybase.com}). You must include \c +NTWDBLIB.LIB to build the plugin: + +\code +cd %QTDIR%\plugins\src\sqldrivers\tds +qmake -o Makefile "LIBS+=NTWDBLIB.LIB" tds.pro +nmake +\endcode + +By default the Microsoft library is used on Windows, if you want to force +the use of the Sybase Open Client, you must define +\c Q_USE_SYBASE in \c{%QTDIR%\src\sql\drivers\tds\qsql_tds.cpp}. + +\target QDB2 +\section2 QDB2 - IBM DB2 Driver (v7.1 or higher) + +\keyword QDB2 + +\section3 General information + +The Qt DB2 plugin makes it possible to access IBM DB2 databases. It +has been tested with IBM DB2 v7.1 and 7.2. You have to install the IBM +DB2 development client library, which contains the header and library +files necessary for compiling the QDB2 plugin. + +The QDB2 driver supports prepared queries, reading/writing of Unicode +strings and reading/writing of BLOBs. + +We suggest using a forward-only query when calling stored procedures +in DB2 (see QSqlQuery::setForwardOnly()). + +\section3 How to build the plugin on Unix/Linux + +\code +cd $QTDIR/plugins/src/sqldrivers/db2 +qmake -o Makefile "INCLUDEPATH+=$DB2DIR/include" "LIBS+=-L$DB2DIR/lib -ldb2" +make +\endcode + +\section3 How to build the plugin on Windows + +The DB2 header and include files should already be installed in the +right directories. You just have to build the plugin as follows: + +\code +cd %QTDIR%\plugins\src\sqldrivers\db2 +qmake -o Makefile "INCLUDEPATH+=<DB2 home>/sqllib/include" "LIBS+=<DB2 home>/sqllib/lib/db2cli.lib" +nmake +\endcode + +If you are not using a Microsoft compiler, replace \c nmake +with \c make in the statement above. + +\target QSQLITE +\section2 QSQLITE - SQLite Driver + +\keyword QSQLITE + +The Qt SQLite plugin makes it possible to access SQLite databases. +SQLite is an in-process database, meaning that it is not necessary +to have a database server. SQLite operates on a single file, which has +to be set as database name when opening a connection. If the file does +not exist, SQLite will try to create it. SQLite also supports in-memory +databases, simply pass ":memory:" as the database name. + +SQLite has some restrictions regarding multiple users and +multiple transactions. If you try to read/write on a resource from different +transactions, your application might freeze until one transaction commits +or rolls back. + +SQLite has no support for types, every value is treated as character data. +BLOBs are therefore not supported. + +You can find information about SQLite on \l{http://www.sqlite.org}. + +SQLite is shipped as third party library within Qt. It can be built by +passing the following parameters to the configure script: +\c{-plugin-sql-sqlite} (as plugin) or \c{-qt-sql-sqlite} (linked +directly into the Qt library). + +If you don't want to use the SQLite library shipped with Qt, you can +build it manually (replace \c $SQLITE by the directory where SQLite +resides): + +\code +cd $QTDIR/plugins/src/sqldrivers/sqlite +qmake -o Makefile "INCLUDEPATH+=$SQLITE/include" "LIBS+=-L$SQLITE/lib -lsqlite" +make +\endcode + +\target QIBASE +\section2 QIBASE - Borland Interbase Driver + +\keyword QIBASE + +\section3 General information + +The Qt Interbase plugin makes it possible to access the Interbase and +Firebird databases. Interbase can either be used as a client/server or +without a server operating on local files. The database file must +exist before a connection can be established. + +Note that Interbase retquires you to specify the full path to the +database file, no matter whether it is stored locally or on another +server. + +\code + myDatabase->setHostName("MyServer"); + myDatabase->setDatabaseName("C:\\test.gdb"); +\endcode + +You need the Interbase/Firebird development headers and libraries +to build this plugin. + +Due to the GPL, users of the Qt Open Source Edition are not allowed to link +this plugin to the commercial editions of Interbase. Please use Firebird +or the free edition of Interbase. + +\section3 How to build the plugin on Unix/Linux + +The following assumes Interbase or Firebird is installed in +\c{/opt/interbase}: + +\code +cd $QTDIR/plugins/src/sqldrivers/ibase +qmake -o Makefile "INCLUDEPATH+=/opt/interbase/include" "LIBS+=-L/opt/interbase/lib" ibase.pro +make +\endcode + +\section3 How to build the plugin on Windows + +The following assumes Interbase or Firebird is installed in +\c{C:\interbase}: + +\code +cd %QTDIR%\plugins\src\sqldrivers\ibase +qmake -o Makefile "INCLUDEPATH+=C:\interbase\include" ibase.pro +nmake +\endcode + +If you are not using a Microsoft compiler, replace \c nmake +with \c make in the statement above. + +Note that \c{C:\interbase\bin} must be in the PATH. + +\target troubleshooting +\section1 Troubleshooting + +You should always use client libraries that have been compiled with +the same compiler as you are using for your project. If you cannot get +a source distibution to compile the client libraries yourself, you +must make sure that the pre-compiled library is compatible with +your compiler, otherwise you will get a lot of "undefined symbols" +errors. Some compilers have tools to convert libraries, e.g. Borland +ships the tool \c{COFF2OMF.EXE} to convert libraries that have been +generated with Microsoft Visual C++. + +If the compilation of a plugin succeeds but it cannot be loaded, +make sure that the following retquirements are met: + +\list +\i Ensure that you are using a shared Qt library; you cannot use the + plugins with a static build. +\i Ensure that the environment variable \c QTDIR points to the right + directory. Go to the \c{$QTDIR/plugins/sqldrivers} directory and + make sure that the plugin exists in that directory. +\i Ensure that the client libraries of the DBMS are available on the + system. On Unix, run the command \c{ldd} and pass the name of the + plugin as parameter, for example \c{ldd libqsqlmysql.so}. You will + get a warning if any of the client libraries couldn't be found. + On Windows, you can use the dependency walker of Visual Studio. +\endlist + +If you are experiencing problems with loading plugins, and see output +like this + +\code +QSqlDatabase warning: QMYSQL3 driver not loaded +QSqlDatabase: available drivers: QMYSQL3 +\endcode + +the problem is probably that the plugin had the wrong build key. For +debugging purposes, remove the corresponding entry in the +$HOME/.qt/qt_plugins_(qtversion).rc file. + +The next time you try to load this plugin, it will give you a more detailed +error message. + +\target development +\section1 How to write your own database driver + +QSqlDatabase is responsible for loading and managing database driver +plugins. When a database is added (see QSqlDatabase::addDatabase()), +the appropriate driver plugin is loaded (using QSqlDriverPlugin). +QSqlDatabase relies on the driver plugin to provide interfaces for +QSqlDriver and QSqlResult. + +QSqlDriver is an abstract base class which defines the functionality +of a SQL database driver. This includes functions such as +QSqlDriver::open() and QSqlDriver::close(). QSqlDriver is responsible +for connecting to a database, establish the proper environment, etc. +In addition, QSqlDriver can create QSqlQuery objects appropriate for +the particular database API. QSqlDatabase forwards many of its +function calls directly to QSqlDriver which provides the concrete +implementation. + +QSqlResult is an abstract base class which defines the functionality +of a SQL database query. This includes statements such as \c{SELECT}, +\c{UPDATE}, and \c{ALTER TABLE}. QSqlResult contains functions such as +QSqlResult::next() and QSqlResult::value(). QSqlResult is responsible +for sending queries to the database, returning result data, etc. +QSqlQuery forwards many of its function calls directly to QSqlResult +which provides the concrete implementation. + +QSqlDriver and QSqlResult are closely connected. When implementing a +Qt SQL driver, both of these classes must to be subclassed and the +abstract virtual methods in each class must be implemented. + +To implement a Qt SQL driver as a plugin (so that it is recognized and +loaded by the Qt library at runtime), the driver must use the +\c Q_EXPORT_PLUGIN macro. Read the \link plugins-howto.html Qt +Plugin\endlink documentation for more information on this. You can +also check out how this is done in the SQL plugins that is provided +with Qt in \c{QTDIR/plugins/src/sqldrivers} and +\c{QTDIR/src/sql/drivers}. + +The following code can be used as a skeleton for a SQL driver: + +\code +class QNullResult : public QSqlResult +{ +public: + QNullResult( const QSqlDriver* d ): QSqlResult( d ) {} + ~QNullResult() {} +protected: + QVariant data( int ) { return QVariant(); } + bool reset ( const QString& ) { return FALSE; } + bool fetch( int ) { return FALSE; } + bool fetchFirst() { return FALSE; } + bool fetchLast() { return FALSE; } + bool isNull( int ) { return FALSE; } + QSqlRecord record() { return QSqlRecord(); } + int size() { return 0; } + int numRowsAffected() { return 0; } +}; + +class QNullDriver : public QSqlDriver +{ +public: + QNullDriver(): QSqlDriver() {} + ~QNullDriver() {} + bool hasFeature( DriverFeature ) const { return FALSE; } + bool open( const QString&, + const QString&, + const QString&, + const QString&, + int ) { return FALSE; } + void close() {} + QSqlQuery createQuery() const { return QSqlQuery( new QNullResult( this ) ); } +}; +\endcode + +*/ |