Подключение базы данных к Qt

Подготовка к началу работы править

Для того чтобы начать разрабатывать собственное приложение(в редакторе Qt Creator), которое имеет возможность обращаться к некой базе данный, нужно прежде всего иметь редактор кода Qt и свободную объектно-реляционную систему управления базами данных(СУБД), в данном примере речь пойдет о такой СУБД, как PostgreSQL. Статья подразумевает тот факт, что разработчик имеет уже созданную базу данных, а также базовые навыки работы с С++.

Начало работы править

Перед началом работы у разработчика имеется множество путей подключения созданной базы данных к разрабатываемому приложению, но подробней речь пойдет о о двух: путем использования драйвера QPSQL или драйвера ODBC. Выбор остается за самим разработчиком, но так или иначе в 80% случаях возникает проблемы при использовании того или иного драйвера. Эта статья как раз рассказывает о спектре проблем, которые могут возникнуть, а также о том, как от них избавится.

Проверка наличия драйверов и подготовка среды править

Перед тем, как остановиться на выборе драйвера требуется выполнить проверку наличия драйверов - это делается для того, чтобы выбор драйвера в дальнейшем был выгодней для Вас. Итак, для того, чтобы узнать, какие же драйверы могут работать с SQL нужно написать простенькое приложение которое будет выводить на консоль(консоль самого Qt) список драйверов с помощью команды qDebug() << QSqlDatabase::drivers(); после запуска мы сможем узнать, какие драйверы нам доступны. Если у Вас есть в наличии драйвер QPSQL, то рекомендуется использовать именного его, если нет, то QODBC. Также не забываем в фале с расширением .pro дописать QT += sql - это даст возможность Qt понимать SQL запросы.

Подключение базы с использованием драйвера QPSQL править

Если ваш выбор пришелся на QPSQL драйвер, то при наилучшем стечении обстоятельств подключение будет быстрым и безболезненным, стоит отметить, что будет все гладко, если драйвер уже есть в наличии. Стоит отметить сразу, что если вы используете СУБД НЕ PosgreSQL, то сразу переходите к описанию подключения базы с использованием драйвера QODBC. Для подключения рекомендуется использовать некоторую "кнопку"(как элемент интерфейса разрабатываемого приложения), поскольку так исключаться всевозможные "косяки", которые могут возникнуть при запуске и помешать коммутации. Чтобы осуществить подключение напишем следующее:

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setDatabaseName(dbName);
   db.setHostName(host);
   db.setUserName(usr);
   db.setPassword(pwd);
   if (!db.open())
   {
       return false;
   }
   return true;

Не забываете, что dbName(название базы данных), host(название хоста), usr(имя пользователя), pwd(пароль) - это все данные, необходимые для подключения. Рекомендуется использовать функцию, например, назвать ее "bool createConnection()" и в дальнейшем передавать ей вышеупомянутые параметры, но это не существенно. Что из действительно важных рекомендаций, а так это, в проверке на "db.open()" использовать не "return false" или "return true",а конструкцию:

QMessageBox::information(this, "OK", "Successfull!");// Как оповещение о успехе подключения
QMessageBox::warning(this, "Error", db.lastError().text());// Как оповещение о неудаче

Очень важно - в конструкции db.lastError().text() db - это экземпляр QSqlDatabase. Главное преимущество использования db.lastError().text() является то, что так мы узнаем о причине вероятной ошибки, при этом значительно сократим время на то, чтобы узнать о причине ее возникновения. Теперь разберем возможные проблемы.

Отсутствие драйвера QPSQL в данной сборке Qt править

Эта проблема довольно серьезная, так как без драйвера вы не сможете дальше продолжить работу, но решаемая, что есть хорошо. Уже на этом этапе стоит задуматься над тем, чтобы перейти к использованию драйвера ODBC, но статья называется "Подключение базы данных к Qt", поэтому необходимо рассказать Вам о том, как решить эту проблему. Если драйвер отсутствует, что нам необходимо подключить его. Звучит довольно просто, но не все так легко, поскольку этот драйвер является чем-то индивидуальным, Posgre и его придется "собирать вручную" и подключать в дальнейшем. В вашем распоряжении замечательная статья http://www.iu5bmstu.ru/index.php/Qt_-_Сборка_драйвера_PSQL, которая самым подробным образом рассказывает о сборке и подключении QPSQL. Если все получилось, то этот раздел можно смело закрывать и начинать разрабатывать свое приложение, если нет, то увы, но не переживаете.

