Russian Qt Forum
Ноябрь 24, 2024, 05:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отсоединиться от БД  (Прочитано 8096 раз)
ASGAlex
Гость
« : Август 29, 2009, 02:22 »

Вопрос новичка, конечно, но пишу сюда:
Пользователь выбирает через QFileDialog::getSaveFileName файл, который будет новой БД. Однако, если файл уже существует, то он удаляется, а на его месте создаётся новый с тем же именем.
Всё проходит гладко, за исключением того случая, когда имя нового файла совпадает с именем уже  открытого файла. В этом случае не происходит подключения к новой БД.
Вопрос: как тогда мне явно отключиться от текущёй БД, чтобы выполнить операции над файлами?
Записан
GreenGo
Гость
« Ответ #1 : Август 29, 2009, 04:08 »

void QSqlDatabase::close ()
Записан
ASGAlex
Гость
« Ответ #2 : Август 29, 2009, 11:38 »

Так вот в чем косяк, close() у меня есть:
Код:
void MainWindowImpl::OnNewDb()
{
// TODO
if(db.isOpen())
{
db.close();
}
filename=QFileDialog::getSaveFileName(0,QString::fromUtf8("Выберите файл для новой БД."),"","*.*");
QFile file(filename);
if(file.exists())
{
if(!file.remove())
{
QMessageBox::critical(0, QString::fromUtf8("Не могу удалить старый файл..."),QString::fromUtf8("Не могу удалить старый файл..."));
}
}
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(filename);
if (!db.open())
QMessageBox::critical(0, QObject::tr("DataBase Error"),db.lastError().text());
И, тем не менее, не получается. Отладчик выдаёт мне вот это:
Код:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlQuery::exec: database not open
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Август 29, 2009, 11:47 »

чтобы БД закрыть, нужно ограничить область видимости переменной типа QSqlDatabase.

Обрати внимание, что во всех примерах используют локальную переменную. И используй статическую функцию:
void QSqlDatabase::removeDatabase ( const QString & connectionName )   [static]
Прочти внимательно описание.
Записан

Юра.
ASGAlex
Гость
« Ответ #4 : Август 29, 2009, 11:49 »

Опа, вот оно как, спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.