Problem bei DataAdapter.Update

noFaiTh

Grünschnabel
Hallo,

versuche DBNullValues aus meinen Tables zu entfernen und habe hierfür folgende Funktion geschrieben.
Ich weiss, dass meine Schleife über 1000 Änderungen an der Tabelle gemacht hat.
Beim DA.Update bekomme ich folgende Fehlermeldung:
"Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."

Ich bin, hoffentlich nicht fälschlicherweise, davon ausgegangen, dass mein Commandbuilder das sauber macht.
Kann die Commands nicht von Hand schreiben, da es für alle Tabellen möglich sein soll und die Spalten nie gleich sind.

Bin über jede Hilfe dankbar.

Gruß noFaiTh

Code:
    Public Function CleanTable(ByVal sDB As String, ByVal sTable As String) As Boolean
        Dim myOleDbDataAdapter As OleDbDataAdapter
        Dim myDataSet As DataSet = New DataSet()
        Dim myDataTable As DataTable = New DataTable()
        Dim myDataCol As DataColumn
        Dim myDataRow As DataRow
        Dim myDataType As String
        Dim myOleDbConnection As OleDbConnection
        Dim myCommand As OleDbCommandBuilder
        Dim myCounter As Integer = 0

        myOleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "User ID=Admin;Data Source=" & sDB)
        Try
            myOleDbDataAdapter = New OleDbDataAdapter("select * from " & sTable, myOleDbConnection)
            myCommand = New OleDbCommandBuilder(myOleDbDataAdapter)
            myOleDbDataAdapter.Fill(myDataTable)

            For Each myDataCol In myDataTable.Columns
                myDataType = myDataCol.DataType.ToString
                For Each myDataRow In myDataTable.Rows
                    If myDataRow(myDataCol) Is System.DBNull.Value Then
                        Select Case myDataType
                            Case "System.String"
                                myDataRow(myDataCol) = ""
                                myCounter += 1
                            Case "System.Int32"
                                myDataRow(myDataCol) = 0
                                myCounter += 1
                            Case "System.Decimal"
                                myDataRow(myDataCol) = 0
                                myCounter += 1
                            Case Else
                        End Select
                    End If
                Next
            Next

            If Not myDataTable.HasErrors Then
                myOleDbDataAdapter.Update(myDataTable)
            Else
                MessageBox.Show("Error in DataTable" & " myCounter: " & myCounter.ToString)
            End If

        Catch ex As OleDb.OleDbException
            MessageBox.Show(ex.Message & vbCrLf & ex.StackTrace)
            Return False
        Catch ex As Exception
            MessageBox.Show(ex.Message & vbCrLf & ex.StackTrace)
            Return False
        End Try

        Return True

    End Function
 
Möglicherweise hast du in deinem switch nur einen Datentyp vergessen zu behandeln. Schau mal nach in welcher Tabelle das geschieht und welche Werte der entsprechende Datensatz hat.
 
Hi Vereth,

danke für deine Antwort.
Kann mir überhaupt nicht vorstellen wie das ein Problem sein soll, da erstens Case Else alle restlichen Datentypen "behandelt", also nichts macht
und zweitens die Fehlermeldung mit dem Update-Command zu tun haben muss. Deshalb schließe ich auf den Commandbuilder.
Hab inzwischen auch schon die Statements im Adapter ersetzt via:

Code:
oleDA.UpdateCommand = oleCB.GetUpdateCommand

Hat leider nichts am Fehler geändert.
Hoffe jemand weiss Rat.

Bis dahin
MfG noFaith
 
Zuletzt bearbeitet:
Hallo

Habe jetzt auch noch die anderen Types behandelt, wie erwartet leider keine Änderung an der Fehlermeldung.

Code:
Public Function CleanTable(ByVal sDB As String, ByVal sTable As String, Optional ByVal frmFLP As FlowLayoutPanel = Nothing) As Boolean
        Dim oleDA As OleDbDataAdapter
        Dim oleDT As DataTable = New DataTable()
        Dim oleDC As DataColumn
        Dim oleDR As DataRow
        Dim oleCN As OleDbConnection
        Dim oleCB As OleDbCommandBuilder
        Dim oleDType As String = ""
        Dim oleCount As Integer = 0


        oleCN = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=" & sDB)

        Try
            oleDA = New OleDbDataAdapter("select * from " & sTable, oleCN)
            oleCB = New OleDbCommandBuilder(oleDA)

            oleDA.Fill(oleDT)

            oleDA.UpdateCommand = oleCB.GetUpdateCommand
            oleDA.InsertCommand = oleCB.GetInsertCommand
            oleDA.DeleteCommand = oleCB.GetDeleteCommand

            For Each oleDC In oleDT.Columns
                oleDType = oleDC.DataType.ToString
                For Each oleDR In oleDT.Rows
                    If oleDR(oleDC) Is System.DBNull.Value Then
                        Select Case oleDType
                            Case "System.String"
                                oleDR(oleDC) = ""
                                oleCount += 1
                            Case "System.Int32"
                                oleDR(oleDC) = 0
                                oleCount += 1
                            Case "System.Decimal"
                                oleDR(oleDC) = 0
                                oleCount += 1
                            Case "System.Double"
                                oleDR(oleDC) = 0
                                oleCount += 1
                            Case "System.DateTime"
                                oleDR(oleDC) = Convert.ToDateTime("01.01.1900")
                                oleCount += 1
                            Case Else
                                Debug.Print(oleDType.ToString)
                        End Select
                    End If
                Next
            Next

            If Not oleDT.HasErrors Then
                Debug.Print(oleDA.UpdateCommand.CommandText.ToString & Environment.NewLine & oleCount.ToString)
                oleDA.Update(oleDT)
            Else
                MessageBox.Show("Error in DataTable" & " myCounter: " & oleCount.ToString)
            End If

        Catch ex As OleDb.OleDbException
            MessageBox.Show(ex.Message & vbCrLf & ex.StackTrace)
            Return False
        Catch ex As Exception
            MessageBox.Show(ex.Message & vbCrLf & ex.StackTrace)
            Return False
        Finally
            If oleCN.State <> ConnectionState.Closed Then
                oleCN.Close()
                oleCN = Nothing
            End If
        End Try

        Return True

    End Function
 
Für alle die es interessiert:
In den Feldnamen waren "-", also z.B. "Kunden-Nr" und der Commandbuilder baut das Updatecommand zwar sauber auf,
aber leider kommt Access mit solchen Namen nicht klar. deshalb:
Code:
oleCB.QuotePrefix = "["
oleCB.QuoteSuffic = "]"
führt dazu, dass alle Feldnamen wie folgt aufgebaut werden [Kunden-Nr]. Und es ROCKT
 
Zurück