Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Delphi-Oracle8-tquery.Delete (https://www.delphipraxis.net/9339-delphi-oracle8-tquery-delete.html)

IlseB 24. Sep 2003 13:50


Delphi-Oracle8-tquery.Delete
 
Ich bin Neueinsteiger in das DB-System Oracle. Bisher wurde alles mit Paradox-Dbs realisiert, was auch wunderbar funktionierte, die gleiche Funktionalität ist in Oracle aber trotz vieler Variationen nicht realisierbar. So zum Beispiel:

Erstellen einer Sicht mit TQuery (funktioniert)
Abfrage ob Sätze vorhanden (funktioniert)
Löschen aller Datensätze mit
a) einfachem DELETE im PGM-Code (tut so als ob, nach
wiederholtem Aufruf des Pgms alle Sätze aber wieder vorhanden)

b) UPDATESQL : 1.Löschversuch => Fehlermeldung (Tabelle
schreibgeschützt)
ignorieren und 2.Versuch => Löschen funktioniert in
Zeitlupe
c) execSQL : wie a).


Ist einer von oben aufgeführten Lösungswegen möglich??? Wenn ja, welcher und wie?

Phoenix 24. Sep 2003 13:52

Re: Delphi-Oracle8-tquery.Delete
 
Jupp. Oracle braucht bei Deletes wie auch bei updates immer ein COMMIT; nach dem Statement.

Ohne Commit nimmt Oracle die Änderung nicht an. Ist ein wenig blöd, da stolpern die meisten drüber am Anfang. Ora ist da leider generell ein wenig gewöhnungsbedürftig.

IlseB 24. Sep 2003 14:05

Re: Delphi-Oracle8-tquery.Delete
 
Danke für die schnelle Antwort, nur LEIDER klappt es trotzdem nicht!

Jetzt tut er wieder nur so, als ob er löscht - Sätze sind aber immer
noch da.

Und nun?

r_kerber 24. Sep 2003 14:10

Re: Delphi-Oracle8-tquery.Delete
 
Hallo Ilse,

kannst Du mal ein kurzes Prog-Beispiel bereitstellen?

IlseB 24. Sep 2003 14:16

Re: Delphi-Oracle8-tquery.Delete
 
Liste der Anhänge anzeigen (Anzahl: 1)
Import-Routine in im Anhang

IlseB 24. Sep 2003 14:55

Re: Delphi-Oracle8-tquery.Delete
 
hier nochmal die Procedure :

Delphi-Quellcode:
procedure TfrmImportAllg.sbtnImportClick(Sender: TObject);
begin
  // prüfen ob Datei und Jahr ausgewählt wurden
  if (cbxJahr.ItemIndex > -1) and (cbxDateiAusw.ItemIndex > -1) then begin
    //Prüfen ob Datensätze schon in TableGde vorhanden
    if quAllg.Active then begin
      quAllg.Close;
    end;
    quAllg.ParamByName('PJahr').AsInteger:= StrToInt(cbxJahr.Text);
    quAllg.Prepared := False;
    if not quAllg.Active then begin
      quAllg.Open;
    end;
    with cbxDateiAusw do begin
      if quAllg.IsEmpty then begin
        quAllg.Close;
        // importieren der ausgewählten Datei
        case ItemIndex of
          0 : begin
            ImportCopyGde;
          end;
          1 : begin
            ImportCopyBank;
          end;
          2 : begin
            ImportCopyGdeBank;
          end;
          3 : begin
