tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Vereth
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
815
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    noFaiTh noFaiTh ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    8
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
        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
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
    noFaiTh bedankt sich. 
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  3. #3
    noFaiTh noFaiTh ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    8
    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 :
    1
    
    oleDA.UpdateCommand = oleCB.GetUpdateCommand

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

    Bis dahin
    MfG noFaith
    Geändert von noFaiTh (15.04.10 um 08:00 Uhr)
     

  4. #4
    noFaiTh noFaiTh ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    8
    Hallo

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

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    
    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
     

  5. #5
    noFaiTh noFaiTh ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    8
    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 :
    1
    2
    
    oleCB.QuotePrefix = "["
    oleCB.QuoteSuffic = "]"
    führt dazu, dass alle Feldnamen wie folgt aufgebaut werden [Kunden-Nr]. Und es ROCKT
     

Ähnliche Themen

  1. DataAdapter, Dataset und Datagrid
    Von Goldman im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 25.05.09, 14:26
  2. DataAdapter/-Update
    Von Alfred_ im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 13.09.08, 17:11
  3. mySQL Dataadapter - Problem mit negativen Zahlen
    Von MasterDS im Forum .NET Datenverwaltung
    Antworten: 1
    Letzter Beitrag: 14.01.08, 08:25
  4. C# SQLite DataAdapter Update Problem
    Von Eichhoernchen09 im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 30.03.06, 09:22
  5. problem mit DataAdapter
    Von LordDeath im Forum .NET Archiv
    Antworten: 5
    Letzter Beitrag: 13.04.04, 11:20