2014-10-29 53 views
1

我需要在运行时将rowstate属性设置为删除,需要将rowstate修改为已删除。如何在运行时将rowstate属性设置为Deleted?

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

在这里,我只是想改变的RowState来删除,但数据行不应该被删除:

示例代码:

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); 

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

+1

会是什么这样做的好处是什么?你想在这里做什么?也显示你目前的一些代码。 – 2014-10-29 13:28:38

+0

请参阅此处我只是想将rowstate修改为在运行时删除。目前我有一个DataRow哪个rowstate被修改,并基于修改后的rowstate我需要在我的框架中调用Delete方法,但框架只处理Delete函数中的Deleted Row状态。 – Jack 2014-10-29 13:31:00

+0

如果你不调用AcceptChanges它仍然在数据表中,并且如果你在变量中有一个对它的引用,那么你仍然可以通过它来访问它的行状态,这是什么意思。 – 2014-10-29 13:34:54

回答

1

不,你当然不能那样做。每DocumentationRowState被定义为只读属性(仅一个getter具有)等

public DataRowState RowState { get; } 
+0

RowState只读的事实在这种情况下无关紧要。因为有'SetAdded'和'SetModified','AcceptChanges'方法正在修改这个属性。甚至'Delete'直到'AcceptChanges'都会将RowState设置为'Deleted' - 就像OP想要的一样。 – 2014-10-29 13:40:09

+0

这是真的,但我的意思是你不能也不应该明确地为数据行设置'RowState'属性,这也没有意义。 – Rahul 2014-10-29 14:48:05

3

如从MSDN

使用上的 现有的DataRow Delete方法后的RowState变得删除。在您致电AcceptChanges之前它一直保持已删除状态。这次在 处,DataRow从表中删除。

所以就叫Delete直到AcceptChanges的RowState将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]); 
+0

Andy感谢您的建议,但是当我在Datarow上调用Delete时,稍后当我传递相同的数据行时,它将抛出异常,因为它不包含数据。 – Jack 2014-10-29 13:39:20

+0

@Jack查看我的答案更新。 – 2014-10-29 13:54:47

+0

检查我上面张贴的示例代码。请建议我在这里失踪。 – Jack 2014-10-29 13:56:38