Fehler bei Update auf Datenbank

Hi,
also ich habe folgenden Code für ein Update auf eine AccessDatenbank :

Dim myDataRow As DataRow
myDataRow = DataSet11.Verteilung_SW.NewRow()
myDataRow("Index") = Label2.Text
myDataRow("Rechner_Nr") = TextBox2.Text
DataSet11.Verteilung_SW.Rows.Add(myDataRow)
OleDbDataAdapter3.Update(DataSet11, "Verteilung_SW")

Wenn ich ausführe, bleibt das Programm mit folgender Fehlermeldung in der letzten Zeile hängen :

"Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' ist in system.data.dll aufgetreten.
Zusätzliche Informationen: TableMapping['Verteilung_SW'] oder DataTable 'Verteilung_SW' kann nicht gefunden werden."


Wenn ich die letzte Zeile auskommentiere schreibt er die neue Zeile in das Datagrid, er schreibt es dann halt logischerweise aber nicht in die Datenbank.

Vielleicht kann mir ja jemand weiterhelfen.

Nachtrag :
Also ich habe den möglichen Fehler wahrscheinlich entdeckt.
Ich habe den DataAdapter noch mal neu konfiguriert. Am Ende bekam ich die Meldung das das Update-Statement nicht erzeugt werden konnte, da die Quelltabelle keinen Primärschlüssel hat und daher Einträge auch doppelt vorkommen können.
Das Problem ist, das ich an der Tabelle nichts ändern kann.

Gibt es denn die Möglichkeit über ein Insert-Statement den Eintrag trotzdem zu erzwingen?

Danke Ahnungsloser8000
 
Zuletzt bearbeitet:
Hi
Danke für die schnelle Antwort.
Ich habe den Eintrag in den Eigenschaften des DataAdapters gefunden.
Es hat folgenden CommandText :
INSERT INTO [Verteilung SW] ([Index], Rechner_Nr) VALUES (?, ?)

Wie sieht denn der Befehl aus, damit ich die Parameter übergeben kann ?
Oder kann ich im EigenschaftenFenster direkt für die Fragezeichen z.B. label.text schreiben.

Ich habe folgenden Ansatz probiert : DataAdapter.InsertCommand. ?
Ab den Fragezeichen weiß ich nicht so recht weiter.

Gruß Ahnungsloser80000
 
Ich denke das es so ist:
Erst den Adapter mit dem Insert-Statment konfigurieren - damit er weiss wie er Einfügen kann.

Für die Aktualisierung der Datensätze musst du dann die Methode Update des Dataadapters aufrufen.
Bsp:
myDataAdapter.Update(custDS, myTableName)

Dann werden alle Zeilen in die Datenbanken aktulisiert, eingefügt oder gelöscht.
Was er tut hängt vom jeweiligen Rowstate ab.
Wenn Du anderen Aktualisierungen am Dataset noch vornimmst, müssen die anderen Statements auch konfiguriert werden.

Bei kompletten Tabellen oder Tabellen mit Primärykeys kann man das auch über die Zuweisung eines CommandBuilders zum DataAdapter automatisiert erledigen lassen, D.h. man braucht die Statements nicht konfigurieren.
 
Hmm
Also, es sieht bei mir so aus, dass wenn ich den DataAdapter anwähle im Eigenschaftsfenster, die Felder DeleteCommand, InsertCommand und UpdateCommand zu sehen sind.
Im beschriebenen Fall wird von den drei nur das InsertCommand automatisch konfiguriert. (Wenn die Quelltabelle einen Primärschlüssel hat werden normalerweise alle Drei Command-Befehle automatisch konfiguriert.)
Beide den beiden anderen Commands steht "Keine".

Die Fehlermeldung kommt dann bei der von dir erwähnten Update-Methode des Data-Adapters.
Muss ich jetzt die beiden leeren Commands von Hand konfigurieren? (Wenn ja wie?)
Oder habe ich vielleicht noch irgend was übersehen?
 
Ich persönlich hab mir eigene Zugriffsklassen geschrieben. Auf die Unterscheidung der verschiedenen Commands verzichte ich dabei.
Ich hoffe dir hilft der Quellcode meiner Methode "Datenbankaktion" Diese ist allerdings für den SQL-Server. Aber das sollte eigentlich kein Problem sein diese Methode auf eine ODBC-Quelle umzuschreiben.

Code:
PublicFunction DatenbankAktion(ByVal SQLString AsString) AsBoolean
 
sqlCon = New SqlConnection
 
conString = String.Format("Server={0};Database={1};User Id={2};Password={3}", ServerName, DatenbankName, UserName, Passwort)
 
sqlCon.ConnectionString = conString
 
command = New SqlCommand(SQLString, sqlCon)
 
Try
 
sqlCon.Open()
 
command.ExecuteNonQuery()
 
ReturnTrue
 
Catch ex As Exception
 
Dim errorMeldung AsString = ex.ToString()
 
ReturnFalse
 
Finally
 
sqlCon.Close()
 
EndTry
 
 
 
EndFunction
 
Zuletzt bearbeitet:
UpdateCommand zeigt auch ein Beispiel

Ich hab jetzt deine Fehlermeldung erkannt, dein Problem scheint zu sein, das es den Feldnamen in der Datenbank nicht gibt oder du einen Fehler beim Tablemapping gemacht hast.

Solltest Du kein Tablemapping vorgenommen haben (Zuordnung der Bezeichnungen im Dataset gegenüber der Datenbank) und dort Bezeichnungen unterschiedlich sind, musst Du noch das Mapping durchführen.

Beispiel fürs Tablemapping
 
Also ich habe jetzt mal mit dem Code von Maniac2202 rumgespielt (Danke dafür).
Das hat mich aber nicht weiter gebracht.
Dann hab ich das Tablemapping gemacht (quasi aus der MSDN übernommen)
Wenn ich dann das Update ausführe wird der neue Eintrag in das Datagrid übernommen, aber in der Datenbank wird es weiterhin nicht übernommen.
 
So jetzt hat es plötzlich geklappt.
Ich weiß aber nicht warum.

Ich habe jetzt folgenden Code benutzt :

Dim myDataRow As DataRow
myDataRow = DataSet11.Verteilung_SW.NewRow()
myDataRow("Index") = Label2.Text
myDataRow("Rechner_Nr") = TextBox2.Text DataSet11.Verteilung_SW.Rows.Add(myDataRow) OleDbDataAdapter3.Update(DataSet11, "Verteilung SW")

Ich glaube es war einfach eine Umbenennung von "Verteilung_SW" in "Verteilung SW"
Sonst habe ich eigentlich keine Änderungen vorgenommen.
Naja auf jeden Fall läufts jetzt.

Nochmal Danke für die Hilfe

Gruß Ahnungsloser8000
 
Zurück