AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Fremdschlüssel löschen.
Thema durchsuchen
Ansicht
Themen-Optionen

Fremdschlüssel löschen.

Ein Thema von Walter Landwehr · begonnen am 28. Feb 2018 · letzter Beitrag vom 1. Mär 2018
Antwort Antwort
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
405 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 07:59
Danke an alle, habe es gelöst indem ich den SQL Befehl im Script gepackt habe.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 08:18
Danke an alle, habe es gelöst indem ich den SQL Befehl im Script gepackt habe.
Was war denn nun der Fehler?

Eine Fehlermeldung/Exception oder keine Meldung, aber der Constraint blieb dennoch zurück?


Bei PgDAC hab ich z.B. ein Problem, wenn in der Query-Komponente solche Befehle ausgeführt werden, die kein Result liefern, bzw. SELECT mit Methoden in der Rückgabe, die aber ein Result liefern.
Da wird das Query dann doppelt ausgeführt und es kommt eine Fehlermeldung, wie z.B. "CONSTRAINT FK_TBL_RECHNUNG exisitert nicht" im zweiten Durchlauf, was auch klar ist, da de Erste das schon gemacht hatte.
Der User und das Programm (Exceptionbehandlung) denken dann es ging nicht, aber das stimmt eben nur Halb.

In der Script-Komponente passiert das nicht, da die eh kein Result erwartet.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.598 Beiträge
 
Delphi 7 Professional
 
#3

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 08:45
Mein Vorgehen ist eigentlich grob immer so in der Art:
Delphi-Quellcode:
// qry ist irgendeine Komponente zur Ausführung von SQLs.
qry.Close;
qry.SQL.Text := 'Eine Zeichenfolge, die irgendwo herkommt';
if AnsiLowerCase(copy(qry.SQL.Text,1,6)) = 'selectthen begin
  qry.Open;
end else begin
  qry.ExecSQL;
end;
Natürlich gibt es immer 'ne Fehlerbehandlung, geht hier halt nur ums sinnmäße Prinzip. Dabei ist es dann egal, ob TADOQuery, TQuery, 'ner Query der Zeos-Komponenten oder was weiß der Geier sonst noch.

Open und dann kein Select da drin, das ist immer eher "ungünstig" und ohne sinnvolle Fehlerbehandlung kaum zu managen. Je nach DB ist dann auch noch die Art der Fehlermeldung unterschiedlich und kaum einheitlich händelbar.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 09:33
..
Was war denn nun der Fehler?
..
Bei PgDAC hab ich z.B. ein Problem, wenn in der Query-Komponente solche Befehle ausgeführt werden, die kein Result liefern, bzw. SELECT mit Methoden in der Rückgabe, die aber ein Result liefern.
Da wird das Query dann doppelt ausgeführt und es kommt eine Fehlermeldung, wie z.B. "CONSTRAINT FK_TBL_RECHNUNG exisitert nicht" im zweiten Durchlauf, was auch klar ist, da de Erste das schon gemacht hatte.
Und was ist da der Fehler? Versteh ich das richtig, dass Du innerhalb eines Select mit mglw > 1 Rückgabezeilen eine Funktion ausführst. Die Operation wird dann so oft wiederholt, wie sie aufgerufen wird, also pro Rückgabezeile einmal?

Oder sprichst Du von etwas anderem (was ich dann nicht verstanden habe)?
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.880 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 09:37
Ich Vermute Mal es wird versucht eine Rückgabe auszuwerten, welche wegen .ExecSQL ausbleibt und die Aktion deshalb wiederholt wird.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 10:28
Innerhalb von StoredProcs (Postgres) kann man PERFORM FunktionDieEtwasMachtAberKeinResultHat(); machen,
aber in Query/Script-Kompnenten geht nur SELECT FunktionDieEtwasMachtAberKeinResultHat(); und schon bringt der Code von Delphi.Narium leider nichts, bzw. funktioniert zur Hälfte nicht.

PS: Recursive SELECTS werden von dir auch nicht beachtet, also wenn das SELECT nicht direkt am Anfang steht,
oder noch ein Kommentar davor oder ....

