Announcement

Collapse
No announcement yet.

Autowert für neuen Datensatz im DataGridView ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Autowert für neuen Datensatz im DataGridView ermitteln

    Hallo,

    ich nutze ein DataGridView für Daten aus einer Access-Tabelle, welche mittels eines Where-Statements gefiltert werden. Dadurch hat der letzte Eintrag nicht die höchste ID aus der Datenbank.
    Wenn ich nun einen neuen Datensatz in das DataGridView einfüge, wird für das AutoWertFeld der Wert aus der darüber liegenden Zeile +1 angezeigt.
    Wie bekomme ich den Autowert, den Access vergeben hat in das Feld?
    Mit "SELECT max(Autowert) as ... FROM ..." funktioniert es nicht, da der Autowert ja z.B. nicht zurückgesetzt wird, wenn Datensätze gelöscht werden oder Rollbacks geschehen.
    @@Identity kann Access leider auch nicht, soweit ich weiß.

    Eigentlich wollte ich die Tabelle erst aktualisieren, wenn das DataGridView verlassen wird. Bis dahin könnten nat. mehrere neue Datensätze angelegt werden. Notfalls könnte ich aber darauf verzichten.

    (Die Entscheidung für die Access-Datenbank lag nicht bei mir, sondern ist vorgeschrieben )
    Ich bin nicht die Signatur, ich putz hier nur

  • #2
    Hallo,

    Erst dann, wenn dieser neue Datensatz auch wirklich in der ACCESS-Datenbank eingetragen wurde, steht der Wert fest. Bis dahin arbeitet das DataSet im Offline-Modus, so dass alle neuen AutoWertFeld-Wert nur "unverbindlich geschätzt" werden.

    Ein Experiment verdeutlicht das Problem: Das Programm wird 2 Mal gestartet und in beiden Instanzen wird ein neuer Datensatz im DataGridView (DataSet) eingetragen. Beide Instanzen zeigen den gleichen neuen Wert an. Erst beim Aufruf der Update-Methode werden die neuen Datensätze in der ACCESS-Datenbank geschrieben und erhalten erst dann den tatsächlichen AutoWertFeld-Wert entsprechend der Aufruf-Reihenfolge.

    Wie bekomme ich den Autowert, den Access vergeben hat in das Feld?
    Der neue Datensatz muss von ACCESS nachgeladen und über die Merge-Methode in das DataSet eingemischt werden. Dieser Umweg ist im Gegensatz dazu beim MS SQL Server nicht notwendig - hier baut der Assistent von Visual Studio alle notwendigen Aufrufe automatisch in den TableAdapter ein.

    Wenn der neue Datensatz nicht über logische WHERE-Kriterien eindeutig erkennbar ist, muss anstelle von Merge das komplette DataSet neu von ACCESS geladen werden.

    Comment


    • #3
      Wie das im DataGridView läuft, ist schon klar. Die Datensätze sind nicht unbedingt über Where-Kriterien ermittelbar. Ein Merge nutze ich bereits. Allerdings steht diese falsche ID dann auch im DataTable
      Ich könnte natürlich den ganzen DataGridView neu erstellen. Allerdings bekomme ich eine Fehlermeldung, dass ich dies nicht im Eventhandler machen kann. Genau dort bräuchte ich das in dem Falle.

      Hier mal der Code für das Schreiben der Änderungen:

      Code:
      if (this.dtCache != null) //dtCache ist eine DataTable
      {
        try
        {
          DataTable dtChanges = this.dtCache.GetChanges();
          if (dtChanges != null)
          {
            ...DB_Helper.WriteDataGrid(ref dtChanges, strSQLCache); //Methode mit CreateCommandBuilder usw.
            this.dtCache.Merge(dtChanges);
            this.dtCache.AcceptChanges();
          }
        }
        catch (Exception ex)
        {
          this.dtCache.RejectChanges();
        }
      }
      Eine Möglichkeit, dass sich der DataGridView selbst aktualisiert auf Basis eines DataTables gibt es nicht, oder?
      Ich bin nicht die Signatur, ich putz hier nur

      Comment

      Working...
      X