Laden...

Probleme beim Updaten

Letzter Beitrag vor 17 Jahren 13 Posts 4.684 Views
Probleme beim Updaten

Hallo,

habe mal wieder ein Problem mit dem Updaten. Vergangenen Freitag ging es noch problemlos. Nun habe ich die Access Tabelle um einige Spalten erweitert und kriege plötzlich folgende Fehlermeldung:

System.Data.OleDb.OleDbException wurde nicht behandelt.
Message="Syntaxfehler (fehlender Operator) in Abfrageausdruck '((ID = ?) AND ((? = 1 AND Ertrag IS NULL) OR (Ertrag = ?)) AND ((? = 1 AND Anzahl_Ertrag IS NULL) OR (Anzahl_Ertrag = ?)) AND ((? = 1 AND Verlust IS NULL) OR (Verlust = ?)) AND ((? = 1 AND Anzahl_Verlust IS NULL) OR (Anzahl_Verlust = ?)) AND ((? = 1 AND E'."
Source="Microsoft JET Database Engine"
ErrorCode=-2147217900
StackTrace:
bei System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
bei ConsoleApplication6.Program.Main(String[] args) in X:\Visual C#\Projects\ConsoleApplication6\ConsoleApplication6\Program.cs:Zeile 696.
bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Kann damit erst mal gearnichts anfangen.

sSQL = "Select * From Ergebnisse";
                cmdCommmand.CommandText = sSQL;
                DA.SelectCommand = cmdCommmand;
                DT = null; ;
                DT = new DataTable();
                DA.Fill(DT);

                //long Anzahl_Zeilen = DT.;


                for (cIndex = 0; cIndex <= Ergebnisse.Anzahl_Stützstellen + 4; cIndex++)
                {
                    DT.Rows[cIndex]["Ertrag"] = (Ertragsintervall * cIndex + result.Ertrag_Min);
                    DT.Rows[cIndex]["Anzahl_Ertrag"] = result.Verteilung_Ertrag_ohne[cIndex];

                    DT.Rows[cIndex]["Verlust"] = (Verlustintervall * cIndex + result.Verlust_Min);
                    DT.Rows[cIndex]["Anzahl_Verlust"] = result.Verteilung_Verlust_ohne[cIndex];

                    DT.Rows[cIndex]["Ertrag_mit"] = (Ertragsintervall_mit * cIndex + result.Ertrag_Min_mit);
                    DT.Rows[cIndex]["Anzahl_Ertrag_mit"] = result.Verteilung_Ertrag_mit[cIndex];
                }
                
            
                cmb.GetUpdateCommand();
                DA.Update(DT);

Hat ja vermutlich was damit zu tun, dass ich Spalten in die Tabelle ergänzt habe. Hat jemand Ideen?

Gruß

Habe eben die angehängten Spalten wieder gelöscht und das Updaten funktioniert wieder. Das ist schon ne Sisiphusarbeit mit diesen Datenbanken😉

Worauf muss ich denn beim Spaltenhinzufügen achten? Was könnte das Problem sein?

Gruß

Das Problem ist, das der Jet-Treiber nur maximal 99 Parameter zulässt.

Wenn Du den CommandBuilder benutzt, fügt er für jede DB-Spalte 2 Parameter
ein, was dann recht schnell zu deinem Problem führt.

Meist lässt sich dieses Problem beheben, wenn man anfängt die DB mal nach
den allg. gültigen Vorgehensweisen zu normalisieren.

Gut zu wissen. Aber in dem Fall hatte ich noch keine 50 Spalten.

Mir scheint es irgendwie, dass der Treiber "unstabil" ist. Habe mal wieder Schwierigkeiten mit einer neu erstellen Tabelle. Folgender Code liedert einen Fehler:


cmb = null;
            DA = null;
            DA = new OleDbDataAdapter();
            cmb = new OleDbCommandBuilder(DA);
            sSQL = "Select * From Ergebnisse_Trigger";
            cmdCommmand.CommandText = sSQL;
            DA.SelectCommand = cmdCommmand;
            DT = null; ;
            DT = new DataTable();
            DA.Fill(DT);

           
            DT.Rows[1]["Trigger"] = 23;

            cmb.GetUpdateCommand();
            DA.Update(DT);




Das müsste doch eigentlich gehen??? Die Tabelle enthält gerade mal 6 Spalten. Als Fehlermeldung kommt:

System.Data.OleDb.OleDbException wurde nicht behandelt.
Message="Syntaxfehler in UPDATE-Anweisung."
Source="Microsoft JET Database Engine"
ErrorCode=-2147217900
StackTrace:
bei System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
bei ConsoleApplication6.Program.Main(String[] args) in X:\Visual C#\Projects\ConsoleApplication6\ConsoleApplication6\Program.cs:Zeile 886.
bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Kapiers einfach net,-( Besonders da der gleiche Code bei einer anderen Tabelle problemlos funktz.

Gruß

DU benutzt ja auch ein Reserviertes Wort als Spalte.

Du solltest mal genau schauen, welche Namen Du nicht benutzen darfst.

Hab jetzt den Spaltennamen in was "abenteuerliches" geändert. Leider kommt weiterhin der gleiche Syntaxfehler:-(

Gruß

Wie sehen denn die Spaltennamen aus?

Hab die Sache jetzt über ein Excecutenonquery abgearbeitet. Bisl "nerviger", aber es funktiert wenigstens.

Es waren drei Spalten: ID, Jahr, Trig gerissen

Jahr habe ich auch noch in einer anderen Tabelle, aber das sollte kein Problem sein, oder?

Gruß

jetz weiß ich wieder warum ich alles per hand mache... mei mei^^

Die 3. Spalte heist "trig gerissen"?

Und da wunderst Du dich!

Was ist das Problem mit "trig gerissen"???
An dem leerzeichen kann es doch wohl nicht liegen?

Gruß

An dem leerzeichen kann es doch wohl nicht liegen?

sicher??

haste es mal ohne Leerzeichen probiert ?

?( wer suchet, der findet auch! :]

Natürlich liegt es am leerzeichen.

Wenn der CommandBuilder das in ein Command einbaut sieht es so aus:

SELECT trig gerissen from TabellenName

Das ist definitiv falsche SQL-Syntax.