Russian Qt Forum

Qt => Базы данных => Тема начата: ASGAlex от Август 29, 2009, 02:22



Название: Отсоединиться от БД
Отправлено: ASGAlex от Август 29, 2009, 02:22
Вопрос новичка, конечно, но пишу сюда:
Пользователь выбирает через QFileDialog::getSaveFileName файл, который будет новой БД. Однако, если файл уже существует, то он удаляется, а на его месте создаётся новый с тем же именем.
Всё проходит гладко, за исключением того случая, когда имя нового файла совпадает с именем уже  открытого файла. В этом случае не происходит подключения к новой БД.
Вопрос: как тогда мне явно отключиться от текущёй БД, чтобы выполнить операции над файлами?


Название: Re: Отсоединиться от БД
Отправлено: GreenGo от Август 29, 2009, 04:08
void QSqlDatabase::close ()


Название: Re: Отсоединиться от БД
Отправлено: ASGAlex от Август 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


Название: Re: Отсоединиться от БД
Отправлено: lit-uriy от Август 29, 2009, 11:47
чтобы БД закрыть, нужно ограничить область видимости переменной типа QSqlDatabase.

Обрати внимание, что во всех примерах используют локальную переменную. И используй статическую функцию:
void QSqlDatabase::removeDatabase ( const QString & connectionName )   [static] (http://doc.crossplatform.ru/qt/4.5.0/qsqldatabase.html#removeDatabase)
Прочти внимательно описание.


Название: Re: Отсоединиться от БД
Отправлено: ASGAlex от Август 29, 2009, 11:49
Опа, вот оно как, спасибо!