如何在运行时将 rowstate 属性设置为已删除?

Posted

技术标签:

【中文标题】如何在运行时将 rowstate 属性设置为已删除?【英文标题】:How do I set rowstate property to Deleted at Runtime? 【发布时间】:2014-10-29 13:26:21 【问题描述】:

我需要在运行时设置rowstate属性为deleted,需要修改rowstate Modified为Deleted。

据我所知,row.Delete() 方法调用将行状态更改为已删除,但它也删除了行。

这里我只想将行状态更改为已删除,但不应删除数据行:

示例代码:

 Delete delete = new Delete()
                  .from("tb_lib_report_package_link")
                  .where()
                          .add().criteria("lib_report_id  = :pLibReportId ")
                          .and().criteria("package_Id  IN (" + packageLink + ")")
                  .endWhere();
            drow.AcceptChanges();
            drow.Delete();

            DataRow[] dra = new DataRow[]  drow ;

             DbAccessManager accessManager = DbAccessFactory.GetDatabaseAccess(DatabaseType.Oracle, "Data Source=SRV",
                                                                              "DEV", "dev", this.AppCookieData["UserId"]);
            accessManager.ClientId = this.AppCookieData["UserId"];
            DbConnection cn = accessManager.CreateConnection();
            delete.ParameterSetter = new ParameterSetter((builder, param, index) =>
            
                switch (builder.GetColumnName(param))
                
                    case "pLibReportId":
                        param.DbType = this.ServerCfgReader.DefaultDBProvider.DBDataAccess.GetDbType(drow["LIB_REPORT_ID"].GetType());
                        param.Value = drow["LIB_REPORT_ID"];
                        break;
                    default:
                        throw new NotImplementedException();
                
            );
            accessManager.Delete(delete, dra, cn);

在此我收到“无法通过该行访问已删除的行信息”的异常。

【问题讨论】:

这样做有什么好处?你想在这里达到什么目的?还显示您当前拥有的一些代码。 看到这里我只想在运行时将行状态修改为删除。目前我有一个 DataRow,其中行状态已修改,并且基于修改后的行状态,我需要在我的框架中调用 Delete 方法,但框架只处理 Delete 函数中的 Deleted Row 状态。 如果您不调用AcceptChanges,“它也会删除行”是什么意思,它仍保留在数据表中,如果您在变量中有对它的引用,那么您仍然可以通过它关于并访问它的行状态。 在运行时我只有 DataRow,当我在 datarow 上调用 Delete() 方法并稍后使用相同的 datarow 时,它抛出异常“'drow.ItemArray' 抛出了类型为“系统”的异常.Data.DeletedRowInaccessibleException" 这是我在 datarow 上调用 delete 方法后得到的。已删除的行信息无法通过该行访问。 【参考方案1】:

来自MSDN:

在您对某个对象使用 Delete 方法后,RowState 变为 Deleted 现有的数据行。在您调用 AcceptChanges 之前,它一直处于已删除状态。在 这一次,DataRow 已从表中删除。

所以只需调用Delete 直到AcceptChanges 行状态将是Deleted,但行本身不会从数据表中删除。注意:如果您要删除状态为Added 的数据行 - 调用Delete 后,它将立即从数据表中删除

更新

您可以像这样访问已删除的行数据:

var dt = new DataTable();
dt.Columns.Add("ID", typeof (long));
dt.Columns.Add("Name", typeof (string));

dt.Rows.Add(1, "xxx");
dt.Rows.Add(2, "yyy");

dt.AcceptChanges(); // now both rows are in 'Unchanged' state

dt.Rows[1].Delete(); // second row now in 'Deleted' state

foreach (DataRow dro in dt.Rows)

    if (dro.RowState == DataRowState.Deleted)
        // accessing deleted row
        Console.WriteLine("Deleted row: ID=0, Name=1", dro["ID", DataRowVersion.Original], dro["Name", DataRowVersion.Original]);
    else
        // accessing row as usual
       Console.WriteLine("Row: ID=0, Name=1", dro["ID"], dro["Name"]);


//putting into another array changes nothing in the manner of acessing deleted row
DataRow[] dra = new DataRow[] dt.Rows[1];
Console.WriteLine("Deleted row from another array: ID=0", dra[0]["ID", DataRowVersion.Original]);

【讨论】:

Andy 感谢您的建议,但是当我在 Datarow 上调用 Delete 时,当我传递相同的 datarow 时,它会抛出异常,因为它不包含数据。 检查我上面发布的示例代码。请建议我在此缺少什么。 正如我所说,您可以使用 DataRowVersion.Original 修饰符来添加 DataRow 的字段。所以你应该以drow["LIB_REPORT_ID", DataRowVersion.Original] 访问你的卓尔精灵,然后在accessManager.Delete 中你应该以同样的方式访问dra 的元素,而不是ItemArray 它在 dra Item 数组中添加 Null 行。卓尔.删除(); DataRow[] dra = new DataRow[] drow["LIB_REPORT_ID", DataRowVersion.Original] as DataRow ; 调用 drow.Delete(); drow 删除了它的数据,当我尝试访问 drow["LIB_REPORT_ID", DataRowVersion.Original] 它返回空数据行。【参考方案2】:

不,你当然不能那样做。每DocumentationRowState被定义为只读属性(只有getter)之类的

public DataRowState RowState  get; 

【讨论】:

在这种情况下,RowState 是只读的这一事实并不重要。因为有SetAddedSetModifiedAcceptChanges 方法正在修改这个属性。甚至 Delete 直到 AcceptChanges 都会将 RowState 设置为 Deleted - 正如 OP 所希望的那样。 这是真的,但我的意思是你不能也不应该为数据行显式设置 RowState 属性,这也没有意义。

以上是关于如何在运行时将 rowstate 属性设置为已删除?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 System.IO.Directory.Delete(string,bool) 仅在 asp.net 站点模拟用户时将文件夹标记为已删除

如何在不更改 RowState 属性的情况下使用 LINQ 从数据库中复制 DataTable

如何在运行时将文本框的文本设置为粗体?

如何在 mongoDB 中将文档标记为已标记/已删除

delphi 如何将属性标记为已弃用?

如何在运行时将值从窗口传递到用户控件?