Асинхронность архитектуры править

Возможно что при сборке драйвера возникла ошибка при сборке драйвера, должно появляться уведомление о невозможности сборки с ссылки на файл с расширением .lib. Если вы внимательно прочитали статью и уверены, что ошибка возникла из-за чего-то "другого", то с вероятностью 80% у Вас разные архитектуры между самим Posgre и скомпилированным приложением Qt. Так уж получилось, что большинство компиляторов Qt 32x разрядные, а в сейчас большинство людей используют 64x разрядные системы. Теперь Вы имеете выбор: скачать заново СУБД, только уже 32x или собрать новый компилятор для Qt. К сожалению первое сделать предельно просто(относительно объяснения), а второе - напротив, для этого стоит прочитать отдельную статью. после выполнения первого или второго драйвер успешно собирается и подключается к Qt.

Подключение базы с использованием драйвера QODBC править

Если вы выбрали драйвер QODBC, то придется для начала скачать этот драйвер для Вашей OC с официального сайта. Установка драйвера проходит довольно быстро и теперь можно приступать к подключению. Перейдите в меню пуск -> поиск -> Администрирование -> Источники данных(ODBC). Во вкладке "пользовательский DNS" нажимаем на "Добавить" и там должны увидеть наши драйвера в вариации Unicode и ANSI. Выбор остается за Вами. После того, как вы добавите драйвер, его нужно настроить - переходим на вкладку "Настройки". Откроется замысловатое окно, и начнем его заполнять: Data Sourse - "придумать" Database - "точное имя базы" Server - "зачастую localhost" User Name - "точное имя пользователя" Port - "зачастую 5432" Password - "точный пароль"

Строки, которые не были названы заполнять не нужно или оставить в изначальном состоянии.Можете нажать на кнопку "Test" для проверки соединения с базой. Далее жмем на "Save". Чтобы осуществить подключение напишем следующее:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName(dbName);
   db.setHostName(host);
   db.setUserName(usr);
   db.setPassword(pwd);
   if (!db.open())
   {
       return false;
   }
   return true;

Не забываем, что dbName(это строка Data Source(в Администрировании) - это очень важно, т.к. для драйвера QPSQL в этом месте используется просто имя базы данных), host(название хоста), usr(имя пользователя), pwd(пароль) - это все данные, необходимые для подключения. Рекомендую использовать функцию, например, назвать ее "bool createConnection()" и в дальнейшем передавать ей вышеупомянутые параметры, но это не существенно. Что из действительно важных рекомендаций, а так это, в проверке на "db.open()" использовать не "return false" или "return true",а конструкцию:

QMessageBox::information(this, "OK", "Successfull!");// Как оповещение о успехе подключения
QMessageBox::warning(this, "Error", db.lastError().text());// Как оповещение о неудаче

Очень важно - в конструкции db.lastError().text() db - это экземпляр QSqlDatabase. Главное преимущество использования db.lastError().text() является то, что так мы узнаем о причине вероятной ошибки, при этом значительно сократим время на то, чтобы узнать о причине ее возникновения. Теперь разберем возможные проблемы.

Асинхронность архитектуры править

И вновь возникает эта проблема. И тут у Вас, разработчики есть выбор из трех, два из них не очень удобные.

1. Как уже отмечалось ранее установить себе 32х разрядный Posgre(в этом случае это относится и к другим СУБД).

2. Установить 64x разрядный компилятор для Qt.

3. Скачать не 64x разрядный драйвер ODBC, а 32х(предварительно удалив 64х).

Стоит отметить, что в некоторых системах Windows в окне Администрирование не видны 32х разрядные драйвера, что очень печально, но это Вам не помешает его установить. Для этого после установки 32х разрядного драйвера переходим по пути С:\Windows\SysWOW64 и запускаем obdcad32 Вы увидите то же самое окно Администрирования "Источники баз данных ODBC", только там будут находиться все драйвера, включая и 32х. Теперь в этом окне нажимает "Добавить" - находим драйвер и подключаем его.