![]() |
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? |
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. |
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? |
Re: Delphi-Oracle8-tquery.Delete
Hallo Ilse,
kannst Du mal ein kurzes Prog-Beispiel bereitstellen? |
Re: Delphi-Oracle8-tquery.Delete
Liste der Anhänge anzeigen (Anzahl: 1)
Import-Routine in im Anhang
|
Re: Delphi-Oracle8-tquery.Delete
hier nochmal die Procedure :
Delphi-Quellcode:
[edit=MrSpock]Code-Tags hinzugefügt. Mfg, MrSpock[/edit]
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; |
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. |
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. |
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 07:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz