首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ADO.NET Dataset中维护DataRowState - RejectChanges()方法不起作用吗?

在ADO.NET Dataset中维护DataRowState - RejectChanges()方法不起作用吗?
EN

Stack Overflow用户
提问于 2009-08-06 02:25:48
回答 2查看 1.4K关注 0票数 1

问题被简化了:

我有一个DataSet,里面有一些数据表。我有一个绑定到其中一个数据表的Winforms DataGrid。用户通过DataGrid将一些行插入到数据表中,比如说3行;

这三行现在都有了它们的RowState = DataRowState.Added。

我现在开始一个sqlserver事务。

然后调用dataAdapter1.Update(dataSet1)将行更新到SqlServer中。第一行..好的,第二行..好的,第三行..sqlserver级别的错误(根据设计,我强制使用了唯一索引)

在检测到此错误时,我回滚sqlserver事务。

我还尝试使用Dataset1.RejectChanges()和/或Datatable1.RejectChanges()“回滚”datatable / dataset更改。

问题是这两个.RejectChanges()的工作方式都不是我设想的那样。我的数据表现在有两行(row1,row2),它的RowState = DataRowState.Unchanged;row3完全消失了。

我希望在回滚sqlserver事务时,datatable中的所有3行在调用dataAdapter1.Update()方法之前保持相同的状态。

(原因是用户可以查看绑定的DataGrid中的错误,采取纠正措施,然后再次尝试更新)。

有没有人有主意?也就是说,我正在寻找一些相当于在ADO dataTable级别回滚状态的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-06 06:30:14

好的,所以我想出了一种方法来解决这个问题。

获取原始数据表的克隆,并更新该克隆。

如果发生错误,您仍然拥有原始数据表及其原始DataRowState;此外,您可以将克隆中发生的任何错误复制到原始数据表中,从而将这些错误反映在数据网格中以供用户查看。

如果更新成功,您只需使用克隆刷新原始datatable。

VB代码:

代码语言:javascript
运行
复制
Try
    'daMyAdapter.Update(dsDataset, "MyDatatable") <-- replace original with below lines.
    _dtMyDatatableClone = dsDataset.MyDatatable.Copy()

    If _dtMyDatatableClone IsNot Nothing Then
      daMyAdapter.Update(_dtMyDatatableClone)

       'if you get here, update was successul - refresh now!
       dsDataset.MyDatatable.Clear()
       dsDataset.MyDatatable.Merge(_dtMyDatatableClone, False, MissingSchemaAction.Ignore)
    End If
Catch
    'uh oh, put error handler here.
End Try
票数 0
EN

Stack Overflow用户

发布于 2012-01-28 03:13:51

我在尝试回滚对绑定到Xceed DataGrid的DataTable的更改时遇到了类似的问题。在DataGrid中进行编辑后,编辑后的所有值都将成为数据行的Current状态的一部分。RejectChanges仅适用于防止建议的行状态变为当前状态。

为了恢复给定行的更改,我编写了一个用原始版本覆盖当前行版本的方法。为了将某个版本设置为原始数据表,只需在上调用AcceptChanges()即可。

代码语言:javascript
运行
复制
    public static void RevertToOriginalValues(DataRow row)
    {
        if (row.HasVersion(DataRowVersion.Original) && row.HasVersion(DataRowVersion.Current))
        {
            for (int colIndex = 0; colIndex < row.ItemArray.Length; colIndex++)
            {
                var original = row[colIndex, DataRowVersion.Original];
                row[colIndex] = original;
            }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1236681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档