ADO-Fehlermeldung bei Update
-
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