DB anhand DataSet Updaten (VB.Net, MSSQL 2000)

22/01/2008 - 09:49 von Orazio Di Marco | Report spam
Hallo an alle,

folgendes Umgebung erst einmal:

Entwicklungsumgebung: Visual Studio 2005 (.NET 2.0)
Datenbank: Microsoft SQL 2000
Anbindung: OLEDB

Ich versuche über ein DataSet mein DataGridView in meiner Form zu befüllen.
Funktioniert auch einwandfrei:

Das sieht so aus:


Code:
Public Function FillDataSetIndex(ByVal argSConString As String, ByVal
sqlCommand As String, ByVal Dataset2Fill As DataSet, ByVal DBTable As
String) As Boolean
Try
Dim lResult As Boolean

'SQL Connection erstellen
lResult = CreateDBConnection(argSConString)

Dim command As New OleDbCommand(sqlCommand, gOLEDB)
INDEXadapter = New OleDbDataAdapter
INDEXadapter.SelectCommand = command

Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(INDEXadapter)

INDEXadapter.Fill(Dataset2Fill, DBTable)

Return True

Catch ex As Exception
gLogging.log.Error("ERROR: FillDataSetIndex() - EXCEPTION: " +
ex.Message)
Return False
Finally
gLogging.log.Debug("SUCCESS: FillDataSetIndex()")
End Try

End FunctionIch hab dafür eine seperate Funktion gebaut wo man nur das
Dataset übergeben muss. Das Objekt "INDEXadapter" ist global in der Klasse
deklariert.

Alles super.
Ich binde dann das Dataset ganz normal das das DataGridView.

Nun zu meinem Problem.
Wenn ich versuche eine Zelle zu Editieren, wird die Änderung nicht in die DB
übernommen. Dazu hab ich folgende Funktion geschrieben:


Code:
Public Function UpdateIndexDS(ByVal Dataset2Update As DataSet) As Boolean
Try
' Create the insert, delete and update statements automatically
Dim cb As New OleDbCommandBuilder(INDEXadapter)

' Retrieve just the changed rows
Dim dsChanges As DataSet = Dataset2Update.GetChanges()

If Not dsChanges Is Nothing Then
' Update the database
INDEXadapter.Update(dsChanges)

' Accept the changes within the DataSet
Dataset2Update.AcceptChanges()
End If

Return True
Catch ex As Exception
gLogging.log.Error("ERROR: UpdateIndexDS() - EXCEPTION: " +
ex.Message)
Return False
Finally
gLogging.log.Debug("SUCCESS: UpdateIndexDS()")
End Try
End FunctionAuch hier wieder übergebe ich mein Dataset an die Funktion. Es
kommt kein Fehler sondern das objekt "dsChanges" ist Nothing. Was ja
eigentlich nicht sein sollte. Wenn ich nàmlich mein DataSet vor der
If-Schleife im Quickview ansehe, dann seh ich auch die geànderte Zelle.
Da er aber immer Nothing zurückgibt, làuft er halt auch gar nicht in die If
um den Adapter Up zu Daten.

Was mache ich falsch?

Für jede kleine Hilfe wàre ich sehr dankbar.

gruß
 

Lesen sie die antworten

#1 Peter Fleischer
26/01/2008 - 15:00 | Warnen spam
"Orazio Di Marco" schrieb im Newsbeitrag
news:

folgendes Umgebung erst einmal:

Entwicklungsumgebung: Visual Studio 2005 (.NET 2.0)
Datenbank: Microsoft SQL 2000
Anbindung: OLEDB



Hi Orazio,
warum OleDb und nicht den faür optimierten .NET-Provider?

Ich versuche über ein DataSet mein DataGridView in meiner Form zu
befüllen.
Funktioniert auch einwandfrei:

Das sieht so aus:

Code:
Public Function FillDataSetIndex(ByVal argSConString As String, ByVal
sqlCommand As String, ByVal Dataset2Fill As DataSet, ByVal DBTable As
String) As Boolean
Try
Dim lResult As Boolean

'SQL Connection erstellen
lResult = CreateDBConnection(argSConString)

Dim command As New OleDbCommand(sqlCommand, gOLEDB)
INDEXadapter = New OleDbDataAdapter
INDEXadapter.SelectCommand = command

Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(INDEXadapter)



Wozu das, wenn du es spàter nochmals machst?

INDEXadapter.Fill(Dataset2Fill, DBTable)

Return True

Catch ex As Exception
gLogging.log.Error("ERROR: FillDataSetIndex() - EXCEPTION: " +
ex.Message)
Return False
Finally
gLogging.log.Debug("SUCCESS: FillDataSetIndex()")
End Try

End FunctionIch hab dafür eine seperate Funktion gebaut wo man nur das
Dataset übergeben muss. Das Objekt "INDEXadapter" ist global in der Klasse
deklariert.

Alles super.
Ich binde dann das Dataset ganz normal das das DataGridView.

Nun zu meinem Problem.
Wenn ich versuche eine Zelle zu Editieren, wird die Änderung nicht in die
DB
übernommen. Dazu hab ich folgende Funktion geschrieben:


Code:
Public Function UpdateIndexDS(ByVal Dataset2Update As DataSet) As Boolean
Try
' Create the insert, delete and update statements automatically
Dim cb As New OleDbCommandBuilder(INDEXadapter)



Und schon wieder ein CommandBuilder?

' Retrieve just the changed rows
Dim dsChanges As DataSet = Dataset2Update.GetChanges()



Gibt es in Dataset2Update wirklich Datensàtze mit RowState<>unchanged?


If Not dsChanges Is Nothing Then
' Update the database
INDEXadapter.Update(dsChanges)

' Accept the changes within the DataSet
Dataset2Update.AcceptChanges()



Wozu das? Hast du AcceptChnagesDuringUpdate aus False gesetzt, so dass das
AcceptChanges erforderlich ist?

End If

Return True
Catch ex As Exception
gLogging.log.Error("ERROR: UpdateIndexDS() - EXCEPTION: " +
ex.Message)
Return False
Finally
gLogging.log.Debug("SUCCESS: UpdateIndexDS()")
End Try
End Function

Auch hier wieder übergebe ich mein Dataset an die Funktion. Es
kommt kein Fehler sondern das objekt "dsChanges" ist Nothing. Was ja
eigentlich nicht sein sollte.



Dast du mal geprüft:

Trace.WriteLine(Dataset2Update.HasChanges)

Wenn ich nàmlich mein DataSet vor der
If-Schleife im Quickview ansehe, dann seh ich auch die geànderte Zelle.



Du siehts wirklcih beim Datensatz den RowState=modified ?

Da er aber immer Nothing zurückgibt, làuft er halt auch gar nicht in die
If
um den Adapter Up zu Daten.

Was mache ich falsch?



Ich vermute sehr stark ein unpassend ausgeführtes AcceptChanges.

Für jede kleine Hilfe wàre ich sehr dankbar.



Da müsste man mehr vom Programm sehen und vor allem HasChanges und
Rowstates.


Viele Gruesse

Peter

Ähnliche fragen