crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как правильно заканчивать работу с БД?
Steklova Olga
  опции профиля:
сообщение 5.7.2013, 13:29
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Привет:)
Моя программа работает с одной БД Firebird, использую default connection.
В конструкторе главного окна вызываю метод db_init, в котором делаю addDatabase и db.open().
В других методах класса главного окна и в методах классов, подключенных к нему, работаю с БД, создавая модели, к которым подключаю таблицы БД, и выполняя запросы.
У меня нет в программе removeDatabase. Как-то и так все изменения, которые я вношу в таблицы БД сохраняются в ней.
Обязательно делать removeDatabase в конце программы? Что будет, если не сделать?


В мануале написано, что делают так:
{
    QSqlDatabase db = QSqlDatabase::database("sales");
    QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// Both "db" and "query" are destroyed because they are out of scope
QSqlDatabase::removeDatabase("sales"); // correct

А в моем случае где и как надо вызывать removeDatabase?

Мой код:
MainWindow_db::MainWindow_db(QWidget *parent) :
    QMainWindow(parent)
{
    if (!this->db_init())
        exit(1);
    this->db_work();
}

MainWindow_db::~MainWindow_db()
{

}

bool MainWindow_db::db_init()
{
    QString err_db = "";

    QString applicationDirPath = QApplication::applicationDirPath();
    applicationDirPath.replace("/debug", "");

    QString fileName_DB = "DB1.FDB";
    QString filePath_DB = applicationDirPath + "/" + fileName_DB;

    if (!QFile::exists(filePath_DB)) {
        err_db = "Не удается найти БД " + fileName_DB;
        QMessageBox::critical(NULL, "Ошибка", err_db);
        return false;
    }

    QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE");
    db.setDatabaseName(filePath_DB);
    db.setUserName("XXX");
    db.setPassword("123");
    if (!db.open()) {
        err_db = "Не удается открыть БД";
        QMessageBox::critical(NULL, "Ошибка", err_db);
        return false;
    }

    QSqlDriver *driver = QSqlDatabase::database().driver();
    if (!driver->hasFeature(QSqlDriver::Transactions)) {
        err_db = "Драйвер БД не поддерживает транзакции";
        QMessageBox::critical(NULL, "Ошибка", err_db);
        return false;
    }
    if (!driver->hasFeature(QSqlDriver::PreparedQueries)) {
        err_db = "Драйвер БД не поддерживает подготовленные запросы";
        QMessageBox::critical(NULL, "Ошибка", err_db);
        return false;
    }
    if (!driver->hasFeature(QSqlDriver::BLOB)) {
        err_db = "Драйвер БД не поддерживает BLOB";
        QMessageBox::critical(NULL, "Ошибка", err_db);
        return false;
    }

    return true;
}

Спасибо

Сообщение отредактировал Steklova Olga - 5.7.2013, 16:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.7.2013, 15:35
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Steklova Olga @ 5.7.2013, 15:29) *
Обязательно делать removeDatabase в конце программы? Что будет, если не сделать?
нет, не обязательно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 17:15