none
Problem mit Schreiben in Zeilen RRS feed

  • Frage

  • Hallo,

    ich frage mit Ado die Datenbank ab, steck alles in ein Dataset, verändere die Daten und lasse es dann in die Tabelle schreiben.

    Wie kann es sein, dass in alle Zeilen außer der ersten geschrieben wird? Ich blick da nicht durch, habe schon alles probiert was mir einfällt, nen Breakpoint gesetzt und geguckt..

    schaut mal bitte einer rein:

     

    Imports System.Data.SqlClient
    
    
    Public Class Form1
    	Inherits System.Windows.Forms.Form
    
    	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    
      	Dim strConnection As String = "Password=xy;Persist Security Info=True;" & _
     	"User ID=user0;Initial Catalog=test;" & _
     	"Data Source=190.45.678;"
      	MsgBox("Verbindung hergestellt")
    
      	Dim conn As SqlConnection = New SqlConnection(strConnection)
    
    
    
      	Dim SQL As String = "Select * from Artikel where artid = 1 order by artid "
      	Dim da As New SqlDataAdapter(SQL, conn)
      	Dim cmdb As New SqlCommandBuilder(da)
      	Dim ds As New DataSet()
     	
      	conn.Open()
      	da.Fill(ds, "artikel")
    
      	Dim dt As DataTable = ds.Tables("Artikel")
    
    	
      	Dim anzahl As Integer = ds.Tables("artikel").Rows.Count - 1
    
      	ds.Tables("Artikel").Rows(0).BeginEdit()
      	For i As Integer = 0 To anzahl
        	ds.Tables("Artikel").Rows(i).Item("altean") = "format(now)"
      	Next
    
      	MsgBox("fertig")
    
    	
      	da.Update(ds, "artikel")
    
    
        	ListBox1.DataSource = dt
        	ListBox1.DisplayMember = "altean"
    
    
    
    
    	End Sub
    
    
    
    End Class
    Dankeschön!

    Mittwoch, 6. Oktober 2010 06:37