Und nein, "Result mit 0 Rows" und "kein Result" sind nicht das Selbe.
Bei Ersterem gibt es X Fields/Columns und beim Anderen 0 Field-Infos.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Mär 2018 um 10:33 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.598 Beiträge
 
Delphi 7 Professional
 
#7

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 10:41
Heißt das, dass Du sowas nicht machen kannst?
Delphi-Quellcode:
qry.SQL.Text := 'drop table irgendeinetabelle';
qry.ExecSQL;
Was wird denn dann aus
Delphi-Quellcode:
qry.SQL.Text := 'delete from tabelle where id = 1';
qry.ExecSQL;
oder
Delphi-Quellcode:
qry.SQL.Text := 'update tabelle set wert = 1234 where id = 1';
qry.ExecSQL;
Bei Open frag' ich in der Regel per Rec(ord)Count ab, wieviele Ergebniszeilen es so gibt.

Bei ExecSQL bekommt man ggfls. über RowsAffected die Anzahl der geänderten / gelöschten / eingefügten Sätze mit.

Bei manchen Komponenten ist ExecSQL 'ne Funktion, die bei Erfolg true und bei Misserfolg false ist oder bei Misserfolg fliegt 'ne Ausnahme.

Allerdings: Einheitlich ist da nun wirklich nicht geregelt, was den Wechsel der Komponenten zuweilen schon recht aufwändig machen kann.
Und einheitliche Lösungsvorschläge fast unmöglich.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 10:42
Innerhalb von StoredProcs (Postgres) kann man PERFORM FunktionDieEtwasMachtAberKeinResultHat(); machen,
aber in Query/Script-Kompnenten geht nur SELECT FunktionDieEtwasMachtAberKeinResultHat(); und schon bringt der Code von Delphi.Narium leider nichts, bzw. funktioniert zur Hälfte nicht.
Ich verstehe nicht, wo du meinst, dass etwas doppelt/mehrfach ausgeführt wird.
Ist es so gemeint, wie mkinzler schrieb, also eine falsche Interpretation aus Delphi mit erneutem Ausführen? Oder anders?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#9

AW: Fremdschlüssel löschen.

  Alt 1. Mär 2018, 11:59
Wie gesagt, das bezieht sich jetzt auf Postgres mit PgDAC.
k.A. ob es solche Probleme auch bei anderen DBMS und Zugriffskomponenten gibt.#
War als Beispiel erwähnt, dass Fehlermeldungen nicht immer "ganz" richtig sein müssen.

Also, irgendwo inderhalb einiger Query-Komponenten (z.B. TPgQuery) wird scheinbar bei fehlendem Result die Abfrage nochmal ausgelöst, beim Open/OpenTable. (nicht beim Execute/ExecSQL)
Ganz tief in den Klassen.
Der PgSQLMonitor bekommt die wiederholte Anfrage nicht mit, drum hatte es auch etwas länger gedauert das Problem zu identifizieren, vorallem da es im Programm nicht immer knallt. (das untere Beispiel ist bei uns aber reproduzierbar)

Zum Test: Das Erstellungsscript und 3 Test-Scripte/Queries
SQL-Code:
CREATE OR REPLACE FUNCTION SetSetting(Name VARCHAR, Value INTEGER) RETURNS VOID AS $$
BEGIN
  -- hier INSERT or UPDATE
  RETURN;
END$$ LANGUAGE plpgsql;

SELECT SetSetting('Test', 0); -- hier fällt es "nicht" auf, wenn es doppelt gesetzt wird

SELECT SetSetting('Test', GetSetting('Test') + 1); -- hier dagegen ist es +2
--SELECT GetSetting('Test'); -- beide SQL gemeinsam ausgeführt zählen direkt in Zweierschritten hoch und zeigen es sofort an

SELECT GetSetting('Test');
Das tritt auch manchmal auf, wenn ein SELECT ein Result liefert, aber in einem der Felder der "Fehler" liegt.
SELECT 'abc', SetSetting('Test', +1); -- machmal, aber nicht immer doppelt ... Muster noch nicht gefunden
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Mär 2018 um 12:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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-2025 by Thomas Breitkreuz