【问题标题】:Updating Datatable but 1st row is not marked as Modified and therefore won't update SQL table更新数据表但第一行未标记为已修改,因此不会更新 SQL 表
【发布时间】:2016-10-12 03:05:11
【问题描述】:

根据史蒂夫的要求在写入数据表之前修改了行状态:

我将以下代码写入数据表,该数据表通过点击表单上的“保存”按钮调用。表中的更改最终通过数据适配器发送到 SQL 数据库,但第一行没有正确保存在数据库中,我发现这是因为第一行的状态在数据表中显示为“未更改”。 我用控制台写入包装了该语句,以查看发生了什么。谁能向我解释为什么在我写信后它没有将第一行标记为已修改?其余的行都可以。

写入数据表的代码:

Console.WriteLine(DateTime.Now.ToString & " *************** New Entry ***************")

'update datetime in the datatable
Dim rowindex As Integer = 0

For Each row As DataRow In dt_PartData.Rows

    If Not row.RowState = DataRowState.Deleted Then

        Console.WriteLine(rowindex.ToString & " Row state Before: " & row.RowState.ToString)
        Console.WriteLine(rowindex.ToString & " Reading Before: " & dt_PartData.rows(rowindex)("LastSaved").ToString)

        dt_PartData.rows(rowindex)("LastSaved") = DateTime.Now.ToString
        Console.WriteLine(rowindex.ToString & " Writing:  " & DateTime.Now.ToString)
        Console.WriteLine(rowindex.ToString & " Reading After:  " & dt_PartData.rows(rowindex)("LastSaved").ToString)
        Console.WriteLine(rowindex.ToString & " Row state After: " & row.RowState.ToString)

    End If

    rowindex = rowindex + 1
Next row

下面的代码是一个被调用的子程序,紧跟在上面的代码之后,就在更新数据库的 SQL 语句之前:

Console.WriteLine(DateTime.Now.ToString & " *************** Saving Entry ***************")

'update datetime in the datatable
Dim rowindex As Integer = 0

For Each row As DataRow In dt_PartData.Rows

    If Not row.RowState = DataRowState.Deleted Then
         Console.WriteLine(rowindex.ToString & ": Row state: " & row.RowState.ToString)
     End If

    rowindex = rowindex + 1
Next row

输出窗口的视图:

10/11/2016 9:44:17 AM *************** New Entry *************** In 10min
0 Row state Before: Unchanged
0 Reading Before: 10/11/2016 7:41:27 AM
0 Writing:  10/11/2016 9:44:30 AM
0 Reading After:  10/11/2016 9:44:30 AM
0 Row state After: Unchanged
1 Row state Before: Unchanged
1 Reading Before: 10/11/2016 9:39:55 AM
1 Writing:  10/11/2016 9:44:30 AM
1 Reading After:  10/11/2016 9:44:30 AM
1 Row state After: Modified
2 Row state Before: Unchanged
2 Reading Before: 10/11/2016 9:39:55 AM
2 Writing:  10/11/2016 9:44:30 AM
2 Reading After:  10/11/2016 9:44:30 AM
2 Row state After: Modified
3 Row state Before: Unchanged
3 Reading Before: 10/11/2016 9:39:55 AM
3 Writing:  10/11/2016 9:44:30 AM
3 Reading After:  10/11/2016 9:44:30 AM
3 Row state After: Modified
4 Row state Before: Unchanged
4 Reading Before: 10/11/2016 9:39:55 AM
4 Writing:  10/11/2016 9:44:30 AM
4 Reading After:  10/11/2016 9:44:30 AM
4 Row state After: Modified
5 Row state Before: Unchanged
5 Reading Before: 10/11/2016 9:39:55 AM
5 Writing:  10/11/2016 9:44:30 AM
5 Reading After:  10/11/2016 9:44:30 AM
5 Row state After: Modified
6 Row state Before: Unchanged
6 Reading Before: 10/11/2016 9:39:55 AM
6 Writing:  10/11/2016 9:44:30 AM
6 Reading After:  10/11/2016 9:44:30 AM
6 Row state After: Modified
7 Row state Before: Unchanged
7 Reading Before: 10/11/2016 9:39:55 AM
7 Writing:  10/11/2016 9:44:30 AM
7 Reading After:  10/11/2016 9:44:30 AM
7 Row state After: Modified
10/11/2016 9:44:30 AM *************** Saving Entry ***************
0: Row state: Unchanged
1: Row state: Modified
2: Row state: Modified
3: Row state: Modified
4: Row state: Modified
5: Row state: Modified
6: Row state: Modified
7: Row state: Modified

提前感谢您的帮助,这个论坛对我帮助很大!

【问题讨论】:

  • 能否在第一个循环中也添加 RowState 的输出?
  • 奇怪,我无法使用在数据表中传播的简单代码来重现此行为
  • 我有一个源自该数据表的数据网格视图。但是我不明白的是,在该循环运行时会发生什么。行明显改变了值,那么状态怎么能不改变呢?在对数据表进行更改之前,我正在更改 datagridview 中的值,但这似乎也是导致问题的原因。

标签: vb.net datatable


【解决方案1】:

我现在可以正常工作了。我找到了两种似乎适用于此的解决方案。

  1. 我仍然不完全了解这对我有什么作用,但我 在这里发现这篇文章与第一行有类似的问题 不在数据表中更新并将其用作 数据网格视图。 Missing Row in Datatable Modified property

所以我在更改数据表之前添加了这行代码:

BindingContext(dt_PartData).EndCurrentEdit()

或者这个:

2。 将 datagridview.DataSource 设置为空,然后对数据表进行更改,然后将 .DataSource 放回数据表。

DataGridViewPartData.DataSource = Nothing

     (make changes to the datatable here)

DataGridViewPartData.DataSource = dt_PartData

【讨论】:

  • 非常感谢!我有同样的问题,第一个修改的 gridview 行(按主键)从未在数据库中更新。我做了类似的修复,因为 DataTable 上的 EndEdit 对我没有影响,而是发送了 BindingSource.EndEdit。 MyBindingSource.EndEdit()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多