SQL Datenbanken und Threads

Alles rund um die Programmierung mit Qt
Antworten
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

SQL Datenbanken und Threads

Beitrag von acdc »

Hallo,

Ich habe eine SQL Datenbank:

Code: Alles auswählen


db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName("database/DB1.db");
  if (!db.open())
    QMessageBox::critical(0,trUtf8("Datenbank kann nicht geöffnet werden"),"SQLITE", QMessageBox::Cancel);
Ich benutze QSQLTableModel um die Datenbank anzugen in einem Widget. über die Toolbar kann ich nun eine länger dauernde Aktion starten. Dabei starte ich einen neuen Thread:

Code: Alles auswählen

    csvThread = new CSVtoDatabaseThread(db,&tableBrowserNormHeader,lieferantenConfListe,this);
    
    connect(csvThread,SIGNAL(finished()),this,SLOT(threadReady()));
    
    csvThread->start();
Die Datenbank verbindung bleibt dabei aufrecht (weis auch nicht wie man sie trennen kann).

In dem Thread benutze ich die selbe Datenbank wieder und mache dor das Selbe:

Code: Alles auswählen


db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName("database/DB1.db");
  if (!db.open())
    QMessageBox::critical(0,trUtf8("Datenbank kann nicht geöffnet werden"),"SQLITE", QMessageBox::Cancel);
Mit
db.transaction();
db.commit();
db.rollback();

und benutze dazwischen
QSqlQuery query;
if(query.exec("Insert....."))

beschleunige ich die Ganze Prozedur.

Der Debugger meldet:
Warning: QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
Warning: QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

Wie kann ich nun diese Datenbank in in dem einen und auch anderen Thread benutzen?

mfg acdc
[/quote]
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du machst zweimal ein addDatabase mit dem gleichen Namen... -> http://doc.trolltech.com/4.6/qsqldataba ... ddDatabase
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

Christian81 hat geschrieben:Du machst zweimal ein addDatabase mit dem gleichen Namen... -> http://doc.trolltech.com/4.6/qsqldataba ... ddDatabase
Ich muss aber "QSQLITE" verwenden, da das der Datenbanktreiber ist.

Habe es jetzt mit

addDatabase("QSQLITE","1");
addDatabase("QSQLITE","2");
(jeder Verbindung einen Namen geben.)
versucht.

Leider funktionierts noch immer nicht.
Zuletzt geändert von acdc am 4. März 2010 16:58, insgesamt 1-mal geändert.
drizzt
Beiträge: 29
Registriert: 9. Oktober 2009 13:37

Beitrag von drizzt »

Christian81 meint, dass du 2x addDatabase aufrufst... damit erzeugst du 2 connections... (doku lesen)

beim 2. mal solltest du nur db = QSqlDatabase::database() aufrufen.
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

Mache ich einen Durchlauf, so funktioniert das Ganze.

Beim Zweiten mal erscheint:

Der ErrorString der Datenbank sagt:
"database is locked Unable do commit transaction"


Wo soll ich hier zum Suchen anfangen?

mfg acdc
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

Die Datenbank wird von dem QSQLTableModel gesperrt, welches meine Daten anzeigt. Wie kann ich diesen Lock aufheben?

mfg acdc
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das QSQLTableModel zerstören und fertig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Christian81 hat geschrieben:Das QSQLTableModel zerstören und fertig.
Müsste/Sollte man das nicht auch übers Model committen können, ohne das Objekt zu löschen? Macht submit kein commit?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

pfid hat geschrieben: Müsste/Sollte man das nicht auch übers Model committen können, ohne das Objekt zu löschen? Macht submit kein commit?
Egal ob commit oder nicht - die DB-Connection ist immer noch offen. Bzw. der RefCount ist immer noch da.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten