Починаючи роботу з Qt і Embedded FireBird
Вступ
Ця стаття представляє опис перших кроків по установці Qt, Visual Studio і FireBird. Вона може бути корисною тим, хто тільки починає працювати з базою даних FireBird Embedded за допомогою Qt провайдера. Також ця стаття може стати в нагоді розробникам, які тільки починають працювати з Qt.
На момент написання мною цієї статті розглянутий тут питання було погано документований, і саме тому я сподіваюся, що представлений матеріал може бути дійсно корисним.
У даній статті ми розглянемо такі питання:
- Інсталяція Qt SDK, його настройка і інтеграція в Visual Studio.
- Збірка IBase плагіна.
- Програмне створення бази даних і встановлення зв'язку з нею.
- Робота з ім'ям користувача і паролем для бази даних.
- Ми розглянемо прості запити до бази даних, а також виклик збережених процедур.
Налаштування оточення
Для перегляду бази даних, запропонованої в якості прикладу нижче в даній статті, можна скористатися такими клієнтами:
Для доступу використовуйте логін і пароль Serg 12345. Приклад базується на Qt 4.5.2 LGPL.
Для налаштування оточення необхідно:
1. Встановити Qt SDK
1) Спочатку потрібно мати вільне місце на диску (2-3 GB, якщо потрібно буде збирати всі бібліотеки і приклади, інакше близько 1.5 GB).
2) Запустити інсталяцію SDK (QtSDK 4.5.2 ). Бажано не змінювати шлях за замовчуванням або ж встановити аналогічну структуру папок, але, наприклад, на диску «D: ».
3) Створити Environmental Variable «QtDIR» і вказати такий шлях «C: Qt 2009.03 Qt » - якщо шлях установки не змінювався на кроці 2.
2. Зібрати Qt для роботи з VS 2005 (2008)
1) Запустити «VS 2005 Command Prompt» у відповідному розділі меню Пуск.
2) У занедбаній консолі перейти в папку QtDIR («C: Qt 2009.03 Qt ", якщо на попередньому етапі використовувався шлях за замовчуванням).
3) Запустити «configure.exe» з такими параметрами:
-plugin-sql-ibase
Ці параметри можна уточнити, запустивши
configure.exe-help
4) На питання консолі:
Which edition of Qt do you want to use?
- потрібно вибрати Open Source Edition.
Потім потрібно набрати «y» ('y' - to accept this license offer).
5) Очікуємо закінчення створення файлів VCProj і головного Solution. В кінці буде створено Solution «projects.sln» в папці «C: Qt 2009.03 Qt ».
3. Встановити Visual Studio Addon for Qt
1) Закрити всі вікна Visual Studio, якщо вони відкриті.
2) Запустити Qt-vs-addin-1.0 .2. exe
3) Відкрити Visual Studio і відкрити опції Qt з меню «Qt->Qt Options». Натиснути Add і створити ім'я, наприклад, «Qt 4.5.2». Ім'я не важливо, але воно зберігається в проекті. Інша людина, що відкрив проект, може не відразу зібрати його, так як побачить повідомлення про помилку (no such Qt version found on this machine або щось в цьому роді). Як параметр-пути слід вказати шлях до папки Qt, що відповідає $ (QtDIR), за замовчуванням це «C: Qt 2009.03 Qt ». Як Qt Default Version вибираємо тільки що створену запис «Qt 4.5.2» .
4) Необов'язково збирати всі проекти. Досить зібрати тільки:
- QtCore
- QtGUI
- QtSQl
- QMain
Примітка: Libraries Win32 static library і Qt Library мають різні настройки для «wchar_t as Built-In», і якщо ви хочете вбудувати Win32 static library в Qt додаток, то вам потрібно або зібрати Qt без цієї опції, або в Project Settings/С + +/Language поміняти властивість «Treat wchar_t as Built-In Type» на «No (/ Zc: wchar_t-)».
Для відключення цієї опції в Qt необхідно перед п.2 зробити наступне:
- Відкрити файл qmake.conf. Він розташований за адресою: QtDIR/mkspecs/win32-msvc2005/qmake.conf. Я працював з Visual Studio 2005, тому використовував підпапку «win32-msvc2005». Якщо ж ви працюєте з іншою версією, то зможете знайти цей файл у відповідній папці.
- У відкритому файлі необхідно змінити прапор QMAKE_CFLAGS, видаливши «-Zc: wchar_t-»
4. Встановити FireBird:
Firebird можна скачати звідси .
5. Зібрати Plugin для IBase
1) Зайти в папку $ (QtDIR) src plugins sqldrivers ibase і зібрати проект в Debug and Release.
Перед тим як збирати, потрібно встановити такі властивості проекту:
- У C/C + +/General ->Additional Include Directories необхідно додати шлях до папки include (наприклад, C: Program Files Firebird Firebird_2_1 include).
- У Linker/General ->Additional Library Directories необхідно прописати приблизно наступне: C: Program Files Firebird Firebird_2_1 lib.
- Для складання проекту IBase в ньому потрібно виправити ім'я лінкуемой бібліотеки (Linker/Input ->Additional Dependencies) з «gds32_ms.lib» на «fbclient_ms.lib» - остання поставляється з FireBird.
2) Встановити Embedded Server.
- Embedded Server можна взяти за цим посиланням: FireBird Embedded 2.1.3 Release.
- Файл «fbembed.dll» необхідно перейменувати на «fbclient.dll».
З'єднання з існуючою базою даних
Перед тим як встановлювати з'єднання з базою даних, необхідно спочатку довантажити QIBASE плагін. Якщо ви вирішили використовувати плагін і вантажити його вручну, то для плагіна, поміщеного в одну папку з EXE файлом, відповідний код буде виглядати так:
... if (! pluginLoader_.isLoaded ()) { pluginLoader_.setFileName (QApplication:: instance () ->applicationDirPath () + QDir:: separator () + QtIBasePluginName_); if (! pluginLoader_.load ()) { ////Loading SQL Driver failed.; isInitialized_ = false; return false; } } QObject * object = pluginLoader_.instance (); if (object == NULL) { //Loading SQL Driver Instance failed.; pluginLoader_.unload (); return false; } QSqlDriverPlugin * plugin = qobject_cast (object); if (plugin == NULL) { //QSqlDriverPlugin == NULL; pluginLoader_.unload (); return false; } driver_ = plugin->create ("QIBASE"); if (driver_ == NULL) { //Loading QIBASE Driver Instance failed.; pluginLoader_.unload (); return false; } isInitialized_ = true; return isInitialized_; ...
Тепер, коли плагін для роботи з FireBird довантажуючи, можна переходити до налаштування з'єднання з нашою базою даних.
connectionName_ = "Connection_1"; QSqlDatabase database; //Adding database (DRIVER); database = QSqlDatabase:: addDatabase (driver_, connectionName_); //Check Valid database.; if (! database.isValid ()) { QString lastError = database.lastError (). Text (); //Database is not valid return false; } //Set database configurations.; //FilePath = ": D: FireBirdAndQt debug New.FDB"; //UserName = "Serg"; //Password = 12345; //ConnectionString_ = "server type = Embedded; auto_commit = True; auto_commit_level = 4096; connection lifetime = 1; DataBase = "% 1 ""; database.setDatabaseName (filePath); database.setUserName (userName); database.setPassword (password); QString connectionString = QString (connectionString_). Arg (filePath); database.setConnectOptions (connectionString); bool result = false; //"Openning database. Driver PTR ==% d", (int) database.driver (); result = database.open (); if (! result) { QString lastError = database.lastError (). Text (); lastError_ = (uint) database.lastError (). number (); }
Хочу звернути особливу увагу на налаштування QSqlDatabase об'єкту:
database.setDatabaseName (filePath); database.setUserName (userName); database.setPassword (password); QString connectionString = QString (connectionString_). Arg (filePath); database.setConnectOptions (connectionString);
Логін, пароль і повний шлях до бази даних можна було передати і в рядку з'єднання, але я зіткнувся з такою проблемою. При передачі вищеперелічених налаштувань через рядок з'єднання, а не через функції set ...(), вони не присвоювалися database об'єкту.
Програмне створення бази даних FireBird
Для того щоб створити базу даних програмно, необхідно виконати наступне:
bool FireBirdDatabase:: Create (const QString & filePath, const QString & userName, const QString & password) { if (! isInitialized_) { Initialize (); } if (QFile:: exists (filePath)) { return false; } databasePath_ = filePath; QString queryString; queryString + = "CREATE DATABASE"; queryString + = " '" + filePath + "'"; queryString + = "USER '" + userName + "'"; queryString + = "PASSWORD '" + password + "'"; queryString + = "DEFAULT CHARACTER SET UNICODE_FSS"; ISC_STATUS_ARRAY status; isc_db_handle databaseHandle = NULL; isc_tr_handle transactionHandle = NULL; unsigned short g_nFbDialect = SQL_DIALECT_V6; if (isc_dsql_execute_immediate (status, & databaseHandle, & transactionHandle, 0, queryString.toStdString (). c_str (), g_nFbDialect, NULL)) { long SQLCODE = isc_sqlcode (status); return false; } isc_commit_transaction (status, & transactionHandle); if (databaseHandle! = NULL) { ISC_STATUS_ARRAY status; isc_detach_database (status, & databaseHandle); } return true; }
Чому був обраний саме такий метод створення бази даних? Я маю на увазі isc_dsql_execute_immediate (). Відповідь проста - по-іншому не вийшло. Деякі провайдери дозволяють створювати базу даних таким чином:
... QSqlDatabase db = QSqlDatabase:: addDatabase ("QSQLITE"); db.setDatabaseName (": memory:"); if (! db.open ()) { QMessageBox:: critical (0, qApp->tr ("Cannot open database"), qApp->tr ("Unable to establish a database connection. n" "This example needs SQLite support. Please read" "The Qt SQL driver documentation for information how" "To build it. N n" "Click Cancel to exit."), QMessageBox:: Cancel); return false; } ...
АЛЕ для даної версії Qt і для IBASE драйвера зокрема такий метод не працює. Для детальної інформації можна звернутися до прикладів з Qt («QtDIR examples sql Connection.h »).
Примітка: Будьте уважні, FireBird працює тільки з ASCII кодуванням. Тому якщо ваш шлях (filePath ) містить символи Unicode, то функція «isc_dsql_execute_immediate» поверне помилку.
Запити до бази даних
Простий Select з бази даних
void DatabaseModel:: SelectJobs (QStringList & jobs) { QSqlQuery query = QSqlQuery (fireBirdDatabase_.CreateQuery ()); QString preparedString = "SELECT JOB_NAME FROM TBL_JOBS"; query.prepare (preparedString); if (! query.exec ()) { QString err = query.lastError (). Text (); throw std:: runtime_error ("Error executing Query."); } while (query.next ()) { QSqlRecord record = query.record (); jobs.append (record.value (0). toString ()); } }
де fireBirdDatabase_.CreateQuery () має наступний вигляд:
{ return QSqlQuery (QSqlDatabase:: database (connectionName_)); }
Як викликати збережену процедуру?
Наша процедура приймає як параметр рядок з назвою посади - текстовий рядок, розмір зарплати для цієї посади - ціле число, а також опис, який зберігатиметься в бінарному вигляді (BLOB).
Процедура повертає ID нового запису.
{ ... QByteArray description ("Test description"); int salary = 1200; jobName = "tester"; QSqlQuery query (fireBirdDatabase_.CreateQuery ()); bool result = query.prepare ("EXECUTE PROCEDURE SP_INSERT_JOB (?,?, ?)"); query.addBindValue (jobName); query.addBindValue (salary); query.addBindValue (description); if (! query.exec ()) { QString err = query.lastError (). Text (); throw std:: runtime_error ("Error executing Query."); } query.next (); int jobID = query.value (0). toUInt (); ... }
Корисні посилання
- Firebird database .
- FlameRobin (open-source administration tool).
- IBExpert (administration tool, free Personal Edition download).
- Other Firebird tools .
- QtSDK 4.5.2 .
Опубліковано: 07/11/11 @ 02:51
Розділ Різне
Рекомендуємо:
Обзор сервиса PostProfit.net
Інтерв'ю - Іван Абраменко, творець відеоуроків по Drupal та автор сайту site-made.ru
Дайджест тижня, 3 листопада
16 листопада, Київ - DOU HR Cafe # 1
4 способи зробити свій сайт успішним на багато років