【问题标题】:How do I set rowstate property to Deleted at Runtime?如何在运行时将 rowstate 属性设置为已删除?
【发布时间】: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 方法后得到的。已删除的行信息无法通过该行访问。

标签: c# asp.net


【解决方案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 属性,这也没有意义。
猜你喜欢
  • 2017-02-16
  • 2011-08-20
  • 2018-11-13
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多