Antworten

  • Hallo,

    ich frage mit Ado die Datenbank ab, steck alles in ein
    Dataset, verändere die Daten und lasse es dann in
    die Tabelle schreiben.

    Wenn Du nur diese einzige Tabelle zu verarbeiten hast,
    dann ist ein DataSet überflüssiger Ballast. Die Daten aus
    dieser Tabelle kannst Du auch direkt in eine (lokale)
    DataTable holen und dort bearbeiten.

    Wie kann es sein, dass in alle Zeilen außer der ersten
    geschrieben wird? Ich blick da nicht durch, habe schon
    alles probiert was mir einfällt, nen Breakpoint gesetzt
    und geguckt..

    Das

        ds.Tables("Artikel").Rows(0).BeginEdit()

    vor Deiner Schleife, in welcher Du die Datensätze
    änderst, ist die Ursache. Das gehört dort nicht hin.

    ..... schnipp .....

        Dim dt As DataTable = ds.Tables("Artikel")
        Dim anzahl As Integer = ds.Tables("artikel").Rows.Count - 1

        ds.Tables("Artikel").Rows(0).BeginEdit()

    Entferne die vorstehende Zeile, dann werden alle Datensätze
    wie gewünscht verändert.

        For i As Integer = 0 To anzahl
            ds.Tables("Artikel").Rows(i).Item("altean") = "format(now)"
        Next

    ..... schnapp .....

    Mit nachfolgendem Beispiel kannst Du die Auswirkungen Deines

        ds.Tables("Artikel").Rows(0).BeginEdit()

    direkt im DataGridView beobachten.
    Kopiere den Code in ein leeres Formmodul (Form1.vb)

    ' / / / Beginn Code Form1.vb
    Public Class Form1
        Private mDT As DataTable
        Private mDV As DataView
        Private WithEvents DGV As DataGridView
        Private WithEvents Button1 As Button
        Private Check1 As CheckBox

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateData()
            CreateControls()

            DGV.DataSource = mDV
            With DGV

                .Columns(0).DefaultCellStyle.Alignment = _
                    DataGridViewContentAlignment.MiddleRight

                .Columns(2).DefaultCellStyle.Format = _
                        "dd.MM.yyyy HH:mm:ss"

                .AutoResizeColumns()
            End With

        End Sub

        Private Sub CreateControls()
            DGV = New DataGridView
            With DGV
                .Name = "DGV"

                .DefaultCellStyle.Font = _
                        New Font("Arial", 12)

                .ColumnHeadersDefaultCellStyle.Font = _
                        New Font("Arial", 8, FontStyle.Bold)

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 70)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(DGV)

            Button1 = New Button
            With Button1
                .Name = "Button1"
                .Font = New Font("Arial", 10)
                .SetBounds(10, DGV.Bottom + 10, 100, 40)
                .Text = "Update"

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(Button1)

            Check1 = New CheckBox
            With Check1
                .Name = "Check1"
                .Font = Button1.Font
                .Text = "mit BeginEdit"
                .AutoSize = True

                .Location = _
                        New Point _
                        (Button1.Right + 20, _
                         Button1.Top)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom

                .ThreeState = False
                .Checked = True

            End With
            Me.Controls.Add(Check1)

            Me.Size = New Size(400, 480)
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow

            mDT = New DataTable
            With mDT
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("Text", GetType(String))
                .Columns.Add("Datum", GetType(Date))

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i, False)
                    DR.Item(2) = Now

                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mDV = mDT.DefaultView
        End Sub

        Private Sub Button1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Button1.Click

            Dim Rnd As New Random(Now.Millisecond)
            Dim i As Integer
            Dim NewDate As Date

            ' *********************
            If Check1.Checked Then
                mDT.Rows(0).BeginEdit()
            Else
                mDT.Rows(0).CancelEdit()
            End If
            ' *********************

            For i = 0 To mDT.Rows.Count - 1

                NewDate = _
                    Now.AddDays(Rnd.Next(1, 10))

                NewDate = _
                    NewDate.AddSeconds(Rnd.Next(100, 6000))

                mDT.Rows(i).Item("Datum") = NewDate
            Next
        End Sub
    End Class
    ' \ \ \ Ende Code Form1.vb

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

    Mittwoch, 6. Oktober 2010 07:42
  • Hi dejam27,

    versuch mal anstatt:

     	Dim anzahl As Integer = ds.Tables("artikel").Rows.Count - 1
    
     	ds.Tables("Artikel").Rows(0).BeginEdit()
     	For i As Integer = 0 To anzahl
      	ds.Tables("Artikel").Rows(i).Item("altean") = "format(now)"
     	Next
    
    

    dieses hier:

    For Each row As DataRow In dt.Rows
      row("altean") = "format(now)"
    Next

    Vielleicht hilfts ja.


    Please 'Mark as Answer' if I helped. This helps others who have the same problem!
    Mittwoch, 6. Oktober 2010 07:41

