Code Bye

不能通过已删除的行访问该行的信息

 

以下代码运行发生异常:
“System.Data.DeletedRowInaccessibleException”类型的未经处理的异常在 System.Data.dll 中发生 

其他信息: 不能通过已删除的行访问该行的信息。

请教了,不是在DataTable.AcceptChanges()以后就可以删除行了么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;

namespace dtcopytest
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            DataColumn Column1 = new DataColumn("ID", typeof(int));
            DataColumn Column2 = new DataColumn("No", typeof(int));
            dt.Columns.Add(Column1 );
            dt.Columns.Add(Column2);
            DataRow Row1 = dt.NewRow();
            Row1[0] = 0;
            Row1[1] = 1;
            DataRow Row2 = dt.NewRow();
            Row2[0] = 4;
            Row2[1] = 3;
            dt.Rows.Add(Row1);
            dt.Rows.Add(Row2);
            dt.AcceptChanges();
            Console.WriteLine("--------dt原始-------");
            for (int i = 0; i < dt.Rows.Count;i++ )
            {
                for(int j=0; j < dt.Columns .Count ;j++)
                {
                    Console.WriteLine(dt.Rows[i][j].ToString ());
                }
            }
            int[,] testStr = new int[4, 2];
            testStr[0, 0] = 0;
            testStr[0, 1] = 1;
            testStr[1, 0] = 2;
            testStr[1, 1] = 3;
            testStr[2, 0] = 4;
            testStr[2, 1] = 5;
            testStr[3, 0] = 6;
            testStr[3, 1] = 7;
            for (int i = 0; i < dt.Rows.Count;i++)
            {
                for (int j = 0; j < testStr.GetLength(0);j++ )
                {
                    if (Convert.ToString(dt.Rows[i][0]) == Convert.ToString(testStr[j,0]))
                    {
                        dt.Rows[i].Delete();
                    }
                }
            }
            dt.AcceptChanges();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    Console.WriteLine(dt.Rows[i][j].ToString());
                }
            }
        }
    }
}

15分
dt.Rows[i].Delete();
break;
断点调试,看 dt.Rows[i].Delete();之后
dt.AcceptChanges();之前,dt.Rows.Count到底变没变

dt.AcceptChanges()到底是干啥用的,怎么到处都乱加dt.AcceptChanges()


5分
   或者 if (dt.Rows[i].RowState!=DataRowState.Deleted && Convert.ToString(dt.Rows[i][0]) == Convert.ToString(testStr[j,0]))
                    
dt 里的row 已经删除一部分了,你再循环获取已删除的 row   肯定出错。
引用 8 楼 ppp520 的回复:
Quote: 引用 4 楼 jun471537173 的回复:

   或者 if (dt.Rows[i].RowState!=DataRowState.Deleted && Convert.ToString(dt.Rows[i][0]) == Convert.ToString(testStr[j,0]))
                    

求教,删除之后没有acceptchanges()不是dt还没有发生改变么?怎么没改变就不能访问了?

acceptchanges之后RowState就不是Deleted了

再来回复一下吧:找到问题了,以后有这种情况的TX可以不用发帖了
以下引用自:
http://blog.csdn.net/xiao_jun_0820/article/details/4357568

当删除DataSet中某个Table里的Row时,只是将该Row的RowState设置成了Deleted,如果你仔细的话,会发现Rows.Count并没有变化,我们仍然可以通过循环找到该删除的行,但找到后,却不能访问该行保存的信息(比如ID字段),因为我们要取到这个假删的ID,然后通过ADO实现真正删除数据库记录.

我用如下方法:

for (int i = 0; i < bugMgrDataSet.UserInfo.Rows.Count; i++)  
            {  
  
                if (bugMgrDataSet.UserInfo.Rows[i].RowState == DataRowState.Deleted)  
                {  
                    userinfo.ID = (int)bugMgrDataSet.UserInfo.Rows[i]["ID"];  
                    userinfobll.Delete(userinfo.ID);  
                      
                }  
  
           }  

会报错:不能通过已删除的行访问该行的信息.

这让我很是郁闷,在网上查询相关资料后,终于找到原因,原来bugMgrDataSet.UserInfo.Rows[i][“ID”]默认是按bugMgrDataSet.UserInfo.Rows[i][“ID”, DataRowVersion.Current]访问的,当前被删除了当然访问不到咯,于是改成bugMgrDataSet.UserInfo.Rows[i][“ID”, DataRowVersion.Original],奇迹出现了,取到ID的值了,原来被删除之后,就变成”过去式”了,要用DataRowVersion.Original来取原来的值.


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明不能通过已删除的行访问该行的信息