Починаючи роботу з 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 способи зробити свій сайт успішним на багато років