Alle Antworten

  • Hi dejam27,

    versuch mal anstatt:

     	Dim anzahl As Integer = ds.Tables("artikel").Rows.Count - 1
    
     	ds.Tables("Artikel").Rows(0).BeginEdit()
     	For i As Integer = 0 To anzahl
      	ds.Tables("Artikel").Rows(i).Item("altean") = "format(now)"
     	Next
    
    

    dieses hier:

    For Each row As DataRow In dt.Rows
      row("altean") = "format(now)"
    Next

    Vielleicht hilfts ja.


    Please 'Mark as Answer' if I helped. This helps others who have the same problem!
    Mittwoch, 6. Oktober 2010 07:41
  • Hallo,

    ich frage mit Ado die Datenbank ab, steck alles in ein
    Dataset, verändere die Daten und lasse es dann in
    die Tabelle schreiben.

    Wenn Du nur diese einzige Tabelle zu verarbeiten hast,
    dann ist ein DataSet überflüssiger Ballast. Die Daten aus
    dieser Tabelle kannst Du auch direkt in eine (lokale)
    DataTable holen und dort bearbeiten.

    Wie kann es sein, dass in alle Zeilen außer der ersten
    geschrieben wird? Ich blick da nicht durch, habe schon
    alles probiert was mir einfällt, nen Breakpoint gesetzt
    und geguckt..

    Das

        ds.Tables("Artikel").Rows(0).BeginEdit()

    vor Deiner Schleife, in welcher Du die Datensätze
    änderst, ist die Ursache. Das gehört dort nicht hin.

    ..... schnipp .....

        Dim dt As DataTable = ds.Tables("Artikel")
        Dim anzahl As Integer = ds.Tables("artikel").Rows.Count - 1

        ds.Tables("Artikel").Rows(0).BeginEdit()

    Entferne die vorstehende Zeile, dann werden alle Datensätze
    wie gewünscht verändert.

        For i As Integer = 0 To anzahl
            ds.Tables("Artikel").Rows(i).Item("altean") = "format(now)"
        Next

    ..... schnapp .....

    Mit nachfolgendem Beispiel kannst Du die Auswirkungen Deines

        ds.Tables("Artikel").Rows(0).BeginEdit()

    direkt im DataGridView beobachten.
    Kopiere den Code in ein leeres Formmodul (Form1.vb)

    ' / / / Beginn Code Form1.vb
    Public Class Form1
        Private mDT As DataTable
        Private mDV As DataView
        Private WithEvents DGV As DataGridView
        Private WithEvents Button1 As Button
        Private Check1 As CheckBox

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateData()
            CreateControls()

            DGV.DataSource = mDV
            With DGV

                .Columns(0).DefaultCellStyle.Alignment = _
                    DataGridViewContentAlignment.MiddleRight

                .Columns(2).DefaultCellStyle.Format = _
                        "dd.MM.yyyy HH:mm:ss"

                .AutoResizeColumns()
            End With

        End Sub

        Private Sub CreateControls()
            DGV = New DataGridView
            With DGV
                .Name = "DGV"

                .DefaultCellStyle.Font = _
                        New Font("Arial", 12)

                .ColumnHeadersDefaultCellStyle.Font = _
                        New Font("Arial", 8, FontStyle.Bold)

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 70)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(DGV)

            Button1 = New Button
            With Button1
                .Name = "Button1"
                .Font = New Font("Arial", 10)
                .SetBounds(10, DGV.Bottom + 10, 100, 40)
                .Text = "Update"

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(Button1)

            Check1 = New CheckBox
            With Check1
                .Name = "Check1"
                .Font = Button1.Font
                .Text = "mit BeginEdit"
                .AutoSize = True

                .Location = _
                        New Point _
                        (Button1.Right + 20, _
                         Button1.Top)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom

                .ThreeState = False
                .Checked = True

            End With
            Me.Controls.Add(Check1)

            Me.Size = New Size(400, 480)
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow

            mDT = New DataTable
            With mDT
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("Text", GetType(String))
                .Columns.Add("Datum", GetType(Date))

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i, False)
                    DR.Item(2) = Now

                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mDV = mDT.DefaultView
        End Sub

        Private Sub Button1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Button1.Click

            Dim Rnd As New Random(Now.Millisecond)
            Dim i As Integer
            Dim NewDate As Date

            ' *********************
            If Check1.Checked Then
                mDT.Rows(0).BeginEdit()
            Else
                mDT.Rows(0).CancelEdit()
            End If
            ' *********************

            For i = 0 To mDT.Rows.Count - 1

                NewDate = _
                    Now.AddDays(Rnd.Next(1, 10))

                NewDate = _
                    NewDate.AddSeconds(Rnd.Next(100, 6000))

                mDT.Rows(i).Item("Datum") = NewDate
            Next
        End Sub
    End Class
    ' \ \ \ Ende Code Form1.vb

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

    Mittwoch, 6. Oktober 2010 07:42