![]() |
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции | ![]() |
Класс QSqlDatabase представляет подключение к базе данных. Далее...
#include <QSqlDatabase>
Класс QSqlDatabase представляет подключение к базе данных.
Класс QSqlDatabase предоставляет абстрактный интерфейс для доступа к базе данных. Он использует специальный QSqlDriver базы данных для доступа и манипуляции данными.
В следующем коде показано как установить соединение:
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() для открытия соединения.
Соединение определеное выше - безымянное соединение. Оно определено по умолчанию, и доступ к нему может быть получен позже, используя database():
QSqlDatabase db = QSqlDatabase::database();
Чтобы сделать программирование более удобным, QSqlDatabase реализован как класс-значение (англ. "value class"). Любые изменения, сделаные в соединении с базой данных через один объект QSqlDatabase, будут влиять на другие объекты QSqlDatabase, представляющие это же соединение. Вызовите cloneDatabase(), если вы хотите создать независимое соединение с базой данных на основе существующего.
Если вы нуждаетесь во множестве соединений с базами данных одновременно, определите произвольное имя в addDatabase() и database(). Вызовите removeDatabase(), чтобы удалить соединение. QSqlDatabase выведет предупреждение, если вы попытаетесь удалить соединение, указанное в других объектах QSqlDatabase. Используйте contains() чтобы узнать, есть ли заданное имя в списке соединений.
Как только соединение установлено вы можете посмотреть, какие таблицы база данных предоставляет с помощью tables(), найти первичный индекс для таблицы с помощью primaryIndex(), получить мета-информацию о полях таблицы (например, их имена) посредством record() и выполнить запрос функцией exec().
Если поддерживаются транзакции, вы можете использовать transaction(), чтобы начать транзакцию, и затем commit() или rollback(), чтобы завершить её. Вы можете узнать поддерживаются ли транзакции с помощью QSqlDriver::hasFeature(). При использовании транзакции вы должны начать её, прежде чем создадите свой запрос.
Если произошла ошибка, она может быть получена посредством lastError().
Имена SQL драйверов доступны из drivers(), вы можете проверить доступность драйвера с помощью isDriverAvailable(). Если вы создали свой собственный драйвер, вы можете зарегистрировать его с помощью registerSqlDriver().
Смотрите также QSqlDriver, QSqlQuery, Модуль QtSql и Потоки и модуль SQL.
Создает пустой, недействительный объект QSqlDatabase. Используйте addDatabase(), removeDatabase() и database() для того, чтобы получить действительные объекты QSqlDatabase.
Создаёт копию other.
Создаёт соединение QSqlDatabase, которое использует драйвер указанного типа type. Если type не распознаётся, соединение с базой данных не будет функционировать.
На текущий момент доступны следующие типы драйверов:
Тип драйвера | Описание |
---|---|
QDB2 | IBM DB2 |
QIBASE | Драйвер Borland InterBase |
QMYSQL | Драйвер MySQL |
QOCI | Драйвер Oracle Call Interface |
QODBC | Драйвер ODBC (включая Microsoft SQL Server) |
QPSQL | Драйвер PostgreSQL |
QSQLITE | Драйвер SQLite версии 3 и выше |
QSQLITE2 | SQLite версии 2 |
QTDS | Драйвер Sybase Adaptive Server |
Дополнительные сторонние драйвера, включая ваши собственные, можно загрузить динамически.
Смотрите также Драйвера баз данных SQL, registerSqlDriver() и drivers().
Создаёт соединение с базой данных, используя переданный driver.
Удаляет объект и освобождает все выделенные ему ресурсы.
Если объект QSqlDatabase является последним, то соединение с базой данных автоматически закрывается.
Смотрите также close().
Добавляет базу данных в список соединений баз данных, используя драйвер типа type и имя соединения connectionName. Если соединение с базой данных с именем connectionName уже существует, то оно будет удалено.
Соединение с базой данных в дальнейшем именуется connectionName. Будет возвращено вновь добавленное соединение.
Если connectionName не определено, вновь добавленное соединение становится для приложения соединением по умолчанию, и последующие вызовы database() без параметра вернут ссылку на него. Если connectionName задано, используйте его при вызове той функции database(connectionName), чтобы вернуть указатель на соединение.
Внимание: если вы добавите базу данных с тем же именем, как и у существующей, старая БД будет заменена новой. Это происходит автоматически, если вы вызываете данную функцию больше, чем один раз, без указания connectionName.
Чтобы использовать соединение, вам нужно настроить его, например, вызвав некоторые или все из фунций setDatabaseName(), setUserName(), setPassword(), setHostName(), setPort() и setConnectOptions(), а затем вам нужно открыть соединение с помощью open().
Замечание: Эта функция потокобезопасна.
Смотрите также database(), removeDatabase() и Потоки и модуль SQL.
Это перегруженная функция, предоставленная для удобства.
Эта функция полезна, если вам необходимо установить соединение и создать экземпляр самого драйвера. Если вы делаете это, то рекомендуем вам включить код драйвера в ваше собственное приложение. Например, настройка собственного соединения PostgreSQL и экземпляра драйвера QPSQL может быть сделана следующим образом:
#include "qtdir/src/sql/drivers/psql/qsql_psql.cpp"
(Мы допускаем, что qtdir является папкой установки Qt.) Это будет подключать код, который нужно использовать клиентской библиотеке PostgreSQL и создавать экземпляр объекта QPSQLDriver, если предположить, что у вас есть заголочные файлы PostgreSQL где-нибудь по вашему пути поиска.
PGconn *con = PQconnectdb("host=server user=bart password=simpson dbname=springfield");
QPSQLDriver *drv = new QPSQLDriver(con);
QSqlDatabase db = QSqlDatabase::addDatabase(drv); // становится новым соединением по умолчанию
QSqlQuery query;
query.exec("SELECT NAME, ID FROM STAFF");
...
Вышеуказанный код устанавливает соединение с PostgreSQL и создает экземпляр объекта QPSQLDriver. Затем вызывается addDatabase(), чтобы добавить соединение в известные соединения так, что оно может быть использовано классами SQL Qt. Когда создан экземпляр драйвера с обработчиком соединения (или набором обработчиков), Qt предполагает, что вы уже открыли соединение с базой данных.
Помните, что вы должны связать свое приложение с клиентской библиотекой базы данных. Простейший способ сделать это состоит в том, чтобы добавить строки, подобно указаным ниже в ваш .pro файл:
unix:LIBS += -lpq win32:LIBS += libpqdll.lib
Вы должны будете иметь клиентскую библиотеку в пути поиска своего компоновщика.
Метод, описанный выше, будет работать для всех драйверов, единственное различие - аргументы, принимаемые конструктором драйвера. Ниже приводится обзор драйверов и аргументы их конструктора.
Драйвер | Имя класса | Аргументы конструктора | Файл для подключения |
---|---|---|---|
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 от блокирования друг друга.
Внимание: если вы добавите базу данных с тем же именем, как и у существующей, старая БД будет заменена новой.
Внимание: SQL инструментария (framework) становится владельцем указателя на driver, и он не должен удалятся. Если вы хотите явно удалить подключение, используйте removeDatabase().
Смотрите также drivers().
Клонирует соединение с БД other и сохраняет копию с именем connectionName. Все настройки исходной БД, такие как databaseName(), hostName() и т.д., дублируются. Если other является некорректным, то ничего не происходит. Будет возвращено вновь добавленное соединение.
Помните, что соединение будет неоткрытым, чтобы это исправить, используйте open().
Закрывает соединения с базой данных, освобождает занятые ресурсы и делает недействительными все существующие объекты QSqlQuery, которые использовались вместе с базой данных.
Это сработает для всех копий объекта QSqlDatabase.
Смотрите также removeDatabase().
Выполняет транзакцию в базу данных, если она поддерживается драйвером и уже была начата транзакция посредством transaction(). Возвращает true, если операция прошла успешно; в противном случае возвращает false.
Помните, что для некоторых баз данных эта функция не будет работать, если нет активной QSqlQuery. Используйте lastError() для получения спецфичной для БД информации о произошедших ошибках.
Смотрите также QSqlDriver::hasFeature() и rollback().
Возвращает строку используемых опций соединения. Строка может быть пустой.
Смотрите также setConnectOptions().
Возвращает список, содержащий имена всех соединений.
Замечание: Эта функция потокобезопасна.
Смотрите также contains(), database() и Потоки и модуль SQL.
Возвращает true, если список соединений содержит соединение connectionName; в противном случае возвращает false.
Замечание: Эта функция потокобезопасна.
Смотрите также connectionNames(), database() и Потоки и модуль SQL.
Возвращает соединение с базой данных с именем connectionName. Оно должно быть заранее добавлено с помощью addDatabase(). Если open равно true (по умолчанию это так) и такое соединение ещё не открыто, оно открывается. Если connectionName не задано, используется соединение по умолчанию. Если connectionName отсутствует в списке баз данных, возвращается неверное соединение.
Замечание: Эта функция потокобезопасна.
Смотрите также isOpen() и Потоки и модуль SQL.
Возвращает имя соединения с БД; может быть пустым.
Смотрите также setDatabaseName().
Возвращает драйвер базы данных, используемый для соединения с базой данных.
Смотрите также addDatabase() и drivers().
Возвращает имя драйвера соединения.
Смотрите также addDatabase() и driver().
Возвращает список доступных драйверов баз данных.
Смотрите также registerSqlDriver().
Выполняет оператор SQL на базе данных и возвращает объект QSqlQuery. Используйте lastError() для получения информации об ошибках. Если query является пустым, соответственно, пустой, неправильный запрос будет возвращён и lastError() не будет задействован.
Смотрите также QSqlQuery и lastError().
Возвращает имя узла соединения. Параметр может быть пустым.
Смотрите также setHostName().
Возвращает true, если драйвер с именем name доступен; в противном случае возвращает false.
Смотрите также drivers().
Возвращает true, если соединение с базой данных открыто; в противном случае возвращает false.
Возвращает true, если произошла ошибка соединения с базой данных; в противном случае возвращает false. Информацию об ошибке можно получить с помощью функции lastError().
Возвращает true, если QSqlDatabase является корректным драйвером.
Пример:
QSqlDatabase db; qDebug() << db.isValid(); // Возвращает false db = QSqlDatabase::database("sales"); qDebug() << db.isValid(); // Возвращает true, если соединение "sales" существует QSqlDatabase::removeDatabase("sales"); qDebug() << db.isValid(); // Возвращает false
Возвращает информацию о последней ошибке, случившейся при работе с базой данных.
При помощи QSqlQuery::lastError() можно узнать о неудавшихся попытках связывания и отдельных запросов.
Смотрите также QSqlError и QSqlQuery::lastError().
Открывает соединение с базой данных, используя текущие значения параметров соединения. Возвращает true, если всё прошло успешно; в противном случае возвращает false. Информацию об ошибке можно получить с помощью функции lastError().
Смотрите также lastError(), setDatabaseName(), setUserName(), setPassword(), setHostName(), setPort() и setConnectOptions().
Это перегруженная функция, предоставленная для удобства.
Открывает соединения с базой данных, используя переданные имя пользователя user и пароль password. Возвращает true, если всё прошло успешно; в противном случае возвращает false. Информацию об ошибке можно получить с помощью функции lastError().
Данная функция не сохраняет пароль, если он был передан. Вместо этого он передаётся непосредственно драйверу для открытия соединения, после чего сбрасывается.
Смотрите также lastError().
Возвращает пароль соединения. Если он не был установлен с помощью setPassword() и был передан посредством вызова open() или же он не используется, возвращается пустая строка.
Смотрите также setPassword().
Возвращает номер порта соединения. Если номер порта не был установлен, это значение не будет определено.
Смотрите также setPort().
Возвращает первичный индекс таблицы tablename. Если такой не определён, возвращается пустой QSqlIndex.
Смотрите также tables() и record().
Возвращает QSqlRecord, заполненный именами полей таблицы (или представления) tablename. Порядок, в котором поля будут представлены, не определён. Если указанной таблицы (или представления) не существует, возвращается пустая запись (record).
Эта функция регистрирует новый SQL-драйвер под именем name внутри инструментария SQL. Это используется для пользовательских SQL-драйверов, которые не компилируются как подключаемый модуль (plugin).
Пример:
QSqlDatabase::registerSqlDriver("MYDRIVER", new QSqlDriverCreator<MyDatabaseDriver>); QSqlDatabase db = QSqlDatabase::addDatabase("MYDRIVER");
QSqlDatabase берёт на себя управление указателем на creator, потому вы не должны беспокоиться о его удалении.
Смотрите также drivers().
Убирает соединение connectionName из списка соединений с базой данных.
Внимание: Во время вызова этой функции не должно быть открытых запросов к данной базе данных, в противном случае произойдёт утечка ресурса (resource leak).
Пример:
// НЕПРАВИЛЬНО QSqlDatabase db = QSqlDatabase::database("sales"); QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db); QSqlDatabase::removeDatabase("sales"); // породит предупреждение // "db" в данный момент висит на неправильном соединении с БД, // "query" содержит неправильный результат
Вот правильный вариант реализации:
{ QSqlDatabase db = QSqlDatabase::database("sales"); QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db); } // Оба, "db" и "query", уничтожаются при выходе из их блока QSqlDatabase::removeDatabase("sales"); // правильно
Замечание: Эта функция потокобезопасна.
Смотрите также database() и Потоки и SQL модуль.
Откатывает транзакцию БД, если драйвер поддерживает их и транзакция transaction() была начата. Возвращает true, если операция прошла успешно; в противном случае возвращает false.
Смотрите также QSqlDriver::hasFeature() и commit().
Устанавливает специфичные для разных баз данных настройки options. Это должно быть сделано до того, как произойдёт соединение с базой данных, иначе оно не будет работать (или вы можете закрыть соединение с помощью close(), вызвать эту функцию, а затем open() для повтора соединения).
Формат строки options является списком имён или пар параметр=значение (option=value), разделённых точкой с запятой. В зависимости от базы данных используются следующие опции:
ODBC | MySQL | PostgreSQL |
---|---|---|
|
|
|
DB2 | OCI | TDS |
|
| none |
SQLite | Interbase | |
|
|
Примеры:
... // соединение с MySQL db.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1"); // используйте SSL соединение с сервером if (!db.open()) { db.setConnectOptions(); // очищает список параметров ... } ... // соединение с PostgreSQL db.setConnectOptions("requiressl=1"); // включает PostgreSQL SSL соединения if (!db.open()) { db.setConnectOptions(); // clear options ... } ... // ODBC соединение db.setConnectOptions("SQL_ATTR_ACCESS_MODE=SQL_MODE_READ_ONLY;SQL_ATTR_TRACE=SQL_OPT_TRACE_ON"); // устанавливаем опции ODBC if (!db.open()) { db.setConnectOptions(); // не пытайтесь задать этот параметр ... }
Сверьтесь с документацией по клиентской библиотеки для получения большей информации о различных опциях.
Смотрите также connectOptions().
Устанавливает name в качестве имени соединения. Это должно быть сделано до того, как произойдёт соединение с БД, иначе оно не будет работать (или вы можете закрыть соединение с помощью close(), вызвать эту функцию, а затем open() для повтора соединения). Имя зависит от БД.
Для драйвера QOCI (Oracle) имя базы данных - это TNS Service Name.
Для драйвера QODBC, name может быть DSN, имя файла DSN (в это случае файл должен иметь расширение .dsn) или строкой соединения.
Например, пользователи Microsoft Access могут использовать вместо создания DSN записи в менеджере ODBC следующую строку соединения для открытия непосредственно файлов .mdb:
...
db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");
if (db.open()) {
// успех!
}
...
У этого параметра нет значения по умолчанию.
Смотрите также databaseName(), setUserName(), setPassword(), setHostName(), setPort(), setConnectOptions() и open().
Устанавливает host как имя узла соединения. Это должно быть сделано до того, как произойдёт соединение с базой данных, иначе оно не будет работать (или вы можете закрыть соединение с помощью close(), вызвать эту функцию, а затем open() для повтора соединения).
У этого параметра нет значения по умолчанию.
Смотрите также hostName(), setUserName(), setPassword(), setDatabaseName(), setPort(), setConnectOptions() и open().
Устанавливает password как пароль соединения. Это должно быть сделано до того, как произойдёт соединение с базой данных, иначе оно не будет работать (или вы можете закрыть соединение с помощью close(), вызвать эту функцию, а затем open() для повтора соединения).
У этого параметра нет значения по умолчанию.
Внимание: Эта функция сохраняет пароль в виде простого текста внутри Qt. Используйте open() для получения пароля в виде параметра, не зависящего от его поведения.
Смотрите также password(), setUserName(), setDatabaseName(), setHostName(), setPort(), setConnectOptions() и open().
Устанавливает порт соединения как port. Это должно быть сделано до того, как произойдёт соединение с базой данных, иначе оно не будет работать (или вы можете закрыть соединение с помощью close(), вызвать эту функцию, а затем open() для повтора соединения).
У этого параметра нет значения по умолчанию.
setDatabaseName() setConnectOptions() open()
Смотрите также port(), setUserName(), setPassword() и setHostName().
Устанавливает name как имя пользователя для соединения с базой данных. Это должно быть сделано до того, как произойдёт соединение с базой данных, иначе оно не будет работать (или вы можете закрыть соединение с помощью close(), вызвать эту функцию, а затем open() для повтора соединения).
У этого параметра нет значения по умолчанию.
setPort() setConnectOptions() open()
Смотрите также userName(), setDatabaseName(), setPassword() и setHostName().
Возвращает список таблиц, системных таблиц и представлений базы данных, заданной в параметре type.
Смотрите также primaryIndex() и record().
Начинает транзакцию при работе с базой данных, если драйвер их поддерживает. Возвращает true, если операция прошла успешно; в противном случае возвращает false.
Смотрите также QSqlDriver::hasFeature(), commit() и rollback().
Возвращает имя пользователя для соединения; может быть пустым.
Смотрите также setUserName().
Ассоциирует other с текущим объектом.
Copyright © 2008 Trolltech | Торговые марки | Qt 4.3.5 |