“不 能通过已删除的行访问该行的信息。”错误原因

[ 2013-09-09 10:56:14 | 作者: admin ]
字号: | |
用 DataTable.Rows[i].Delete(); 删除后,然后循环读取datatable,结果还能遍历到原来的行,错误提示“不能通过已删除的行访问该行的信息。”

查阅资料才知道 Delete() 删除后 仅标记行状态为Deleted,并没有真正删除。确认改变需要再次调用RejectChanges()方法。

如果要彻底删除datarow,需要Delete()和AccepteChanges()方法同时使用,或者采用 datatable.Rows.RemoveAt(i)方法直接删除,其中i表示行索引,还有一个就是 datatable.Rows.Remove(DataRow dr)删除指定行。使用datatable.Rows.RemoveAt(i)要注意,如果连续使用 datatable.Rows.RemoveAt(0);datatable.Rows.RemoveAt(1);这时并不是删除了原表中的0,1行,而是删除0行后,原来的1行就变成了0行,所以datatable.Rows.RemoveAt(1)实际删除的是原表的2行。若要删除多行,可以连续用Delete(),然后采用DataTable.AccepteChanges()方法确认删除。
范例:
   DataRow dr= dt.Rows[i];
if(dr.RowState !=DataRowState.Deleted){...}

===================================================
C#中的DataTable怎么获取已删除行的信息
C#的DataTable的行有几种状态:
Added:表示行已添加到DataRowCollection,尚未调用DataTable.AcceptChange()
Modified:表示行已被修改,尚未调用DataTable.AcceptChange()
Deleted:表示行已被删除,
Unchanged:自上次调用AcceptChange()之后没有更改的行.
Detached:行虽然创建,但没有放到DataRowCollection中.
 
有时候,要获取到客户端表格的删除行,然后再提交到数据库更新.但是如果直接这样访问:
DataTable dtDeleted = dt.GetChanges(DataRowState.Deleted);
string id=dtDeleted.Rows[0]["id"].ToString();
会出现DeletedRowInaccessibleException异常:不能通过已删除的行访问该行的信息.
 
怎么办呢?其实可以Rows的另一个重载索引器来访问:
string id=dtDeleted.Rows[0]["id",DataRowVersion.Original].ToString();
 
DataRowVersion.Original表示的是该行的原始值
[最后修改由 admin, 于 2013-09-09 10:59:53]
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2125

这篇日志没有评论。

此日志不可发表评论。