Announcement

Collapse
No announcement yet.

Insert/Update-Flag manipulieren

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

  • Insert/Update-Flag manipulieren

    hallo, ich habe ein offenes ADODataSet mit mehrern Datensätzen. Ich möchte nun Datensätze, welche in der Tabelle bereits existieren diesem offenen ADODataSet hinzufügen und zwar mit teilweise geänderten Werten. Kann ich das ADODataSet so manipulieren, dass die Datensätze beim nächsten UpdateBatch (DataSet wird im BatchOptimistic-Mode betrieben) nicht erneut in die Tabelle eingefügt werden, was eine Schlüsselverletzung produziert, sondern so abgespeichert werden als seien sie editiert worden? Danke für jeglichen Tip.

  • #2
    Hallo,

    das Recordset-Objekt deklariert die Eigenschaft <b>Status</b> in seinem Interface als ReadOnly-Eigenschaft, so dass Delphi beim Importieren die folgende Anweisung generiert:
    <pre>
    property Status: Integer read Get_Status;
    </pre>
    Somit kann der Status des aktuellen Datensatzes auf diesem Weg über Status (Recordset) oder UpdateStatus (TADODataSet) nicht nachträglich geändert werden.

    Anstellte das Recordset zu manimulieren, sollte diese Aufgabe auf die Datenbank abgeschoben werden. Wenn zum Beispiel der Microsoft SQL Server 2000 als Datenbank verwendet wird, hilft ein INSTEAD OF-Trigger weiter. Der sorgt dafür, dass alle die von ADO automatisch generierten SQL-Anweisungen niemals bei der Tabelle ankommen, sondern nur das in der Datenbank landet, was man selbst im Trigger implementiert. Somit kann man im Trigger prüfen, ob der Primärschlüsselwert bereits vorhanden ist. Wenn ja, macht man aus dem INSERT ein UPDATE.

    Wenn das nicht in Frage kommt, steht immer noch der Weg des direkten Auswertens zur Verfügung, wie das folgende Beispiel demonstriert:
    <pre>
    procedure TFormMasterDetail.ButtonLoopCClick(Sender: TObject);
    begin
    with ADODataSetDetailC do
    begin
    First;
    while not EOF do
    begin
    if UpdateStatus = usInserted then
    ShowMessage('INSERT....: ' + ADODataSetDetailCEintrag.Value);
    if UpdateStatus = usModified then
    ShowMessage('UPDATE....: ' + ADODataSetDetailCEintrag.Value);
    Next;
    end;
    end;
    end;
    </pre>
    Anstelle von UpdateBatch geht man selbst durch die Datenmenge und wertet die durchzuführende Aktion aus. Wenn man in der Recordset-Datenmenge eine Hilfsspalte für die o.g. Sonderfälle verwendet, kann man auch dann ein UPDATE losschicken, wenn als UpdateStatus der Wert usInserted vorgefunden wird

    Comment


    • #3
      ich werde versuchen, den tip im delphi-code einzubauen, da ich ansonsten das Verhalten der Datenbanktabelle ändere. Danke erstmal für die Hilfe

      Comment

      Working...
      X