ADO-Fehlermeldung bei Update
-
Nein, selbstverständlich nicht.
-
Aber der Rest vom Statement wie es da steht, ist so wie du es abschickst?!
-
Ja.
-
Hallo,
hat keiner von Euch einen Hinweis, was für Ursachen dieser Fehler haben könnte?
Hier ist die Funktion, die den SQL-String zusammenbaut und die Abarbeitung durchführt:
void __fastcall Tkorrekturen::okClick(TObject *Sender) { TADOCommand *command = new TADOCommand(NULL); command->Connection = MainForm->ADOConnection1; String values_b, values_s; for(int x=1; x<3; x++) { command->CommandText = "update "+Gettable()+"bestand set "; values_b = ""; values_s = ""; for(int c=1; c<grid->ColCount; c++) { if(grid->Cells[c][0].LowerCase().Pos("max")>0) { values_b += "aktdrm = "+neue_walze->change_sep(grid->Cells[c+1][x],"."); values_s += "maxdrm = "+neue_walze->change_sep(grid->Cells[c][x],"."); } if(grid->Cells[c][0].LowerCase().Pos("radius")>0) { if(!values_b.IsEmpty()) values_b += ", "; values_b += "radius = "+neue_walze->change_sep(grid->Cells[c][x],"."); } if(grid->Cells[c][0].LowerCase().Pos("winkel")>0) { if(!values_b.IsEmpty()) values_b += ", "; values_b += "flankenwinkel = "+neue_walze->change_sep(grid->Cells[c][x],"."); } } if(x == 2 && Fzapfen) { if(!values_b.IsEmpty()) values_b += ", "; values_b += "zapfen_neu = '"+BoolToStr(z->Checked,true).UpperCase().SubString(1,1)+"'"; } command->CommandText += values_b; command->CommandText += " where walznr = '"+grid->Cells[grid->ColCount-1][x]+"'"; if(!values_b.IsEmpty()) { try { command->Execute(); if(!values_s.IsEmpty()) { command->CommandText = "update "+Gettable()+"stamm set "+values_s+ " where walznr = '"+grid->Cells[grid->ColCount-1][x]+"'"; command->Execute(); } } catch(const Exception &E) { ShowMessage("Fehler:\n\n"+command->CommandText+"\n\n"+E.Message); ModalResult = mrCancel; } } } delete command; command = NULL; }
Wenn ich den SQL-String direkt in der Datenbank ausführe, dann wird das Update durchgeführt.
Gruß Udo
-
Deine Fehlermeldung:
...Syntax Error on 'EOF'...
Ist das on zufällig ein Schreibfehler und heisst eigentlich or?
Also: Syntax falsch oder EOFkeine Datensätze vorhanden.
Ich würde mal den Debugger laufen lassen. Dann das SQL-Statement, wenn es fertig zusammen gebaut ist, direkt aus dem Debugger kopieren und in der Datenbank einfügen. Wenn es läuft, ist die Syntax da auch richtig.
Dann würde ich wegen der Fehlermeldung mit 'EOF' auf die Datenbankverbindung selbst tippen, das da etwas nicht stimmt. Open vergessen oder nur Lesezugriff oder so. Das wäre dann eher da:
command->Connection = MainForm->ADOConnection1;
(ein bischen weiter eingegrenzt...)
-
Hallo,
die Fehlermeldung ist so wie im ersten Post geschrieben (...on 'EOF').
ich habe noch folgende Zeilen eingebaut:
... try { if(!command->Connection->Connected) command->Connection->Open(); command->Execute(); ...
um sicherzustellen, das die Verbindung geöffnet ist.
--> der gleiche FehlerGruß Udo
-
Kann mir denn keiner einen Tip geben, wo dieser Fehler seine Ursache hatt???
-
Hallo
schau mal ob es dazu ueberhaupt DS gibt
where walznr = '97/732'
Mfg
Klaus
-
Hallo,
einen Datensatz gibt es.
Und selbst wenn nicht, dann wird halt keine Änderung durchgeführt aber kein Fehler ausgelöst. Ich mache das in der Anwendung in XXXXXXX Fällen so.Gruß Udo
-
Ich würde gerne mal das exakte Statement sehen, so wie es von dem ADOCommand-Objekt ausgeführt wird. Schreib es Dir mal zusätzlich in ein Memo und kopier es dort 1:1 raus.
-
@Joe_M:
Das ist meine komplette Fehlermeldung 1:1 aus einem MEMO kopiert:
Fehler:
ADOCommand->CommandText:
update bwubestand set flankenwinkel = 0.5 where walznr = 'R961448'Exception.Message:
[Ingres][Ingres ODBC Driver][Ingres]line 1, Syntax error on 'EOF'. The correct syntax is:
UPDATE table
[FROM table {, ... }]
SET column = expression|NULL {, ... }
[WHERE search_condition]Error #0
ADO Error #-2147217911
ADO Fehlertext:
ADO SQL-State:
NativeError: 2504
Quelle:Gruß Udo
-
-2147217911 0x80040e09 ADO_PERMISSION_DENIED
Ein ADO-Aufruf schlug fehl, weil der Benutzer, der bei der BIND-Anmeldung am Verzeichnis verwendet wurde, dazu keine Berechtigung besitzt.
Noch Fragen?
-
@ Joe_M.
Danke für die schnelle Antwort.
Da stellen sich mir neue Fragen:woher hast Du die Erklärung zu dieser Fehlernummer ?
Betrifft die Fehlermeldung die ADOConnection?Wenn ja, dann folgendes:
Die Verbindung zur Datenbank wird beim Start des Programmes aufgebaut.
Während der gesamten Programmlaufzeit wird der Benutzer bzw die mit dem Benutzer verbundenen Rechte nicht geändert.
Es werden werden während der Arbeit mit dem Programm ständig Daten gespeichert (auch in der jetzt betroffenen Tabelle) - ohne Fehlermeldung.Da stellt sich mir die Frage wo dieser Fehler seine Ursachen haben könnte (zumindest nicht in den Benutzerrechten.
Gruß Udo
-
Die Fehlerbeschreibung stammt von hier: http://www.selfadsi.de/errorcodes.htm
Aber wenn andere Updates funktionieren...
An den Stellen, an denen es funktioniert, werden auch dynamische ADOCommand-Objekte eingesetzt, oder verwendest Du dort eine andere Vorgehensweise?
Du kannst auch testweise mal ein statisches ADOCommand-Objekt verwenden (obwohl das keinerlei Unterschied machen sollte).Grüße Joe
Nachtrag: Ich hab gerade noch mal in die Doku des BCB geschaut und hier macht mich stutzig, dass der Standardwert für CommandTyp cmdUnknown ist. Meiner Erfahrung nach, ist der Standardwert cmdText, allerding verwende ich statischen TADOCommand-Objekte. Vielleicht hilft es ja tatsächlich, das mit cmdText zu initialisieren.
-
Wenn mit statischem Objekt gemeint ist, das es aus der Komponentenleiste auf die Form gezogen wird, dann hatte ich das am Anfang so und habe das dann im Zuge der Fehlersuche auf die jetzige Variante umgebaut.
Noch eine Frage:
Können andere geöffnete ADORecordsets oder ähnliche Objekte (auch auf anderen Forms) eventuell Einfluß auf die Ausführung dieses SQL-Scripts haben ?
Die Anwendung ist eine MDI-Anwendung, bei der mehrere Formulare geöffnet sein können (mit unterschiedlichen Datenbankabfragen aus verschiedenen aber durchaus auch aus der gleichen Tabelle).
Gruß Udo
-
Hallo,
da keine Antwort auf mein Problem mehr kommt und ich daraus schließe, das niemand eine Idee hat, warum das nicht funkt, melde ich mich nochmal mit meiner jetztigen Lösung.
Ich habe zwei statische ADODataSet's definiert und weise in der entsprechenden Funktion die Werte zu:
void __fastcall Tkorrekturen::okClick(TObject *Sender) { try { s_data->CommandText ="select * from "+Gettable()+"stamm where sign = '"+Fsig+"' order by sigow"; s_data->Open(); for(int x=1; x<3; x++) { if(s_data->Locate("walznr", (Variant)grid->Cells[grid->ColCount-1][x], TLocateOptions())) { b_data->CommandText = "select * from "+Gettable()+"bestand where walznr = '"+ s_data->FieldByName("walznr")->AsString+"'"; b_data->Open(); s_data->Edit(); b_data->Edit(); for(int c=1; c<grid->ColCount; c++) { if(grid->Cells[c][0].LowerCase().Pos("max")>0) s_data->FieldByName("maxdrm")->AsFloat = StrToFloat(grid->Cells[c][x]); if(grid->Cells[c][0].LowerCase().Pos("aktuell")>0) b_data->FieldByName("aktdrm")->AsFloat = StrToFloat(grid->Cells[c][x]); if(grid->Cells[c][0].LowerCase().Pos("radius")>0) b_data->FieldByName("radius")->AsFloat = StrToFloat(grid->Cells[c][x]); if(grid->Cells[c][0].LowerCase().Pos("winkel")>0) b_data->FieldByName("flankenwinkel")->AsFloat = StrToFloat(grid->Cells[c][x]); } if(x == 2 && Fzapfen) b_data->FieldByName("zapfen_neu")->AsBoolean = z->Checked; try { s_data->Post(); b_data->Post(); b_data->Close(); } catch(const Exception &E) { MainForm->LMDMessage->Execute("Walzendaten korrigieren", "Fehler:\n\n"+E.Message+"\n\nDie Änderungen an den Stamm- bzw. Bestandsdaten " "wurden nicht ausgeführt.", NULL, mtInformation, TMsgDlgButtons() << mbOK, 0,0,0,0,0); ModalResult = mrNone; } } else MainForm->LMDMessage->Execute("Walzendaten korrigieren", "Fehler:\n\nWalzennummer nicht gefunden.", NULL, mtInformation, TMsgDlgButtons() << mbOK, 0,0,0,0,0); } } __finally { s_data->Close(); b_data->Close(); } } //---------------------------------------------------------------------------
So werden die betreffenden Tabellen korrekt geändert.
Gruß Udo