MS-Access Datensatz aktualisieren

01/11/2009 - 19:59 von Christoph Schmitt | Report spam
Hallo Allerseits,

ich habe den ganzen Tag versucht, mich mit ADO.Net auseinanderzusetzen.
Einiges klappt, vieles aber noch nicht.

Im nachfolgenden Beispiel möchte ich eine Tabelle "durchlaufen", um z.B.
einen bestimmten Feldwert zu überprüfen. Falls ein bestimmter Wert (z.B.
Null gefunden wird, soll der auf 0 gesetzt werden. ich weiss, daß man das
auch schneller und einfacher mit einem "UPDATE " machen könnte, aber ich
möchte lernen, wie ich einzelne Feldwerte lesen und àndern kann und diese
dann in der Tabelle aktualisieren kann.

Beispiel:
Dim l As Long

Dim da As New OleDb.OleDbDataAdapter

Dim ds As New DataSet

Dim dt As New DataTable

Dim dr As DataRow

Dim cb As OleDb.OleDbCommandBuilder

da.SelectCommand = New OleDb.OleDbCommand("SELECT * FROM tblFahrten", UpCNN)

cb = New OleDb.OleDbCommandBuilder(da)

ds.Clear()

da.Fill(ds, "tblFahrten")

For l = 0 To ds.Tables(0).Rows.Count - 1

dr = ds.Tables(0).Rows(l)

If IsDBNull(dr!FASchichtIdx) = True Then

dr.BeginEdit()

dr!FASchichtIdx = 0

dr.EndEdit()

Try

da.Update(ds, "tblFahrten")

Catch ex As Exception

MsgBox(ex.Message, MsgBoxStyle.Information + MsgBoxStyle.OkOnly)

End Try

End If

Next

Die Zeile: da.Update(ds, "tblFahrten") macht Probleme

Es kommt die Rückmeldung: Abfrage zu komplex.

Wenn ich es richtig verstehe, sollte der da.Update die gesamte Tabelle
aktualisieren.

Für mich stellt sich die Frage: Warum geht das nicht??

Wie kann ich nur die eine Zeile aktualisieren?

Vielen Dank für jede Hilfe

Christoph
 

Lesen sie die antworten

#1 Peter Götz
02/11/2009 - 09:05 | Warnen spam
Hallo Christoph,

ich habe den ganzen Tag versucht, mich mit ADO.Net auseinanderzusetzen.
Einiges klappt, vieles aber noch nicht.

Im nachfolgenden Beispiel möchte ich eine Tabelle "durchlaufen", um z.B.
einen bestimmten Feldwert zu überprüfen. Falls ein bestimmter Wert (z.B.
Null gefunden wird, soll der auf 0 gesetzt werden. ich weiss, daß man das
auch schneller und einfacher mit einem "UPDATE " machen könnte, aber ich
möchte lernen, wie ich einzelne Feldwerte lesen und àndern kann und diese
dann in der Tabelle aktualisieren kann.




Schau Dir mal das Beispiel unter

www.gssg.de -> Visual Basic -> VB.net -> Datenbank
-> DB CommandObjekte / DataReader

an. Darin werden gezielt einzelne Datensàtze in einer
DataTable geàndert, gelöscht oder hinzugefügt und dann
ein Update der zugehörigen DB-Tabelle ausgeführt.


Beispiel:
Dim l As Long

Dim da As New OleDb.OleDbDataAdapter

Dim ds As New DataSet

Dim dt As New DataTable

Dim dr As DataRow

Dim cb As OleDb.OleDbCommandBuilder



Der CommandBuilder kann nur dann sinnvolle Commands
erstellen, wenn die zu bearbeitende Tabelle ein Feld mit
eindeutigen Werten (Primàrschlüsselfeld) enthàlt.

Gibt es ein solches Feld in Deiner DB-Tabelle tblFahrten?

da.SelectCommand = New OleDb.OleDbCommand("SELECT * FROM tblFahrten",
UpCNN)

cb = New OleDb.OleDbCommandBuilder(da)




Ich würde Dir empfehlen, erst mal auf den CommandBuilder
zu verzichten und Deine Commands via eigenem Code zu
erstellen, damit Du erst mal ein Gefühl für die Arbeit mit
Commands bekommst und so auch die Zusammenhànge
zwischen DataAdapter und Commands besser verstehst.

ds.Clear()

da.Fill(ds, "tblFahrten")

For l = 0 To ds.Tables(0).Rows.Count - 1

dr = ds.Tables(0).Rows(l)

If IsDBNull(dr!FASchichtIdx) = True Then



Die vorstehende Zeile sollte besser so aussehen:

if dr.Item("FeldName") is DBNull.Value then



dr.BeginEdit()
dr!FASchichtIdx = 0



Wg. der besseren Lesbarkeit würde ich hier die
"modernere" Schreibweise

dr.Item("FeldName") = Wert

oder

dr.Item(FeldIndex) = Wert

vorziehen.



dr.EndEdit()



dr.BeginEdit und dr.EndEdit sind hier nicht
erforderlich.

Try

da.Update(ds, "tblFahrten")

Catch ex As Exception

MsgBox(ex.Message, MsgBoxStyle.Information + MsgBoxStyle.OkOnly)

End Try

End If

Next

Die Zeile: da.Update(ds, "tblFahrten") macht Probleme

Es kommt die Rückmeldung: Abfrage zu komplex.



s.oben:
Primàrschlüsselfeld in der DB-Tabelle vorhanden?


Wenn ich es richtig verstehe, sollte der da.Update die gesamte Tabelle
aktualisieren.



Der DataAdapter prüft mit Hilfe der RowStates, welche
Rows der DataTable veràndert worden sind und führt ein
Update für eben diese Datensàtze in der DB-Tabelle aus.

Zum Thema RowState schau Dir mal das Beispiel unter

www.gssg.de -> Visual Basic -> VB.net
-> DataTable / DataView / CurrencyManager
-> DataTable / DataView, RosState

an. Darin siehst Du auch, wie einzelne Datensàtze (Rows)
innerhalb einer DataTable veràndert werden können und
welche Auswirkungen auf den RowState dieser Row hat.


Für mich stellt sich die Frage: Warum geht das nicht??

Wie kann ich nur die eine Zeile aktualisieren?



Unter

www.gssg.de -> Visual Basic -> VB.net
-> Datenbank
-> DataGridView
-> DataTable / DataView / CurrencyManager

findest Du eine Reihe von Beispielen, die Dir zeigen, wie
Du Daten in DataTables manipulieren kannst und wie Du
mit Hilfe eines CurrencyManagers im Datenbestand einer
DataTable bzw. DataView navigieren kannst oder mit
Hilfe der div. Filter- und/oder Find-Methoden an einen ganz
bestimmten Datensatz kommst.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen