Vb.net 数据集对新行进行了更改

Vb.net 数据集对新行进行了更改,vb.net,Vb.net,我只是注意到,如果用户修改了DataGridView中的某些内容,并且选择了最后一行(新)而没有在其中输入任何数据,那么当HasChanged事件触发时,最后一行将包含在要添加到数据库的行中。然后我得到一个错误,因为由于空值,我无法将该记录放入数据库。我想在那个特殊情况下排除这一行,因为它不应该被视为一个需要添加的行。以下是我目前的代码: For Each row As DataGridViewRow In Grid.Rows If Not row.IsNewRow Th

我只是注意到,如果用户修改了
DataGridView
中的某些内容,并且选择了最后一行(新)而没有在其中输入任何数据,那么当
HasChanged
事件触发时,最后一行将包含在要添加到数据库的行中。然后我得到一个错误,因为由于空值,我无法将该记录放入数据库。我想在那个特殊情况下排除这一行,因为它不应该被视为一个需要添加的行。以下是我目前的代码:

    For Each row As DataGridViewRow In Grid.Rows
        If Not row.IsNewRow Then
            Dim cellValue As String = String.Empty
            For i = 1 To row.Cells.Count - 1
                cellValue = row.Cells(i).Value.ToString
                If String.IsNullOrEmpty(cellValue) Then
                    MsgBox("All fields has to be filled out")
                    Exit Sub
                End If
            Next
        End If
    Next

    marke.MakeChangesDS()

Public Sub MakeChangesDataSet() Implements IDAL.MakeChangesDataSet
    If Not GetGeschaftDataSet.HasChanges Then
        MessageBox.Show("No changes to be done", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    Else
        Dim i As Integer
        Try
            Using MyConnection = New SqlConnection(strcon)
                Using cmd As New SqlCommand("SELECT * FROM T_Marke", MyConnection)
                    MyConnection.Open()
                    ' Create a data adapter in the method and throw it away afterwards
                    Using GetProjectsDataAdapter = New SqlDataAdapter(cmd)
                        Dim cmdbuilder As New SqlCommandBuilder(GetProjectsDataAdapter)
                        i = GetProjectsDataAdapter.Update(GetGeschaftDataSet, "trial1")
                    End Using
                End Using
            End Using
            MessageBox.Show("Updated" & i & " marks", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End If
End Sub

我想我应该在MakeChangesDataSet函数中检查并排除它。

SqlDataAdapter类有一个名为的事件处理程序,允许您检查行是否有效,如果您选择这样做,则取消该行的更新

.....
Using GetProjectsDataAdapter = New SqlDataAdapter(cmd)
   Dim cmdbuilder As New SqlCommandBuilder(GetProjectsDataAdapter)
   AddHandler GetProjectsDataAdapter.RowUpdating, AddressOf onUpdate
   i = GetProjectsDataAdapter.Update(GetGeschaftDataSet, "trial1")
   RemoveHandler GetProjectsDataAdapter.RowUpdating, AddressOf onUpdate
End Using
对于实际更新/插入/删除之前需要更新的每一行,都会调用此事件。事件处理程序代码接收决定如何处理数据所需的所有信息。您将获得
StatementType
,它告诉您这是插入、更新还是删除操作。然后,在数据库引擎引发任何异常之前,您可以决定如何使用行设置
sqlrowupdateingeventargs.Status

Sub OnUpdate(sender as Object, args As SqlRowUpdatingEventArgs)
     If args.StatementType = StatementType.Insert Then
        if Not IsYourRowValid(args.Row) Then
           args.Status = UpdateStatus.SkipThisRow
        End If
    End If
End Sub

SqlDataAdapter类有一个名为的事件处理程序,允许您检查行是否有效,如果您选择这样做,则取消该行的更新

.....
Using GetProjectsDataAdapter = New SqlDataAdapter(cmd)
   Dim cmdbuilder As New SqlCommandBuilder(GetProjectsDataAdapter)
   AddHandler GetProjectsDataAdapter.RowUpdating, AddressOf onUpdate
   i = GetProjectsDataAdapter.Update(GetGeschaftDataSet, "trial1")
   RemoveHandler GetProjectsDataAdapter.RowUpdating, AddressOf onUpdate
End Using
对于实际更新/插入/删除之前需要更新的每一行,都会调用此事件。事件处理程序代码接收决定如何处理数据所需的所有信息。您将获得
StatementType
,它告诉您这是插入、更新还是删除操作。然后,在数据库引擎引发任何异常之前,您可以决定如何使用行设置
sqlrowupdateingeventargs.Status

Sub OnUpdate(sender as Object, args As SqlRowUpdatingEventArgs)
     If args.StatementType = StatementType.Insert Then
        if Not IsYourRowValid(args.Row) Then
           args.Status = UpdateStatus.SkipThisRow
        End If
    End If
End Sub