Мне нужно установить свойство rowstate для удаления в Runtime необходимо изменить rowstate Modified to Deleted.
Поскольку я знаю, что вызов метода row.Delete() меняет состояние строки на Deleted, но также удаляет строку.
Здесь я просто хочу изменить rowstate на Deleted, но datarow не следует удалять:
Образец кода:
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);
В этом я получаю исключение: "Удаленная информация о строках не может быть доступна через строку".
Как из MSDN:
RowState будет удаляться после использования метода Delete в существующем DataRow. Он остается удаленным, пока вы не вызываете AcceptChanges. В это время DataRow удаляется из таблицы.
Так просто позвонить Delete
и до AcceptChanges
RowState будет Deleted
, но грести сама не будут удалены из DataTable. Примечание: если вы удаляете datarow, состояние которого Added
оно будет удалено из datatable сразу после вызова 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]);
Нет, вы не можете этого сделать. Per Documentation RowState
определяется как свойство только для чтения (имеет только getter
), например
public DataRowState RowState { get; }
SetAdded
и SetModified
, AcceptChanges
методы , которые изменяющие это свойство. И даже Delete
до AcceptChanges
пор, пока AcceptChanges
не установит AcceptChanges
в Deleted
- так, как хочет OP.
RowState
для datarow, и это не имеет смысла.