问题被简化了:
我有一个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级别回滚状态的东西。
发布于 2009-08-06 06:30:14
好的,所以我想出了一种方法来解决这个问题。
获取原始数据表的克隆,并更新该克隆。
如果发生错误,您仍然拥有原始数据表及其原始DataRowState;此外,您可以将克隆中发生的任何错误复制到原始数据表中,从而将这些错误反映在数据网格中以供用户查看。
如果更新成功,您只需使用克隆刷新原始datatable。
VB代码:
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
发布于 2012-01-28 03:13:51
我在尝试回滚对绑定到Xceed DataGrid的DataTable的更改时遇到了类似的问题。在DataGrid中进行编辑后,编辑后的所有值都将成为数据行的Current状态的一部分。RejectChanges仅适用于防止建议的行状态变为当前状态。
为了恢复给定行的更改,我编写了一个用原始版本覆盖当前行版本的方法。为了将某个版本设置为原始数据表,只需在上调用AcceptChanges()即可。
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;
}
}
}
https://stackoverflow.com/questions/1236681
复制相似问题