Подключение базы данных к 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х. Теперь в этом окне нажимает "Добавить" - находим драйвер и подключаем его.