crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Базы данных
dexter_man
  опции профиля:
сообщение 17.5.2008, 21:04
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

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




Репутация:   0  


Тут такая проблема организовалась: есть две базы данных, одна создается в памяти, вторая берется из файла.
QSqlDatabase db_mem = QSqlDatabase::addDatabase("QSQLITE");
QSqlDatabase db_file = QSqlDatabase::addDatabase("QSQLITE");
db_mem.setDatabaseName(":memory:");
db_file.setDatabaseName("file_db");

Доступ к этим базам нужен во всех классах программы.
Каким образом такое можно организовать?
Мож их нужно как-то глобально объявить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2008, 21:18
Сообщение #2


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

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

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




Репутация:   94  


Цитата(dexter_man @ 18.5.2008, 1:04) *
Мож их нужно как-то глобально объявить?

нет QSqlDatabase виден во всей программе, это особый класс, только их создать лучше так:
QSqlDatabase db_mem = QSqlDatabase::addDatabase("QSQLITE", "db_mem");
QSqlDatabase db_file = QSqlDatabase::addDatabase("QSQLITE", "db_file");

где строки "db_mem" и "db_file" - уникальные по всей программе имена соединений

т.е. в других частях программы ты обращаешся к базе по имени соединения:
QSqlDatabase db_mem = QSqlDatabase::database("db_mem");

и не забудь когда будешь делать запросы с помощью QSqlQuery, определи БД, т.к. у тебя их две:
 
  QSqlQuery query(db_mem);
  QString      querystr;  

      querystr="SELECT COUNT(*) FROM MYTABLE";
      query.exec(querystr);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 17.5.2008, 21:24
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

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




Репутация:   0  


получается, что в любой части программы (в любом классе) я могу сделать следующее:
QSqlQuery query(db_mem);
QSqlQuery query(db_mem);


Я правильно понял?

А где указывать название базы?

И еще вопрос, а базу нужно каким либо образом закрывать когда завершается работа программы?

Сообщение отредактировал dexter_man - 17.5.2008, 21:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2008, 21:31
Сообщение #4


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

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

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




Репутация:   94  


Цитата(dexter_man @ 18.5.2008, 1:21) *
Я правильно понял?

не совсем, гдето, ты создал соединение так:
QSqlDatabase db_mem = QSqlDatabase::addDatabase("QSQLITE", "db_mem");
QSqlDatabase db_file = QSqlDatabase::addDatabase("QSQLITE", "db_file");
db_mem.setDatabaseName(":memory:");
db_file.setDatabaseName("file_db");

в другом классе, чтобы получить доступ, тебе опять нужна переменная типа QSqlDatabase, но соединение уже создано и тебе нужно лишь использовать его:
QSqlDatabase db_mem = QSqlDatabase::database("db_mem");
QSqlDatabase db_file = QSqlDatabase::database("db_file");

  QSqlQuery query1(db_mem);
  QSqlQuery query2(db_file);
  QString      querystr;  

      querystr="SELECT COUNT(*) FROM MYTABLE";
      query1.exec(querystr);     // Выбор кол-ва записей из таблицы MYTABLE БД ":memory:"

      querystr="SELECT COUNT(*) FROM MYTABLE";
      query2.exec(querystr);    // Выбор кол-ва записей из таблицы MYTABLE БД "file_db"



Цитата(dexter_man @ 18.5.2008, 1:24) *
И еще вопрос, а базу нужно каким либо образом закрывать когда завершается работа программы?

