Access UpdateCommand ohne BindingsourceAssi

18/01/2008 - 16:00 von Heiko Strohmeier | Report spam
Hallo zusammen,
ich versuche manuell geànderte Daten verschiedener Zellen in einem
DataGridView per UpdateCommand zu speichern. Das DataGridView ist ohne
BindingSource, da ich die Prozesse, die da hinter stehen gerne mal
verstehen möchte.
Das ganze funktioniert leider nicht, weil ich nicht weiß, wie ich dem
objDataSet die Änderung mitteilen soll? objDataAdapter.Fill(objDataSet,
"tabellenimport") ist im unten stehenden Code leider nicht mit den
Änderungen initialisiert. Wie und wo schreibe ich die Änderungen in den
Code?
Wenn ich per DataTable die Änderungen durchspiele (siehe Code, versehen
als Kommentar) erscheinen Fehlermeldungen.

Gruss Heiko


'Speichern der AccessDaten ohne Bindingsource zum Dataset eines Datagrids
Dim objDataSet As DataSet
Dim objDataView As DataView
objDataSet = New DataSet
objDataView = Nothing
Dim Cmd As New OleDb.OleDbCommand
Dim objDataAdapter As OleDb.OleDbDataAdapter
Dim myData As New DataTable("Data")


With Cmd
.Connection = New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb")
.Connection.Open()
objDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM
tabellenimport", .Connection)
Dim Olebui As New OleDbCommandBuilder(objDataAdapter)

With Olebui
objDataAdapter.InsertCommand = Olebui.GetInsertCommand
objDataAdapter.DeleteCommand = Olebui.GetDeleteCommand
objDataAdapter.UpdateCommand = Olebui.GetUpdateCommand
End With
'myData = DataGrid1.DataSource

objDataAdapter.Fill(objDataSet, "tabellenimport")
'objDataAdapter.Fill(myData)
objDataAdapter.Update(objDataSet, "tabellenimport")
objDataView = New DataView(objDataSet.Tables("tabellenimport"))

'objDataAdapter.Update(objDataSet, "DataGrid1.DataSource")
.Connection.Close()
Cmd = Nothing
End With

'DataGrid1.DataSource = myData
DataGrid1.DataSource = objDataView
 

Lesen sie die antworten

#1 Peter Fleischer
18/01/2008 - 16:35 | Warnen spam
"Heiko Strohmeier" schrieb im Newsbeitrag
news:fmqets$83g$

ich versuche manuell geànderte Daten verschiedener Zellen in einem
DataGridView per UpdateCommand zu speichern. Das DataGridView ist ohne
BindingSource, da ich die Prozesse, die da hinter stehen gerne mal
verstehen möchte.



Hi Heiko,
die BidningSource ist nichts teufliches, sondern eigentlich nur eine
Kapselung einer Sicht (DataView) und Methoden/Eigenschaften, die den
dazugehörigen BindingManager liefern.

Das ganze funktioniert leider nicht, weil ich nicht weiß, wie ich dem
objDataSet die Änderung mitteilen soll? objDataAdapter.Fill(objDataSet,
"tabellenimport") ist im unten stehenden Code leider nicht mit den
Änderungen initialisiert. Wie und wo schreibe ich die Änderungen in den
Code?



Was meinst du mit "Änderungen im Code"? Warum kannst du den Code nicht
àndern :-) ?

Wenn ich per DataTable die Änderungen durchspiele (siehe Code, versehen
als Kommentar) erscheinen Fehlermeldungen.

Gruss Heiko


'Speichern der AccessDaten ohne Bindingsource zum Dataset eines Datagrids
Dim objDataSet As DataSet
Dim objDataView As DataView
objDataSet = New DataSet
objDataView = Nothing
Dim Cmd As New OleDb.OleDbCommand
Dim objDataAdapter As OleDb.OleDbDataAdapter
Dim myData As New DataTable("Data")



Die DataTable wird nicht genutzt, da du beim Fill implizit eine neue
DataTable im DataSet erzeugen làsst.

With Cmd
.Connection = New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb")
.Connection.Open()



Open ist beim DataAdapter nicht erfoderlich, da er selbst öffnen kann und
nach der Arbeit den alten Zustand wieder herstellt. Bei Access ist es aber
günstiger, die Verbindung am Anfang zu öffnen und nicht bei jedem einzelenen
Zugriff explizit oder auch implizit immer wieder zu öffnen und zu schließen.

objDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM
tabellenimport", .Connection)



Wenn du alles selbst machen willst, warum nutzt du dann hier die implizite
Instanzierung des Command-Objektes für die SelectCommand-Eigenschaft des
DataAdapters?

Dim Olebui As New OleDbCommandBuilder(objDataAdapter)



Hier solltest du entscheiden, ob du die Quote-Eigenschaften benötigst, um
beispielsweise reservierte Schlüsselworte als Bezeichner oder Sonderzeichen
in den Bezeichnern zuzulassen.


With Olebui
objDataAdapter.InsertCommand = Olebui.GetInsertCommand
objDataAdapter.DeleteCommand = Olebui.GetDeleteCommand
objDataAdapter.UpdateCommand = Olebui.GetUpdateCommand
End With



Die Zuweisung ist nicht nötig, da mit der Instanzierung des CommandBuilder
dieser am dataAdapter registriert ist. Bei Bedarf (fehlendes Command-Objekt
beim Update) holt sich der DataAdapter dann das fehlende Command-Objekt.

'myData = DataGrid1.DataSource

objDataAdapter.Fill(objDataSet, "tabellenimport")



Die Standardeinstellung beim DataAdapter Is AcceptChangesDuringFill=True.
Damit haben alle Datensàtzen den Rowstate 'unchanged'.

'objDataAdapter.Fill(myData)
objDataAdapter.Update(objDataSet, "tabellenimport")



Ein Update auf Datensàtze, die alle 'unchanged' sind, ist wirkungslos.

objDataView = New
DataView(objDataSet.Tables("tabellenimport"))

'objDataAdapter.Update(objDataSet, "DataGrid1.DataSource")
.Connection.Close()
Cmd = Nothing
End With

'DataGrid1.DataSource = myData
DataGrid1.DataSource = objDataView



Nach dem Fill sollten die Daten geàndert werden, z.B. so:

objDataSet.Tables(0).Rows(0)(0) = neuerWert


Viele Gruesse

Peter

Ähnliche fragen