SQL: INSERT INTO bringt bei Ausführung von ExecSQL()Fehlermeldung
-
Ich habe eine SQL Abfrage, in der ein Datensatz in der Datenbank (Access) geändert werden soll.
Das Auslesen von Daten aus der Datenbank funktioniert. SELECT -Anweisung geht.
Für SELECT verwende ich: Query->Open();
Für INSERT, UPDATE verwende ich: Query->ExecSQL();INSERT/UPDATE bringt die Fehlermeldung:
"Operation muss eine aktualisierbare Abfrage verwenden"Hier mein Source:
[cpp]// Daten:: Tabelle "customer" Holder = new TADOTable(NULL); Holder->Connection = ADOConnectionCustomer; Holder->TableName = "customer"; Holder->Active = true; //Datenquelle:: DataSource dsrHolder fuer DBGrid dbgHolder dsrHolder = new TDataSource(NULL); dsrHolder->DataSet = Holder; Query = new TADOQuery(NULL); Query->Connection = ADOConnectionCustomer; Query->DataSource = dsrHolder; // alte SQL löschen Query->Close(); Query->SQL->Clear(); // SQL Abfrage erstellen //Query->SQL->Add("INSERT INTO customer (CustNo) VALUES ('666') "); Query->SQL->Add("UPDATE customer SET DeleteSign = '1' WHERE CustNo = 1221"); // SQL an die DB übertragen Query->ExecSQL();[/cpp]Bereits geprüfte Optionen:
a) Die Datenbank ist nicht Schreibgeschützt.
b) Die Zugriffsberechtigung sollte auf meinem PC als Administrator keine Rolle spielen.
c) Das SQL Statement kann ich unter Access erfolgreich ausführen.
d)
Das hinzufügen von
Query->Prepared = true;
bringt auch nichts. Wird ja bereits mit der Methode ExecSQL ausgeführt und soll angeblich nur zur Leistungssteigerung dienen.Hat jemand einen Tip. Kann ich prüfen ob mein Query->Close beim vorhergehenden SELECT auch ausgeführt wurde. (Eventuell liegt ja das Probem beim vorhergehenden SELECT)
Danke vorab für jede Hilfe
-
Was steht in der Hilfe dazu? ADOQuery ist einfach die falsche Komponente. Hier muß ADOCommand verwendet werden.
-
Habe TADOQuery getauscht mit TADOCommand
[cpp] // Beispiel-Query ADOCommand1 = new TADOCommand(NULL); ADOCommand1->Connection = ADOConnectionCustomer; ADOCommand1->CommandText = "UPDATE customer SET DeleteSign = '1' WHERE CustNo = 1221"; ADOCommand1->CommandType = cmdText; ADOCommand1->Execute();[/cpp]Leider kommt bei
ADOCommand1->Execute()
der Fehler: "Operation muss eine aktualisierbare Abfrage verwenden" .Also löst leider nicht mein Problem
Als hätte ich einen Schreibschutz auf der Access Datenbank.
In der Hilfe steht: WIe auch von Jansen zitiert.
When using ADO to access database information, you do not need to use a dataset such as TADOQuery to represent SQL commands that do not return a cursor. Instead, you can use TADOCommand, a simple component that is not a dataset.Danke für den Tip. Hatte bisher TADOCommand verwendet.
-
Hallo;

habe einen riesigen Fehler:
!! Hatte den Mode auf cmRead gesetzt statt cmReadWrite.

[code] // Open SQL - TADOConnection *ADOConnectionCustomer = new TADOConnection(NULL); ADOConnectionCustomer->ConnectionString = as; ADOConnectionCustomer->ConnectOptions = coConnectUnspecified; ADOConnectionCustomer->CursorLocation = clUseClient; ADOConnectionCustomer->IsolationLevel = ilCursorStability; ADOConnectionCustomer->Mode = cmReadWrite; ADOConnectionCustomer->LoginPrompt = false; ADOConnectionCustomer->Connected = false;[/code]Jetzt geht es mit
TADOCommand.
WO genau liegt den der Vorteil von
TADOCommand gegenüber TADOQuery??Ist mir nicht ganz klar.
Danke Dir auf jeden Fall: TADOCommand sollte ich wohl generell für INSERT und UPDATE verwenden.
-
TADOQuery und TADOTable sind nur Kompabilitätskomponenten, um eine Umstellung von TQuery und TTable zu ermöglichen. Insbesondere die Tablekomponente bereitet aber oft genug Schwierigkeiten. Dinge die mit TQuery und TTable funktioniert haben, liefern nach der Umstellung plötzlich leere Ergegnismengen und ähnliches...
Man sollte vorzugsweise TADODataSet verwenden.
Grüße Joe_M.