да, ее и открвать надо!
Я открываю так:
// Открываем БД
if (!db_mem.open())
{
    QString qerr = db_mem.lastError().text();
    QMessageBox::critical(0, QObject::tr("Ошибка БД"),
                 QObject::tr("Невозможно открыть БД.\n\r")+qerr,
                 QMessageBox::Cancel);
    return;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dexter_man
  опции профиля:
сообщение 17.5.2008, 21:34
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 12.5.2008
Пользователь №: 173

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




Репутация:   0  


Не, то что надо открывать эт я уже понял, а как тогда закрвать? Или закрывать все таки не надо?
PS Просто седня с 7 утра сижу за компом, уже ниче не соображаю

Сообщение отредактировал dexter_man - 17.5.2008, 21:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2008, 21:47
Сообщение #6


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

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

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




Репутация:   94  


close() , я предпочитаю закрывать, может Qt и сама может это сделать при закрытии программы, я не вкурсе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Arceny
  опции профиля:
сообщение 26.5.2008, 18:37
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 15.4.2008
Из: Брянск
Пользователь №: 149

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




Репутация:   0  


А как быть, если я в процессе работы программы хочу открыть новую БД (возможно даже другого типа, например QPSQL)? Пробовал close(),получаю при открытии ругань

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.

bool mainWindow::connectDB() {
    //static bool first=true;
    //if(first) {
    db = QSqlDatabase::addDatabase(cnf.dbType);
    //first=false;
    //}
    db.setDatabaseName(cnf.dbName);
    db.setHostName(cnf.server);
    db.setUserName(cnf.username);
    db.setPassword(cnf.password);
    if(!db.open()) {
        QMessageBox::warning(this, tr("Database error!"), db.lastError().text());
        return false;
    }
    return true;
}

void mainWindow::disconnectDB() {
     if(db.isOpen()) {
         db.close();
         QSqlDatabase::removeDatabase(db.connectionName()); // correct
     }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.5.2008, 19:04
Сообщение #8


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

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

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




Репутация:   94  


Цитата
void QSqlDatabase::removeDatabase ( const QString & connectionName ) [static]
Removes the database connection connectionName from the list of database connections.
Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Arceny
  опции профиля:
сообщение 26.5.2008, 19:17
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 15.4.2008
Из: Брянск
Пользователь №: 149

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




Репутация:   0  


У меня нет отпкрытых запросов. У меня вообще в моём приложении пока что их нет. БД просто открывается и закрывается (полностью, через QSqlDatabase::removeDatabase).

Я вообще вызываю db.close(); перед вызовом removeDatabase, который как написано в документации должен
Closes the database connection, freeing any resources acquired, and invalidating any existing QSqlQuery objects that are used with the database.

Сообщение отредактировал Arceny - 26.5.2008, 19:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 26.5.2008, 20:16
Сообщение #10


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(Arceny @ 26.5.2008, 19:37) *
db = QSqlDatabase::addDatabase(cnf.dbType);
Ты немного не правильно это делаешь, можно добавлять несколько БД, и одновременно с ними работать:
Цитата
Первый аргумент QSqlDatabase::addDatabase() - это имя драйвера. Для получения списка драйверов, см. документацию addDatabase(). Для инициализации данных соединения мы вызываем setHostName(), setDatabaseName(), setUserName() и setPassword().

Так как имя соединения не определено, соединение становится соединением по умолчанию. Для определения имени, передайте его в качестве второго аргумента в QSqlDatabase::addDatabase(). Например:
        QSqlDatabase firstDB = QSqlDatabase::addDatabase("QMYSQL", "first");
        QSqlDatabase secondDB = QSqlDatabase::addDatabase("QMYSQL", "second");
Как только соединение инициализировано, мы должны вызвать QSqlDatabase::open() для открытия бызы данных и получения доступа к данным. Если запрос соединения потерпит неудачу, функция возвратит false; информацию об ошибке можно получить из QSqlDatabase::lastError().

Как только соединение установлено, мы можем получить указатель на него из любого места прораммы, вызвав статическую функцию QSqlDatabase::database(). Если мы вызываем данную функцию без параметра, она возвратит указатель на соединение по умолчанию. Если функция вызывается с идентификатором, использованным при установке соединения, она возвратит ссылку на указанное соединение. Например:
        QSqlDatabase defaultDB = QSqlDatabase::database();
        QSqlDatabase firstDB = QSqlDatabase::database("first");
        QSqlDatabase secondDB = QSqlDatabase::database("second");

Для удаления соединения с базой данных, сначала закройте базу данных с помощью QSqlDatabase::close(), а затем, удалите ее с помощью статического метода QSqlDatabase::removeDatabase().
Читаем: Модуль QtSql ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 18.6.2024, 9:59