Hallo!
Ich versuche gerade meinen SQLite Wrapper etwas zu verbessern und bin auf ein Problem gestoßen.
Folgender Code:
Wenn ich folgenden Code weglasse:
Bekomme ich folgende Fehlermeldung (nicht immer aber manchmal):
Klar, kann ja sein, dass er gerade versucht eine ID wieder zurückzuschreiben, die aber im aktuellen DataTable schon vergeben ist, weil der foreach-loop die Zeile noch nicht erreicht hat.
Daher hab ich mir gedacht, ich schreibe alle PrimaryKeys VOR dem Insert einfach auf Werte, die nie erreicht werden (also zb. negativ) um, damit es diesen Konflikt nicht gibt.
Funktioniert, hurra!
Aber ist das save!? Also kann es sein, dass auf einem DataTable IDs auch aus anderen Gründen mal negativ sein können!?
Ich versuche gerade meinen SQLite Wrapper etwas zu verbessern und bin auf ein Problem gestoßen.
Folgender Code:
C#-Quellcode
- public SCSQLiteResult insertRows(List<DataRow> rows)
- {
- SCSQLiteResult result = new SCSQLiteResult();
- if(rows.Count > 0)
- {
- DataTable table = rows[0].Table;
- String primaryKey = table.PrimaryKey[0].ColumnName;
- String sql = SCSQLiteDB.getTableInsertSQL(table);
- this.connection.Open();
- SQLiteTransaction transaction = this.connection.BeginTransaction();
- Int32 rowsAffected = 0;
- try
- {
- // TEMP CHANGE PRIMARY KEY TO NEVER REACHABLE IDs --------
- Int32 count = -1;
- foreach (DataRow r in rows)
- {
- r[primaryKey] = count;
- count--;
- }
- // EXECUTE INSERT -----------------------------------------
- foreach(DataRow r in rows)
- {
- SQLiteCommand command = new SQLiteCommand(sql);
- command.Connection = this.connection;
- // COMMAND PARAMETERS FILL ----------------------------
- this.fillSQLiteCommandParameters(r, command);
- // COMMAND EXECUTE ------------------------------------
- command.ExecuteNonQuery();
- // WRITE LAST INSERT ID BACK TO DATATABLE -------------
- Int32 lastInsertID = this.getLastInsertID();
- r[primaryKey] = lastInsertID;
- result.lastInsertID = lastInsertID;
- rowsAffected++;
- }
- transaction.Commit();
- result.rowsAffected = rowsAffected;
- }
- catch (Exception ex)
- {
- this.printDebug(ex.Message);
- transaction.Rollback();
- result.setError(ex.Message);
- result.rowsAffected = -1;
- }
- finally
- {
- this.connection.Close();
- }
- }
- return result;
- }
Wenn ich folgenden Code weglasse:
Bekomme ich folgende Fehlermeldung (nicht immer aber manchmal):
Klar, kann ja sein, dass er gerade versucht eine ID wieder zurückzuschreiben, die aber im aktuellen DataTable schon vergeben ist, weil der foreach-loop die Zeile noch nicht erreicht hat.
Daher hab ich mir gedacht, ich schreibe alle PrimaryKeys VOR dem Insert einfach auf Werte, die nie erreicht werden (also zb. negativ) um, damit es diesen Konflikt nicht gibt.
Funktioniert, hurra!
Aber ist das save!? Also kann es sein, dass auf einem DataTable IDs auch aus anderen Gründen mal negativ sein können!?
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „asuryan“ ()