如何在运行时将 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 是只读的这一事实并不重要。因为有SetAdded
和SetModified
、AcceptChanges
方法正在修改这个属性。甚至 Delete
直到 AcceptChanges
都会将 RowState 设置为 Deleted
- 正如 OP 所希望的那样。
这是真的,但我的意思是你不能也不应该为数据行显式设置 RowState
属性,这也没有意义。以上是关于如何在运行时将 rowstate 属性设置为已删除?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 System.IO.Directory.Delete(string,bool) 仅在 asp.net 站点模拟用户时将文件夹标记为已删除