Änderung des Datenbankeintrags beim Primärschlüssel
-
Guten Tag,
nachdem ich die Datenbankeinträge in Editfeldern ausgegeben habe, möchte ich nun diese ändern und wieder mit Hilfe einer Query Komponente in die Datenbank schreiben. Dies sollte auf einen Buttonclick erfolgen.
Da ich jedoch einen Primärschlüssel vergeben habe, bekomme ich nun eine Fehlermeldung beim reinschreiben. Der Primärschlüssel sei bereits vergeben, obwohl ich diesen überhaupt nicht veränder und in die Datenbank schreibe.Damit suche ich den Eintrag :
Query->SQL->Add("SELECT * FROM tabelle WHERE primarykey = Edit->Text");DataModule1->Kunde_Query->Open();
DataModule1->Kunde_Query->First();
int primary = DataModule1->Kunde_Query->RecordCount;/* wenn der Eintrag (Primärschlüssel) gefunden wurde, möchte ich den restlichen Datensatz ändern */
if(primary)
{
Query->SQL->Add("INSERT INTO tabelle( email ) ");
Query->SQL->Add("VALUES :email ");Query->ParamByName("email")->AsString = Edit1->Text;
Query->ExecSQL();
}Der Quellcode stammt aus ButtonClick.
Vielleicht liegt es an "ExecSQL" ?
-
benny_1 schrieb:
Vielleicht liegt es an "ExecSQL" ?
Nein.
Es liegt am INSERT INTO.
Was Du vorhast ist ein Update. Der Datensatz mit seinem PK steht ja bereits in der DB. Ein INSERT INTO versucht ihn erneut hinzuzufügen und löst eine PK-Verletzung aus.
Du brauchst ein UPDATE. Das müßte etwa so aussehen:
if(primary) { Query->SQL->Text= "UPDATE tabelle SET email='myValue' WHERE primarykey = "+ Edit->Text; Query->ExecSQL(); }
-
benny_1 schrieb:
int primary = DataModule1->Kunde_Query->RecordCount; if(primary)Äh irgenwie verstehe ich nicht, was Du mit diesem Code bewirken willst?
Könntest Du mir das erklären? (es ist ziemlich heiß hier, vielleicht hab' ich einfach nur ein Brett vor'm Kopf, aber ich versteh' den Sinn nicht...)
-
DataModule1->Kunde_Query->RecordCount gibt die Anzahl der Datensätze im Query zurück.
Er will wohl prüfen ob einer da ist...
Das if(int) fand ich auch interessant...Ich würde die ganze Funktion eh anders aufbauen. Ein bissl mehr Code oder Erklärung wäre aber nicht schlecht dazu.
Gruß und schönen Feierabend
DM
-
Joe_M. schrieb:
Äh irgenwie verstehe ich nicht, was Du mit diesem Code bewirken willst?
Scheint doch logisch: prüfen, ob RecordCount grösser Null ist, für Schreibfaule.
Edit:
Ooops, da war ich wohl "etwas" zu langsam.

-
Hallo DMarko,
ich habe es jetzt so gemacht, wie du's geschrieben hast, mit UPDATE.
Damit klappt's auch. Vielen Dank.
Ach übrigens mit RecordCount prüfe ich wirklich ob der Datensatz vorhanden ist.
Gruß
benny_1
-
Hi benny_1
und woher und wie holst Du die PrimaryId? Ich wollte nur andeuten, dass man das eine mit dem anderen verbinden kann.
Für Inserts und Updates und Deletes solltest Du Dir mal TUpdateSQL ansehen. Ist recht praktisch. (Wenn Du es versuchen willst und nicht klarkommst, schau mal in den FAQs oder poste noch mal, dann stell ich hier ein Beispiel rein.)
Wenn ich den kompletten Datensatz habe (inkl. PrimaryId), mach das (manchmal) einfach so, dass ich einen Insert versuche, und wenn ich einen Indexfehler erhalte, mache ich ein Update.Grüße Joe_M.