Seite 1 von 1

Während der Laufzeit die SQLite DB wechseln

Verfasst: 12. Februar 2009 11:27
von Strayer
Hi,

ich arbeite an einem Programm mit zwei Model/View-Komponenten die auf eine SQLite Datenbank zugreifen.

Ich möchte nun während der Laufzeit die Datenbank wechseln. Das ganze klappt auch, nur wird die "alte" SQLite Datenbank nicht geschlossen.
Hier ist der Code der die Datenbank öffnet:

Code: Alles auswählen

bool DataHandler::openDatabase(QString file, bool removeBeforeOpen)
{
	// Ggfs. alte DB schließen
	if (QSqlDatabase::contains(QSqlDatabase::defaultConnection))
	{
		QSqlDatabase::database().close();
		QSqlDatabase::removeDatabase(QSqlDatabase::defaultConnection);
	}

	// Angegebene Datei löschen
	if (removeBeforeOpen && QFile::exists(file))
		qDebug() << QFile::remove(file);
	
	QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
	db.setDatabaseName(file);

	if (!db.open())
	{
		QMessageBox::critical(0, QObject::tr("Datenbankfehler!"),
			db.lastError().text());
		return false;
	}

	createWeekEntriesMapping();

	return true;
}
Wie man dort schon sieht möchte ich auch die aktuelle Datenbank überschreiben können.
Ich dachte es würde reichen wenn ich die aktuelle DB schließe, die Datei lösche und neu öffne, aber das ganze klappt leider nicht.

removeDatabase erzeugt diese Warnung:

Code: Alles auswählen

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
Die Dateihandles werden auch nicht geschlossen. (habe ich mit Unlocker überprüft)
Wenn ich die Model/View-Komponenten nicht erstelle klappt alles einwandfrei.

Mein Gedanke wäre gewesen, die Models vor dem schließen der Datenbank von den Views zu entbinden und mit delete zu löschen, aber sowas geht wohl nicht...

Wie kann ich dieses Problem lösen?

Danke schonmal,
Strayer

Verfasst: 12. Februar 2009 11:38
von Christian81
Solange noch ein QSqlQuery drauf zugreift geht es nicht - bleibt also nur die QSqlQueryModels zu löschen indem man z.B. ein leeres Model setzt.