Aktualisierungsabfrage mit SQL in c++
-
Hallo,
ich möchte gerne meine Datenbank per Aktualisierungsabfrage in C++ Updaten.
Und zwar so:Form2->Query1->Close(); Form2->Query1->SQL->Clear(); //for (int i=0; i<Memo1->Lines->Count ; i++) //{ //Label3->Caption=Memo1->Lines->Strings[1]; Form2->Query1->SQL->Add("UPDATE 'c:\\DB\\LOG.DBF' As Log"); Form2->Query1->SQL->Add("SET Log.'NUMMER' = '"+Memo1->Lines->Strings[1]+"'"); //Form2->Query1->SQL->Add("Order By Log.'NUMMER'"); Form2->Query1->Open(); //}Das Kommentierte erstmal vergessen dient erstmal nur zur Problembehandlung.
So wie man sieht möchte ich die erste Zeile die z.b in einem Memo steht in ein Datenbankfeld mit dem Namen NUMMER reinSETTEN.
Also Adde ich mir den UPDATE verweise auf die DB wo die liegt und lasse sie als Log reinladen
Nun kommt der SET befehl der sagt fülle die Spalte mit dem ersten werde aus der Memo.
Danach wird das ganze geöffent und wie sollte es auch anders sein, ein Fehler kommt. Der lautet :
Klasse ENoResultSet
Fehler beim erstellen des Cursor-HandlesWo liegt der Fehler ?
-
Was mir spontan auffällt, ist, dass Du Open() verwendest, was nur für
Select-Statements gilt. Probier's mal stattdessen mit Execute().
Ob das mit dem Verweis auf die LOG.DBF Datei funktioniert, weiß
ich nicht, habe ich aber noch nie gesehen.Gruß
Alexander
-
Hallo
Form2->Query1->ExecSQL();ist dein Freund
Mfg
Klaus
-
//for (int i=0; i<Memo1->Lines->Count ; i++) //{ Form2->Query1->SQL->Clear(); Form2->Query1->SQL->Add("UPDATE 'c:\\DB\\LOG.DBF' As Log"); Form2->Query1->SQL->Add("SET Log.'NUMMER' = 'TEST'"); Form2->Query1->ExecSQL(); //} Form2->Query1->SQL->Clear(); Form2->Query1->SQL->Add("SELECT * FROM 'c:\\DB\\LOG.DBF' As Log"); Form2->Query1->Open();Hmm das sieht schonmal ein bischen besser aus, allerdings macht er nicht das was ich will

Fehlermeldung kommt schonmal keine mehr.
Normalerweise müsste er doch laut Quelltext bei Log in das Feld "TEST" reinschreiben und dann die Datenbank mit den geänderten werten anzeigen, aber die Spalte wird nicht mit "TEST" gefüllt warum ?
-
Eventuell nochmal etwas SQL anschauen ?
UPDATE 'c:\\DB\\LOG.DBF' ...Dürfte wohl der Grund sein.
-
Ich kann dort keinen Fehler erkennen..
An der Synatx kann es nicht liegen die meckert er ja nicht an
-
Hallo,
mit ist mein Fehler schon aufgefallen. Die Datenbank hatte NULL Felder also gar keins dann kann er auch nix reinupdaten. Nun habe ich allerdings ein Problem.
1.) Wie kann ich ihm Sagen das es egal ist ob er dafür ein neues Datenfeld anlegt ?
2.) Wie kann ich ihm sagen das ein vorhandener Wert in der Spalte Log.'NUMMER'
nicht nochmal eingetragen werden darf ?
-
Hallo
erstell einfach das Feld (-try/catch)
ein "UPDATE" sollte eigentlich immer ueber ein "WHERE"
eingeschraenkt werden, da sonst die ganze Spalte auf den
neuen Wert gesetzt wird.Mfg
Klaus
-
Ja, habe auch schon bemerkt das es ohne Einschränkung komplett voll geschrieben wird :-\
Hmm nur leider fällt mir keine Logik ein wie ich ihm sagen kann wie er auf vorhanden sein des Wertes in einem Feld prüfen kann.
Ich nenne mal ein BSP. vllt. kann ja jemand Helfen
im Memo steht z.b.
MEMO DBGRID ______________________ 0154 |______________________| 0142 |______________________| 0154 0142 0154Nach der Anweisung sollte es denn so aussehen ohne doppelte Einträge
MEMO DBGRID ______________________ 0154 |_0154_________________| 0142 |_0142_________________| 0154 0142 0154und wenn ein neuer Eintrag bzw Datenfeld hinzukommt erstellt er das auch automatisch
Also mir ist leider bisher noch kein Einfall gekommen wie ich die Where Bedingung schreiben soll.
Sie muss ja 1x Prüfen ob das Feld 1 mit dem Memo Line 1 übereinstimmt und wenn das so ist dann ignorieren wenn nicht muss er ja Feld 2 mit Memo Line 1 usw..
Dann Feld 1 mit Memo Line 2 ect...Dann muss er wenn das Feld und Memo nicht = sind ein neues Feld mit diesen Wert anlegen..
Naja ich habe noch keinen Durchblick wie ich das machen soll.. Ideen ?
-
Hallo,
sieht jemand den Fehler hier ?
Form2->Query1->Close(); Form2->Query1->SQL->Clear(); Form2->Query1->SQL->Add("UPDATE 'c:\\Lotto\\LOG.DBF' As Log"); Form2->Query1->SQL->Add("SET Log.'LB' = DATEDIFF(day,Log.'LF',Log.'EF')"); Form2->Query1->SQL->Add("WHERE Log.'BENUTZER1' = '"+Memo1->Lines->Strings[i]+"'"); Form2->Query1->ExecSQL();Ist ein DateDiff mit Set möglich ?
Alle Felder also LB LF EF enhalten Datumswerte...