Autor Beitrag
goldensurfer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45



BeitragVerfasst: Do 29.05.08 09:52 
Hallo,

ich habe hier einen ganz blöden Fehler beim Zugriff auf eine SQLite-Datenbank, und zwar bei einer Anwendung für Windows CE. Ich entwickle das Programm mit VisualStudio und teste es unter Verwendung des eingebauten Pocket PC Emulators "Pocket PC 2003 second edition".
Es gibt eine Tabelle "Params", mit den Spalten "parameter" und "value", beide als TEXT definiert. Diese Tabelle soll Programmparameter speichern, also immer Tupel vom Typ parameter=value.
Es gibt eine SQLiteConnection (conn), die beim ersten Aufruf einer DB-Funktion geöffnet wird und dann auch offen bleibt, bis die Form geschlossen wird.
Lesen aus der Tabelle klappt einwandfrei, nur beim Schreiben gibt es Probleme. Hier erstmal meine Schreib-Funktion:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
private void paramSet(string paramName, string paramValue)
{
  if (!openDB()) //wenn sich DB nicht oeffnen laesst, dann Ende
    return;

  //SQLiteTransaction trans = conn.BeginTransaction();
  SQLiteCommand cmd = new SQLiteCommand(
     "delete from Params where parameter='" + paramName + "'",
     conn);
  cmd.ExecuteNonQuery(); //alten Parametersatz vorsichtshalber loeschen

  cmd.CommandText = "insert into Params (parameter, value) values ('" 
      + paramName + "','" + paramValue + "')";
  try
  {
    cmd.ExecuteNonQuery();
  }
  catch (Exception ex)
  {
    MessageBox.Show("Error in 'paramSet': " + ex.Message, "Error");
    //trans.Rollback();
  }
  //trans.Commit();
}


Wenn ich das so ausführe, scheint erstmal alles zu klappen. Die geschriebenen Daten kommen in der Datenbank an (das kann ich testen, weil sie an anderer Stelle wieder gelesen werden).
Beim ersten Schreibzugriff wird dann im Dateisystem die .db-journal-Datei angelegt und bleibt auch bestehen.
Wenn ich das Programm nun beende (dabei wird die Close-Methode der Connection aufgerufen), erscheint auf dem Emulator die Fehlermeldung:
"A native exception has occured in cb.exe. Select Quit and then restart this program, or select Details for more information."
Die "Details" besagen dann nur: ExceptionCode: 0xc0000005 sowie eine ExceptionAddress und ein Wert für "Reading". Nach "Quit" meldet VisualStudio: "The remote connection to the device has been lost. Please verify the device connection and restart debugging."

Baue ich das Programmstück oben so um, dass die Transaction-Zeilen drin sind, bekomme ich beim ersten Schreibzugriff am Ende der Prozedur trans.Commit() eine Exception:
"SQLite error. cannot commit transaction - SQL statements in progress"
Selbe Fehlermeldung taucht auch auf, wenn ich statt der Transaction-Befehle am Ende der Prozedur ein conn.Close() einfüge.

Kann mir einer einen Tipp dazu geben?

Danke für alle Ideen,
Ralf