//            ImportCopyAdr;
              ExcelTabOeffnen;
              DBAdrfuellen;
          end;
        end; //Case-end
      end else begin // quAllg not empty
        // Meldung dass Datensätze bereits vorhanden und
        // Abfrage ob überschrieben werden soll
        if MessageDlg('Datensätze mit Jahr ' + cbxJahr.Text + ' bereits vorhanden! Überschreiben ?',
             mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
          //Löschen und importieren => Überschreiben der Sätze
          quAllg.First;
          case ItemIndex of
            0 : begin
              try
               quAllg.CachedUpdates := true;
               quAllg.UpdateObject := frmDataModul.UpdateGde;
                while not quAllg.Eof do begin
                  quAllg.Delete;
                end;
              finally
                quAllg.ApplyUpdates;
                quAllg.CachedUpdates := false;
              end;
            end;
            1 : begin
              try
               quAllg.CachedUpdates := true;
               quAllg.UpdateObject := frmDataModul.UpdateGdeBank;
                while not quAllg.Eof do begin
                  quAllg.Delete;
                end;
              finally
                quAllg.ApplyUpdates;
                quAllg.CachedUpdates := false;
              end;
            end;
            2 : begin
              try
               quAllg.CachedUpdates := true;
               quAllg.UpdateObject := frmDataModul.UpdateBank;
                while not quAllg.Eof do begin
                  quAllg.Delete;
                end;
              finally
                quAllg.ApplyUpdates;
                quAllg.CachedUpdates := false;
              end;
            end;
            3 : begin
                while not (quAllg.Eof) do begin
                  frmHaupt.dbFinalDi.StartTransaction;
                  quAllg.Delete;
                  frmHaupt.dbFinalDi.Commit;
                end;
            end;
          end;
          case ItemIndex of
            0 : begin
             //*ImportCopyGde;
            end;
            1 : begin
             //* ImportCopyBank;
            end;
            2 : begin
             //* ImportCopyGdeBank;
            end;
            3 : begin
             //* ImportCopyAdr;
            end;
          end;  //Case-end
          showmessage('hier sollten die Sätze überschrieben werden');
        end else begin //Datensätze nicht überschreiben
          // routine beenden => normal keine Handlung mehr nötig,
          // dient momentan nur zur Kontrolle
          showmessage('hier sollten wir auf anständige Art und Weise das ganze beenden');
        end;    //if msgDialog-end
      end;      //quAllg.empty-end
    end;        // with cbxDateiAusw-end
  end else begin // Jahr oder Dateiname nicht ausgewählt
    showmessage('Sie müssen vor dem Import sowohl eine Datei als auch das Jahr auswählen!');
  end;          // Jahr+Dateiname ausgewählt-end
end;
[edit=MrSpock]Code-Tags hinzugefügt. Mfg, MrSpock[/edit]

Phoenix 24. Sep 2003 15:06

Re: Delphi-Oracle8-tquery.Delete
 
IEEKS. Für sowas haben wir doch die CODE - und auch die Delphi Tags... :roll:

Nagut. Was für Komponenten sind das die da verwendet werden? Ich dachte ich sagte, der DELETE - Befehl müsste mit einem Commit bestätigt werden. Ich sagte nicht, das man den Delete-Befehl in eine Transaction setzen muss.

Also entweder:
1.) DELETE
2.) COMMIT

oder
1.) BEGIN TRANSACTION
2.) DELETE
3.) COMMIT
4.) CONFIRM TRANSACTION

Auf jeden Fall muss der einzelne Delete-Befehl von einem Commitz gefolgt werden, sonst nimmt Oracle den Befehl nicht an.

r_kerber 24. Sep 2003 18:06

Re: Delphi-Oracle8-tquery.Delete
 
Hallo Ilse,

ich gehe mal davon aus, dass quAllg eine TQuery ist. Dann kannst Du die Methode Delete nur verwenden, wenn RequestedLive gleich true (aktualisierbare Datenmenge) ist. Und dann ist das natürlich gähnend langsam.
Schneller wäre es, wenn Du ein UPDATE-Statement unter Verwendung von TQuery oder TUpdateSQL an die Datenbank schickst. Du kannst ja die WHERE-Klausel, die jetzt im SELECT steht in's DELETE übernehmen.

Alfons_G 25. Sep 2003 10:25

Re: Delphi-Oracle8-tquery.Delete
 
Für den Zugriff auf Oracle gibt es auch verschiedene Komponenten zum Direktzugriff. Dabei hast Du die Wahl zwischen kostenlos und etwas einfacher gestrickt und Shareware mit mehr Komfort, bzw. Möglichkeiten. Schau mal bei Torry, dort findest Du die meisten erhältlichen Oracle-Kompos.
Bei einigen der Komponenten (z.B. ODAC) gibt es da die Eigenschaft AutoCommit, welche das Verhalten von Paradox & Co nachbildet. Aber Achtung - bei voneinander abhängigen Operationen sollte man wirklich auf ein explizites Commit setzen. Es ist einfach sicherer.

:coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz