从DataGridView更新数据库

时间:2016-02-15 11:12:52

标签: sql-server vb.net datagridview datatable

我有一个datagrid视图,用于加载数据表中的数据

此数据表中填充了SQL Server数据库中的数据

当用户加载发票时,我会从此数据表填充数据网格视图

然后我允许用户修改发票,这将包括添加/编辑/删除数据表中的行

当用户按下保存按钮时,该数据表将更新到数据库

我需要一种检测行状态的方法,以便正确更新数据库

我可以添加一行没有问题

但是,用户尝试删除从数据库中提取的行,并将其从数据表中删除,但不会将其从数据库中删除

此外,我需要允许用户添加一行,然后删除它,而不存在数据库中存在的行

以下是我目前使用的代码

Dim boolAdded As Boolean = False
Dim boolDeleted As Boolean = False
Dim boolChanged As Boolean = False
Dim cB As SqlCommandBuilder = New SqlCommandBuilder(SQLAdaptor)

Con.ConnectionString = CropTrackMod.strConn
SQLAdaptor.SelectCommand = New SqlClient.SqlCommand("Select * FROM TicketDetailv2 where ticketref ='" & strEditTicketRef & "'", Con)

For Each row As DataRow In myTable.Rows
    If row.RowState = DataRowState.Added Then
        boolAdded = True
    End If
    If row.RowState = DataRowState.Deleted Then
        boolDeleted = True
    End If
    If row.RowState = DataRowState.Modified Then
        boolChanged = True
    End If
Next

If boolAdded = True Then
    Dim tmpAddedMyTable As DataTable = myTable.GetChanges(DataRowState.Added)


    If tmpAddedMyTable.Rows.Count >= 0 Then
        For Each row As DataRow In tmpAddedMyTable.Rows
            row.Item("TicketRef") = strEditTicketRef
        Next

        SQLAdaptor.InsertCommand = cB.GetInsertCommand
        SQLAdaptor.Update(tmpAddedMyTable)
    End If
End If

If boolChanged = True Then
    Dim tmpChangedMyTable As DataTable = myTable.GetChanges(DataRowState.Modified)

    SQLAdaptor.InsertCommand = cB.GetUpdateCommand
    SQLAdaptor.Update(tmpChangedMyTable)
End If

If boolDeleted = True Then
    Dim tmpDeletedMyTable As DataTable = myTable.GetChanges(DataRowState.Deleted)
    SQLAdaptor.InsertCommand = cB.GetDeleteCommand
    SQLAdaptor.Update(tmpDeletedMyTable)
End If

任何帮助将不胜感激

先谢谢你们

1 个答案:

答案 0 :(得分:1)

我现在已经修复了我的方式错误

问题是由于我正在从dataTable中删除这行

myTable.Rows.RemoveAt(dgvTicketDetail.CurrentCell.RowIndex)

但是如果我删除这样的行就可以了

myTable.Rows(dgvTicketDetail.CurrentCell.RowIndex).Delete()

这是有效的,因为它会在更新发生之前将行标记为删除。

我在迭代表中的行时必须改进逻辑,以便不包括已删除的行。这是通过以下方式实现的:

for each row as datarow in myTable.rows
if not row.rowstate = datarowstate.deleted then

end if
next