Announcement

Collapse
No announcement yet.

Bearbeitung verbundener Tabellen?

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

  • Bearbeitung verbundener Tabellen?

    Hallo,

    Umg.: Delphi 6 Ent. UP2, ADO, MSSQL (auch MSDE) und Oracle

    Datenmodellfragment:<pre>Tabelle T1
    ID int not null (Primärschlüssel)
    LastUpdate datetime not null

    Tabelle T2
    ID int not null (Primärschlüssel, Fremdschlüssel zu T1 in 1:1-Beziehung)
    Name varchar(80) not null</pre>

    Nun möchte ich die Felder (ID, LastUpdate und Name) aus T1 und T2 in einem Grid darstellen, inkl. bearbeiten, neu anlegen und löschen. Wie mache ich das in ADO?

    Mit der BDE hatte ich hier die Möglichkeit über das Gespann TQuery + TUpdateSQL.

    Stephan

  • #2
    Hallo,

    beim Recordset-Objekt von ADO besteht die Einschränkung, dass die automatisch generierten INSERT-, UPDATE- und DELETE-Anweisung außerhalb unserer Kontrolle generiert werden. Wird können zwar bei einer aus einem JOIN stammenden Datenmenge die dynamische Eigenschaft <b>Unique Table</b> setzen, um eine DELETE-Anweisung nur auf diese Tabelle zu begrenzen. Aber auch dann generiert das Recordset-Objekt INSERT- und UPDATE-Anweisungen für die Spalten in allen passenden Tabellen.
    <pre>

    procedure ADODataSetAfterOpen(DataSet: TDataSet);
    begin
    ADODataSet.Properties['Unique Table'].Value:='TabelleX';
    end;

    </pre>

    Wenn dieser Automatismus nicht ausreicht, kann man die INSERT- und UPDATE-Anweisung in eigener Regie kontrollieren, indem man in einer Schleife durch alle Datensätze geht und je nach vorgefundenem Zustand separate TADOCommands ausführen. Das Recordset (alias TADODataSet) wird dazu im Modus <b>ltBatchOptimistic</b> betrieben, so dass nach der eigenen Behandlung alle offenen Operationen über den Aufruf der Methode <b>CancelBatch</b> entwertet werden können:
    <pre>

    with ADODataSetDetailC do
    begin
    First;
    while not EOF do
    begin
    if UpdateStatus = usInserted then
    ShowMessage('INSERT....: ' + ADODataSetDetailCEintrag.Value);
    ... TADOCommand für INSERT ausführen...
    if UpdateStatus = usModified then
    ShowMessage('UPDATE....: ' + ADODataSetDetailCEintrag.Value);
    ... TADOCommand für UPDATE ausführen ...
    Next;
    end;
    First;
    CancelBatch;
    end;

    </pre>

    P.S: Beim neuen ADO.NET geht der entsprechende Data Adapter automatisch so vor, indem er alle geänderten Datensätze nacheinander auswertet, und eine von 3 zugeordneten Command-Objekten (INSERT, UPDATE,DELETE) aufruft. Mit ADO müssen wird dies allerdings noch von Hand implementieren

    Comment

    Working...
    X