Ist es sicher, DataTable PrimaryKey-Values temporär negativ zu setzten?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von asuryan.

    Ist es sicher, DataTable PrimaryKey-Values temporär negativ zu setzten?

    Hallo!

    Ich versuche gerade meinen SQLite Wrapper etwas zu verbessern und bin auf ein Problem gestoßen.

    Folgender Code:

    C#-Quellcode

    1. public SCSQLiteResult insertRows(List<DataRow> rows)
    2. {
    3. SCSQLiteResult result = new SCSQLiteResult();
    4. if(rows.Count > 0)
    5. {
    6. DataTable table = rows[0].Table;
    7. String primaryKey = table.PrimaryKey[0].ColumnName;
    8. String sql = SCSQLiteDB.getTableInsertSQL(table);
    9. this.connection.Open();
    10. SQLiteTransaction transaction = this.connection.BeginTransaction();
    11. Int32 rowsAffected = 0;
    12. try
    13. {
    14. // TEMP CHANGE PRIMARY KEY TO NEVER REACHABLE IDs --------
    15. Int32 count = -1;
    16. foreach (DataRow r in rows)
    17. {
    18. r[primaryKey] = count;
    19. count--;
    20. }
    21. // EXECUTE INSERT -----------------------------------------
    22. foreach(DataRow r in rows)
    23. {
    24. SQLiteCommand command = new SQLiteCommand(sql);
    25. command.Connection = this.connection;
    26. // COMMAND PARAMETERS FILL ----------------------------
    27. this.fillSQLiteCommandParameters(r, command);
    28. // COMMAND EXECUTE ------------------------------------
    29. command.ExecuteNonQuery();
    30. // WRITE LAST INSERT ID BACK TO DATATABLE -------------
    31. Int32 lastInsertID = this.getLastInsertID();
    32. r[primaryKey] = lastInsertID;
    33. result.lastInsertID = lastInsertID;
    34. rowsAffected++;
    35. }
    36. transaction.Commit();
    37. result.rowsAffected = rowsAffected;
    38. }
    39. catch (Exception ex)
    40. {
    41. this.printDebug(ex.Message);
    42. transaction.Rollback();
    43. result.setError(ex.Message);
    44. result.rowsAffected = -1;
    45. }
    46. finally
    47. {
    48. this.connection.Close();
    49. }
    50. }
    51. return result;
    52. }



    Wenn ich folgenden Code weglasse:

    C#-Quellcode

    1. // TEMP CHANGE PRIMARY KEY TO NEVER REACHABLE IDs --------
    2. Int32 count = -1;
    3. foreach (DataRow r in rows)
    4. {
    5. r[primaryKey] = count;
    6. count--;
    7. }



    Bekomme ich folgende Fehlermeldung (nicht immer aber manchmal):

    C#-Quellcode

    1. Die Spalte 'id' hat die Einschränkung, dass sie eindeutig sein muss. Der Wert '2' ist bereits vorhanden.


    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“ ()

    Nun, wenn man den DataSet-Designer nutzt und bei einer DataTable-Column AutoIncrement auf True stellt, wird als Seed -1 eingestellt und der Increment-Wert auf -1. Das heißt, dass die erste DataTablezeile den Wert -1 für diese Column erhält, der nächste -2 usw. Von daher: ja, negative Werte sind möglich/einstellbar.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke Dir für Deine Antwort!

    VaporiZed schrieb:

    Von daher: ja, negative Werte sind möglich/einstellbar.


    Gehen wir einmal davon aus, dass nur ich den Wrapper nutze und ich immer Seed=1 und Increment-Wert=1 positiv setze; dann werden diese ja nie negativ.
    Anders formuliert: für diesen Wrapper darf man einfach keine negativen primary keys im DataSet-Designer einstellen.

    Sprich es gibt keine internen Prozesse bei DataSets/DataTables, die zum Markieren der Row ebenso den primary key negativ setzen!?
    Soweit ich weiß ist Deine Annahme korrekt. Nimmt man das automatische Hinzufügen von IDs bei neuer Zeilenerstellung, das Auslesen aus einer Datenquelle und das manuelle Setzen/Manipulieren von Werten durch den Programmierer/User raus, werden keine PrimaryKeys durch tDS oder DataTable manipuliert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.