Ole Db - Update syntax error
-
Moin beisammen
Habe ein gravierendes Problem bei der Umsetzung eines Programm mit einer MS-Access Datenbankanbindung. Ich arbeite mit einem Dataset in der Klasse CDB, die die Anbindung an die Datenbank realisiert. Sowohl Select, als auch Insert und Delete funktionieren inzwischen ohne Probleme. Löschen und Einfügen in das Dataset funktionieren ebenso fehlerfrei wie die Übernahme und Speicherung der Änderungen des Datasets in die Datenbank.
Da zu der Aufgabenstellung, die wir bezüglich einer Übungsaufgabe zur Datenbankanbindung bekommen haben, kein Update einer Zeile gehörte, habe ich das bis jetzt nicht umgesetzt, obwohl ich das Programm schon vor knapp zwei Wochen fertig auskommentiert mit allen geforderten Funktionen fertig gestellt habe.
Morgen schreiben wir nun eine Klausur über das Thema und erst vor zwei Tagen habe ich erfahren, dass ich dafür auch das SQL Update Statement umsetzen können muss. Ich bin eigentlich davon ausgegangen, dass nach dem Einfügen einer Zeile und dem Löschen die Umsetzung von einem Update nicht sonderlich schwierig sein dürfte.
Allerdings stellt es sich als komplizierter heraus als ich dachte. Obwohl ich beim Update-Statement, sowie im gesamten Programm, die mir bekannten SQL-(Oracle)-Syntax aus dem Datenbank- und PHP-Unterricht benutzt habe, funktioniert meine Umsetzung des Update nicht. Die Änderrung im Dataset funktioniert, da ich beim erneuten Auslesen und Darstellen des Datasets in der dazugehörigen Listbox auch die Änderungen der Zeile sehe. Nachdem ich allerdings das Menüitem "Speichern" auswähle und damit die Methode zur Übernahme der Änderungen in die Datenbank aufrufe, bekomme ich einen Run-Time-Error, ausgelöst durch eine Exception von Ole-DB, die mich auf einen Syntaxfehler im Update-Statement hinweist.
Hier die Fehlermeldung:
An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll
Additional information: Syntaxfehler in UPDATE-Anweisung.
Und hier die relevaten Methoden...
...zur Erstellung der Commands für den Adapter (Ich benutze absichtlich keinen Builder, bitte berücksichtigen!)...
// // SUMMARY: Commands initialisieren // // TASK: Initialisiert die fuer den Zugriff auf die Datenbank // notwendigen SQL-Anweisungen und speichert sie im // Memberadapter. // // PARAMS: oConn: Connection zur Datenbank // void CDB::initCommands(OleDbConnection^ oConn) throw() { // Select-, Insert- und Delete-Command OleDbCommand^ oSelectCmd; OleDbCommand^ oInsertCmd; OleDbCommand^ oDeleteCmd; OleDbCommand^ oUpdateCmd; // Select-Command einstellen oSelectCmd = gcnew OleDbCommand("SELECT * FROM TMachine;", oConn); // Insert-Command einstellen oInsertCmd = gcnew OleDbCommand("INSERT INTO TMachine VALUES (@rid, @dt, @mid, @status, @desc);", oConn); // Insert-Command-Parameter einstellen oInsertCmd->Parameters->Add("@rid", OleDbType::Char, 4, "report_id"); oInsertCmd->Parameters->Add("@dt", OleDbType::VarChar, 50, "datetime"); oInsertCmd->Parameters->Add("@mid", OleDbType::Char, 4, "machine_id"); oInsertCmd->Parameters->Add("@status", OleDbType::Char, 4, "status"); oInsertCmd->Parameters->Add("@desc", OleDbType::VarChar, 100, "description"); // Delete oDeleteCmd = gcnew OleDbCommand("DELETE FROM TMachine WHERE report_id = @rid;", oConn); // Delete-Command-Parameter einstellen oDeleteCmd->Parameters->Add("@rid", OleDbType::Char, 4, "report_id"); // Update-Command einstellen oUpdateCmd = gcnew OleDbCommand("UPDATE TMachine SET datetime = @dt, machine_id = @mid, status = @status, description = @desc WHERE report_id = @rid;", oConn); // Update-Command-Parameter einstellen oUpdateCmd->Parameters->Add("@rid", OleDbType::Char, 4, "report_id"); oUpdateCmd->Parameters->Add("@dt", OleDbType::VarChar, 50, "datetime"); oUpdateCmd->Parameters->Add("@mid", OleDbType::Char, 4, "machine_id"); oUpdateCmd->Parameters->Add("@status", OleDbType::Char, 4, "status"); oUpdateCmd->Parameters->Add("@desc", OleDbType::VarChar, 100, "description"); // Commands in Adapter laden m_oAdapter->SelectCommand = oSelectCmd; m_oAdapter->InsertCommand = oInsertCmd; m_oAdapter->DeleteCommand = oDeleteCmd; m_oAdapter->UpdateCommand = oUpdateCmd; };
...zum Ändern der Zeile im Dataset...
// // SUMMARY: Datensatz aendern // // TASK: Aendert einen Datensatz in der Tabelle // mit Hilfe des uebergebenen Datenobjekts // und der Bedingung. // // PARAMS: oMachine: Geaendertes Datenobjekt // oCondition: Bedingung zum Loeschen // // void CDB::updateRow(CMachine oMachine, String ^oCondition) throw() { // DataTable aus DataSet erstellen DataTable^ oDataTable; oDataTable = m_oDataSet->Tables["TMachine"]; // Zeilenarray mit Bedingung aus DataTable auslesen array<DataRow^> ^oDataRow; oDataRow = oDataTable->Select(oCondition); // Temporaere Variablen fuer cast String^ oDateTime; String^ oDescription; oDateTime = gcnew String(oMachine.getDateTime()); oDescription = gcnew String(oMachine.getDescription()); // Zeile einstellen oDataRow[0]["datetime"] = oDateTime; oDataRow[0]["machine_id"] = oMachine.getMachineID(); oDataRow[0]["status"] = oMachine.getStatus(); oDataRow[0]["description"] = oDescription; };
...und zur Übernahme der Änderungen des Datesets in die Datenbank:
// // SUMMARY: Aenderungen uebernehmen // // TASK: Laesst die im DataSet vorgenommen // Aenderungen in die Datenbank // uebernehmen und speichern. // void CDB::applyChanges(void) throw() { // Aenderungen aktualisieren m_oAdapter->Update(m_oDataSet, "TMachine"); // Aenderungen akzeptieren m_oDataSet->AcceptChanges(); };
Da ich die Klausur bereits morgen um 7:30 Uhr schreibe, bitte ich um eine schnelle Antwort. Danke dafür im Vorhinein.
Gruß, Kane
-
Erstens: In diesem Board bist du definitiv falsch. Allerdings bin ich nicht ganz sicher, wohin ich dich schieben sollte (zur Auswahl stehen Datenbanken oder C++/CLI).
Zweitens: Vielleicht solltest du beim nächsten Anlauf etwas früher anfangen, dich mit der Materie zu beschäftigen
-
Ich versuch es erstmal bei CLI. Man kann ja immer noch weiterschieben.
-
Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.