Seite 1 von 1

SQL Datenbanken und Threads

Verfasst: 4. März 2010 15:43
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]

Verfasst: 4. März 2010 16:01
von Christian81
Du machst zweimal ein addDatabase mit dem gleichen Namen... -> http://doc.trolltech.com/4.6/qsqldataba ... ddDatabase

Verfasst: 4. März 2010 16:38
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.

Verfasst: 4. März 2010 16:56
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.

Verfasst: 5. März 2010 10:42
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

Verfasst: 5. März 2010 14:03
von acdc
Die Datenbank wird von dem QSQLTableModel gesperrt, welches meine Daten anzeigt. Wie kann ich diesen Lock aufheben?

mfg acdc

Verfasst: 5. März 2010 17:50
von Christian81
Das QSQLTableModel zerstören und fertig.

Verfasst: 8. März 2010 08:27
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?

Verfasst: 8. März 2010 08:40
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.