2014-10-29 73 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