![]() |
Datenbank: BDE • Version: 5.1 • Zugriff über: BDE-Komponenten
SQL: Update-Befehl löscht Datensatz?
Hallo,
ich möchte in meinem Programm per SQL-Befehl eine Tabelle aktualisieren, habe aber das Problem, dass der Update-Befehl den zu ändernden Datensatz löscht, sobald ein Memo-Feld bearbeitet werden soll. Zum Verständnis: Dieser Befehl löscht den Datensatz kommentarlos aus der Tabelle:
Delphi-Quellcode:
Wenn ich die letzte Zeile mit dem Feld "MMREMARKS" (das ist das Memo-Feld) rausnehme, funktionierts:
SQL.Text := 'UPDATE SD_CUST SET ' +
'STRSHORTNAME = ' + QuotedStr(edtShortName.Text) + ', ' + 'STRNAME1 = ' + QuotedStr(edtName1.Text) + ', ' + 'STRNAME2 = ' + QuotedStr(edtName2.Text) + ', ' + 'STRNAME3 = ' + QuotedStr(edtName3.Text) + ', ' + 'STRSTREET = ' + QuotedStr(edtStreet.Text) + ', ' + 'STRPOSTCODE = ' + QuotedStr(edtPostcode.Text) + ', ' + 'STRCITY = ' + QuotedStr(edtCity.Text) + ', ' + 'STRPHONE1 = ' + QuotedStr(edtPhone1.Text) + ', ' + 'STRPHONE2 = ' + QuotedStr(edtPhone2.Text) + ', ' + 'STRFAX = ' + QuotedStr(edtFax.Text) + ', ' + 'MMREMARKS = ' + QuotedStr(mRemarks.Text) + ' ' + 'WHERE ID = ' + lblID.Caption + ';';
Delphi-Quellcode:
Wenn ich nur das Memofeld update, funktionierts aber auch :gruebel:
SQL.Text := 'UPDATE SD_CUST SET ' +
'STRSHORTNAME = ' + QuotedStr(edtShortName.Text) + ', ' + 'STRNAME1 = ' + QuotedStr(edtName1.Text) + ', ' + 'STRNAME2 = ' + QuotedStr(edtName2.Text) + ', ' + 'STRNAME3 = ' + QuotedStr(edtName3.Text) + ', ' + 'STRSTREET = ' + QuotedStr(edtStreet.Text) + ', ' + 'STRPOSTCODE = ' + QuotedStr(edtPostcode.Text) + ', ' + 'STRCITY = ' + QuotedStr(edtCity.Text) + ', ' + 'STRPHONE1 = ' + QuotedStr(edtPhone1.Text) + ', ' + 'STRPHONE2 = ' + QuotedStr(edtPhone2.Text) + ', ' + 'STRFAX = ' + QuotedStr(edtFax.Text) + ', ' + 'WHERE ID = ' + lblID.Caption + ';';
Delphi-Quellcode:
Muss ich bei einem Update zwei Befehle absetzen, einmal für das Memo-Feld und einmal für den Rest?
SQL.Text := 'UPDATE SD_CUST SET ' +
'MMREMARKS = ' + QuotedStr(mRemarks.Text) + ' ' + 'WHERE ID = ' + lblID.Caption + ';'; Vielleicht hat jemand einen Tip. Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
Versuchs mal mit Parametern
|
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
die Abfrage hat allerdings variable SQL-Befehle, so dass ich keine Parameter hinterlegen kann. Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
Auch dann kann man Parameter verwenden. Ist halt ein Bisschen mehr Aufwand. Wäre m.E. aber ein Test wert. (Vielleicht nur für das Memofeld)
|
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
ich hatte damals die Memos in Pdx über TTable aktualisiert. Aber du kannst mit Parametern ja mal
Delphi-Quellcode:
probieren.
ParamByName(theFieldName).AsBlob:= theText;
Heiko |
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
natürlich kann ich zum Updaten der BDE-Tabellen auch fest definierte Abfragen (mit Parametern) nehmen. Hintergrund der ganzen Geschichte ist jedoch, dass das ganze Programm auf eine andere Datenbank umgestellt werden soll (wahrscheinlich Firebird). Da die Tabellen bisher per Edit und Post aktualisiert werden und dies nachher nicht mehr funktionieren wird, war meine Idee, die bestehenden Tabellen über TQuery zu aktualisieren und den Befehl zur Laufzeit zu erstellen, so dass die Komponenten möglichst wenig fest definierte Eigenschaften haben und ich sie später einfacher austauschen kann. Wenn ich jetzt für Insert- und Update-Aktionen wieder für jede Stammdatentabelle andere Abfragen (jeweils für Insert und Update) hinterlegen muss, wird die Umstellerei m. E. zu kompliziert. Daher der Versuch, den SQL-Befehl zur Laufzeit zu erstellen und einer allgemeingültigen Abfrage zuzuweisen. Aber anscheinend muss ich mir für Memo-Felder was gesondertes überlegen. Gruß Frank Nachtrag: mKinzler, ich hab Deinen Beitrag erst jetzt gelesen, wie funktioniert das denn? Noch ein Nachtrag: Ausserdem erklärt das nicht, warum der Befehl funktioniert, wenn das Memo-Feld alleine aktualisiert wird. |
Re: SQL: Update-Befehl löscht Datensatz?
Zitat:
[Edit: Zitat:
Delphi-Quellcode:
SQL.Text := 'UPDATE SD_CUST SET ' +
'STRSHORTNAME = ' + QuotedStr(edtShortName.Text) + ', ' + 'STRNAME1 = ' + QuotedStr(edtName1.Text) + ', ' + 'STRNAME2 = ' + QuotedStr(edtName2.Text) + ', ' + 'STRNAME3 = ' + QuotedStr(edtName3.Text) + ', ' + 'STRSTREET = ' + QuotedStr(edtStreet.Text) + ', ' + 'STRPOSTCODE = ' + QuotedStr(edtPostcode.Text) + ', ' + 'STRCITY = ' + QuotedStr(edtCity.Text) + ', ' + 'STRPHONE1 = ' + QuotedStr(edtPhone1.Text) + ', ' + 'STRPHONE2 = ' + QuotedStr(edtPhone2.Text) + ', ' + 'STRFAX = ' + QuotedStr(edtFax.Text) + ', ' + 'MMREMARKS = :remarks WHERE ID = ' + lblID.Caption + ';'; ParamByName('remarks').asBlob := mRemarks.Text; |
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
danke für die Tips, werds ausprobieren. Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
So,
hab jetzt den Vorschlag von mkinzler mal umgesetzt, leider wird der zu aktualisierende Datensatz noch immer gelöscht :cry: , ich werd mal (nur um weiterarbeiten zu können) das Update für das Memofeld in einen eigenen Befehl legen, vielleicht hat noch jemand eine Idee... Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
So,
die Geschichte mit dem Update funktioniert nicht, aber aus einem anderen Grund: Die Tabelle beinhaltet ein AutoIncrement-Feld namens ID, das tatsächlich bei jedem UPDATE-Befehl (!!) unverständlicherweise um eins hochgezählt wird. Das dieses Feld für die referenzielle Integrität wichtig ist, kann ich diesen Weg wohl vergessen :cry: . Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
sicher dass du nicht irgendwo noch nen Insert drinstehen hast. Packe deinen Update-Befehl mal auf einen Testbutton. Ansonsten hilft vielleicht mal ne Reorganisation (Umstruktieren + Komprimieren) oder ne andere Datenbank ;) Heiko |
Re: SQL: Update-Befehl löscht Datensatz?
Hallo Heiko,
ich hab den Update-Befehl bereits auf einem eigenen Button und wenn ich mir nach dem Befehl den Inhalt des Felds "ID" in einem Label anzeigen lasse, wird sie um eins erhöht. :cry: Aber eine andere Datenbank ist ja das Ziel der ganzen Aktion, vorher war alles über datensensitive Komponenten angesteuert, die sollen nun weg. Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
du nimmst hoffentlich nicht lblID als Label, das hast du ja schon im Update-Query benutzt. Zeigt denn auch DBD an, das ein neuer Datensatz drinsteht ?. Du machst irgendwas verkehrt. Ist vielleicht noch ein TTable auf der gleichen Tabelle offen ?. Ein Table.Edit auf dem letzten Datensatz erzeugt ein Append. Vielleicht wird das unbewusst aufgerufen, über deine datensensitiven Dingens. Mach mal nen eigenes Form, wo nur das TQuery drinsteht und dort das Update. Heiko |
Re: SQL: Update-Befehl löscht Datensatz?
Hmm,
komisch kommts mir auch vor, ich werd noch mal alles durchgehen, evtl. ist ja doch noch ein TTable offen.. Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
die Werte werden zwar korrekt abgespeichert, aber die ID wird immernoch um eins erhöht. Das mit dem Label funktioniert durchaus, weil der ExecSQL-Befehl, der die ID (leider) ändert, erst nach dem Zusammenstellen des SQL-Strings erfolgt. Im Formular gibt es keine datensensitiven Komponenten mehr, das einzige TTable-Element, das auf diese Tabelle verweist, ist nicht aktiv. Beispiel:
Delphi-Quellcode:
Wenn die aktuelle Datensatz-ID z. B. 122 ist, zeigt der Showmessage-Befehl "...WHERE ID = 122;", was ja korrekt ist.
if dmGeneral.tblSD_Cust.Active then
dmGeneral.tblSD_Cust.Close; with dmQueries.qryUpdate do begin SQL.Text := 'UPDATE SD_CUST SET ' + 'STRSHORTNAME = ' + QuotedStr(edtShortName.Text) + ', ' + 'STRNAME1 = ' + QuotedStr(edtName1.Text) + ' ' + 'WHERE ID = ' + lblID.Caption + ';'; try showmessage(SQL.Text); ExecSQL; except On E:Exception do begin strMsg := 'Fehler bei Aktualisieren Datensatz, Meldung: ' + E.Message; Beep; MessageDlg(strMsg, mtError, [mbOK], 0); Exit; end; end; end; Wenn ich nach dem ExecSQL in die Tabelle schaue, steht im Feld ID des gleichen Datensatzes (es wird kein neuer angefügt) eine 123 drin....und ich habe keine Ahnung, wieso :?: Edit: Hab jetzt mal ein kleines Testprojekt angelegt, dass genau das gleiche tut und siehe da, das Feld "ID" wird nicht verändert, also muss noch irgendwo im Programm der Wurm sein, aber wenn ich mit F7 durchgehe, kommt nach dem ExecSQL direkt die nächste Anweisung, aber da ist der Wert schon verändert... Gruß Frank |
Re: SQL: Update-Befehl löscht Datensatz?
Hallo,
ich bin jetzt einen Schritt weiter: Das Feld "strShortname" ist ein Indexfeld. Sobald dieses im Update-Befehl aktualisiert wird, wird der Zähler von ID um eins erhöht (auch wenn sich der Inhalt nicht geändert hat). Dies konnte ich auch im Testprojekt nachvollziehen. Kann ich das irgendwie umgehen oder abschalten? Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 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