LINUX.ORG.RU

QtSql как правильно открыть SQLite-файл

 


0

1

Нужно чтобы приложение работало с разными DB-файлами. Пишу так

в main()

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

в слоте вьюхи

void MyView::openDatabase(){
   QSqlTableModel *m = qobject_cast<QSqlTableModel*>(model());
   m->database().setDatabaseName("test.sqlite3");
   if(!m->database().open()) {
       QMessageBox::critical(0,QObject::tr("Ошибка открытия"),m->database().lastError().text());
    }
}

Приложение работает. Но, в консоли возникает ошибка, хотелось бы избавиться от нее

QSqlDatabasePrivate::database: unable to open database: " " 



Последнее исправление: developer-cpp (всего исправлений: 2)

Ответ на: комментарий от anonymous

драйвер работает.

если в main() все засунуть, то работает

 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("test.sqlite3");
    if(!db.open()) {
        QMessageBox::critical(0,QObject::tr("Ошибка"),db.lastError().text());
    }
нужно разнести код: создать db отдельно и открыть конкретный файл в слоте отдельно

developer-cpp
() автор топика
Ответ на: комментарий от anonymous

связь прямая, все работает ... но алгоритм хромает

ошибка просто печатется в консоле при вызове

model = new QSqlTableModel(this);
в конструкторе виджета, содержащего MyView.

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

связь прямая

Из кода не видно

ошибка просто печатется в консоле при вызове

model = new QSqlTableModel(this);

Этого кода в листинге так же не наблюдается

Ладно, я спать пошёл, а ты оворми тред как полагается - наверняка кто-нибудь из анонимусов тебе укажет на твои ошибки.

anonymous
()
Ответ на: комментарий от anonymous

Смена БД организована так. Приложение работает: БД открывается, таблицы редактируются ... , но в консоли печатается сообщение. Это намекает на не очень хорошую организацию открытия БД.


int main(int argc, char* argv[]){
// ...
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
MyWidget mwidget;
// ...
}

MyWidget::MyWidget(QWidget *parent): QWidget(parent){
// ...
model = new QSqlTableModel(this); // QSqlDatabasePrivate::database: unable to open database: " "
// ...
view = new MyView;
// ...
}

void MyView::openDatabase(){
   QSqlTableModel *m = qobject_cast<QSqlTableModel*>(model());
   m->database().setDatabaseName("test.sqlite3");
   if(!m->database().open()) {
       QMessageBox::critical(0,QObject::tr("Ошибка при открытии"),m->database().lastError().text());
    }
}

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

другой вариант, работать с БД только в слоте открытия файла

void MyView::openDatabase(){
   QSqlDatabase db = QSqlDatabase::database();
   if (db.isOpen()) db.close(); 
   db = QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName("test.sqlite");
   if(!db.open()) {
       QMessageBox::critical(0,QObject::tr("Ошибка"),db.lastError().text());
    }
}

при этом вообще ничего не открывается и нет никаких ошибок...

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

думаю, что я всетаки не верно размещаю слот открытия файла во MyView, этот слот д.б. в MyWidget.

developer-cpp
() автор топика

QSqlDatabasePrivate::database: unable to open database: " "

мне лень сейчас вникать, но не потому ли, что это

QSqlTableModel *m = qobject_cast<QSqlTableModel*>(model());

происходит раньше чем

m->database().setDatabaseName(«test.sqlite3»);

?

т.е. ты должен сначала создать db, потом указать ей имя, и уже только потом трогать model, не?

CryAngel
()
Ответ на: комментарий от CryAngel

Вынес в виджет-документ код открытия БД и код создания модели

void MyWidget::openDatabase(){
 QSqlDatabase db = QSqlDatabase::database();
    if (db.isOpen()) { 
             qDebug() << "close";
	     db.close(); 
	     QSqlDatabase::removeDatabase(db.connectionNames()[0]);
	     delete model;
    }

    db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("test.sqlite");
    if(!db.open()) {
        QMessageBox::critical(0,QObject::tr("Ошибка:"),db.lastError().text());
    }
    model = new QSqlTableModel(this);
    view->setModel(model);
    // ...
}
открываем первый раз, работаем, все хорошо. Но, что-то не получается решить проблему: пользователь открыл первый документ (БД), затем щелкнул еще раз открыть и открыл (этот же документ или другой). Как корректно обработать этот случай:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.

developer-cpp
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.