Benutzer mit den meisten Antworten
Daten im Dataset ändern und gegn die Datenbank updaten

Frage
-
Hallo,
ich versuche mich gerade an den Grundlagen der Datenanbindung. Dazu habe ich ein kleines Testprogramm geschrieben, mit dem ich ein Datenfeld in einer Datatable ändere und versuche diese mit der verbundenen Datenbank zu übertragen.
Die Datenbank ist eine Access-Datenbank (mdb).
Hier ist mein Beispiel-Code. Er läuft in der Zeile Adapter.Update auf einen Fehler, den ich mir nicht erklären kann. Was ist daran falsch?
Gruß
Michael
Sub edit()
'ändern der Daten
DimdataSet AsDataSet= NewDataSetDimconnection AsNewOleDbConnection
connection.ConnectionString = My.Settings.Connection
Dimadapter AsNewOleDbDataAdapter("select * from kunden", connection)
adapter.Fill(dataSet, "Kunden")
Me.DataGridView1.DataSource = dataSet.Tables("kunden")
Dimr AsDataRo
r = dataSet.Tables("kunden").Rows(0)
r.BeginEdit()
r!firma2 = "XXX"
r.EndEdit()
adapter.Update(Me.DataGridView1.DataSource)
EndSub
Antworten
-
Hallo Michael,
erst mal würde ich entweder "Kunden" oder "kunden" schreiben, aber nicht beides gemischt.
Ansonsten sieht der Code von Peter i.O. aus, außer das mir hier ein Open und Close fehlt, aber daran scheint es ja nicht zu liegen.
Dein Fehler kommt sicherlich von einem falschen Update-Command. Du kannst Dir im Debugmode die einzelnen Command anschauen die der Commandbuilder erstellt hat. Vergleiche das Update-Command mit Deinem SQL-Update-Statement.
Gruß Scotty
- Als Antwort markiert Michael Pleick Dienstag, 11. März 2014 18:54
Alle Antworten
-
Hallo Michael,
auf den ersten Blick würde ich sage das es an der übergabe der DataSource des Grids liegt.
Über gib da mal die Tabele wie z.B. hier im Beispiel. Sonst gib bitte noch den Fehler an den du bekommst.
Als Hinweise noch.
Bei VB kann es hilfreich sein die Optionen Expliziet und Strict auf on zu setzen.
Wenn du ein neues Projekt startest ist der Datenzugriff über das EntetyFramework vielleicht ganz interessant.
MFG
Björn
- Bearbeitet Palin Sonntag, 9. März 2014 10:24
-
Hi Michael,
in Deinem Code fehlt der CommandBuilder, der das UpdateCommand bereitstellt. Außerdem verträgt Update kein Objekt. Da solltest Du eine Typkonvertierung einbauen. Der Codeschnipsel funktioniert wie nachfolgend:Sub edit() 'ändern der Daten Dim dataSet As DataSet = New DataSet Dim connection As New OleDbConnection connection.ConnectionString = My.Settings.Connection Dim adapter As New OleDbDataAdapter("select * from kunden", connection) Dim cb As New OleDbCommandBuilder(adapter) adapter.Fill(dataSet, "Kunden") Me.DataGridView1.DataSource = dataSet.Tables("kunden") Dim r As DataRow r = dataSet.Tables("kunden").Rows(0) r.BeginEdit() r!firma2 = "XXX" r.EndEdit() adapter.Update(CType(Me.DataGridView1.DataSource, DataTable)) End Sub
--
Peter -
Hallo Peter,
ich habe bereits viele Varianten dieses Codeschnipseln probiert. Auch den Ansatz von Björn, ich kriege es nicht zum Laufen. Ich erhalte immer folgende Fehlermeldung:
"Ein Ausnahmefehler des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
Zusätzliche Informationen: Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."
Auch Dein Beispiel erzeugt diesen Fehler.
In der Tabelle "Kunden" der Datenbank ist ein Primärschlüssel gesetzt, ich habe auch das Shema eingelesen, alles mit dem gleichen Ergebnis. Schreibe ich die Daten per SQL mit einem Update-Kommando, dann funktioniert es. Ich möchte mit dieser Übung aber gerade die enthaltenen Boardmittel für die Aktualisierung benutzen.
Wo kann ich noch suchen oder gibt es ein einfaches Beispiel, an dem ich dem Fehler langsam auf die Spur kommen kann.
Gruß
Michael
-
Hallo Michael,
erst mal würde ich entweder "Kunden" oder "kunden" schreiben, aber nicht beides gemischt.
Ansonsten sieht der Code von Peter i.O. aus, außer das mir hier ein Open und Close fehlt, aber daran scheint es ja nicht zu liegen.
Dein Fehler kommt sicherlich von einem falschen Update-Command. Du kannst Dir im Debugmode die einzelnen Command anschauen die der Commandbuilder erstellt hat. Vergleiche das Update-Command mit Deinem SQL-Update-Statement.
Gruß Scotty
- Als Antwort markiert Michael Pleick Dienstag, 11. März 2014 18:54
-
Hallo,
ich habe das Problem dank dem Hinweis von Scotty lösten können. Dazu habe ich die Anweisung
MsgBox(cb.GetUpdateCommand.CommandText)
in den Code eingebaut und dadurch gesehen, das ein Datenfeld den Namen "KD-NR" hat. Da ist bei der manuellen Erstellung der Updateanweisung kein Problem, bei der automatischen wohl schon. Ich habe das Datenfeld umbenannt und schon funktioniert es. (eigentlich hatte ich das schon gemacht, aber da ist mir dieser "Fehler" nicht aufgefallen :))
Danke an alle Beteiligten.
Gruß
Michael -
Hi Karsten,
wenn Du mit dem DataAdpter arbeitest, benötigst Du kein Open und Close der Verbindung. Der DataAdapter analysiert den Zustand, den er vorfindet. Wenn die Verbindung geschlossen ist, wird diese geöffnet und nach getaner Arbeiter wieder geschlossen. Damit wird ein effektives ConnectionPooling ohne zusätzlichen Programmieraufwand unterstützt.--
Peter