Починаючи роботу з Qt і Embedded FireBird

Вступ

Ця стаття представляє опис перших кроків по установці Qt, Visual Studio і FireBird. Вона може бути корисною тим, хто тільки починає працювати з базою даних FireBird Embedded за допомогою Qt провайдера. Також ця стаття може стати в нагоді розробникам, які тільки починають працювати з Qt.

На момент написання мною цієї статті розглянутий тут питання було погано документований, і саме тому я сподіваюся, що представлений матеріал може бути дійсно корисним.

У даній статті ми розглянемо такі питання:

  1. Інсталяція Qt SDK, його настройка і інтеграція в Visual Studio.
  2. Збірка IBase плагіна.
  3. Програмне створення бази даних і встановлення зв'язку з нею.
  4. Робота з ім'ям користувача і паролем для бази даних.
  5. Ми розглянемо прості запити до бази даних, а також виклик збережених процедур.

Налаштування оточення

Для перегляду бази даних, запропонованої в якості прикладу нижче в даній статті, можна скористатися такими клієнтами:

Для доступу використовуйте логін і пароль 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) Необов'язково збирати всі проекти. Досить зібрати тільки:

Примітка: 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 зробити наступне:

4. Встановити FireBird:

Firebird можна скачати звідси .

5. Зібрати Plugin для IBase

1) Зайти в папку $ (QtDIR) src plugins sqldrivers ibase і зібрати проект в Debug and Release.

Перед тим як збирати, потрібно встановити такі властивості проекту:

2) Встановити Embedded Server.

З'єднання з існуючою базою даних

Перед тим як встановлювати з'єднання з базою даних, необхідно спочатку довантажити 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 ();
...
    }

Корисні посилання

  1. Firebird database .
  2. FlameRobin (open-source administration tool).
  3. IBExpert (administration tool, free Personal Edition download).
  4. Other Firebird tools .
  5. QtSDK 4.5.2 .

Опубліковано: 07/11/11 @ 02:51
Розділ Різне

Рекомендуємо:

Обзор сервиса PostProfit.net
Інтерв'ю - Іван Абраменко, творець відеоуроків по Drupal та автор сайту site-made.ru
Дайджест тижня, 3 листопада
16 листопада, Київ - DOU HR Cafe # 1
4 способи зробити свій сайт успішним на багато років