DataTable.AcceptChanges的理解
阿新 • • 發佈:2017-05-06
應用程序 data ring apt 刪掉 ptc tar nbsp 通過 OleDbDataAdapter 怎麽更新不了數據庫?
String tbName = ds.Tables[0].TableName;
String tem = ds.Tables[0].Rows[0]["BOMID"].ToString();
DataRow dr = ds.Tables[0].NewRow();
dr["BOMID"] = "104";
dr["Quantity"] = 10;
ds.Tables[0].Rows.Add(dr);
ds.AcceptChanges();
oleAdaper.Update(ds,ds.Tables[0].TableName);//這裏不就是更新數據庫嗎?
刪掉ds.AcceptChanges();就行了。
這是為什麽呢?
oleAdaper.Update :對dataRow 的RowState等於deleted/inserted/updated調用響應的delete等 command進行更新
ds.AcceptChanges():將所有的dataRow的Rowstate更改為unchanged,因此也就沒有任何數據更新
或者更改為
oleAdaper.Update(ds,ds.Tables[0].TableName);//
ds.AcceptChanges();
順序顛倒一下,以便做其他用途
一個DataRow對象剛被創建之後其狀態是Detached,是孤立的一個存在,所以建立了DataRow之後在DataRow中的單元填充了數據後還要通過DataTable.Rows.Add(DataRow)方法將此DataRow添加到DataTable,DataRow添加到DataTable後, 這個DataRow的狀態就轉變為Added。當修改了這個DataRow後,這個DataRow狀態轉為Modified,當用DataRow.Delete()方法刪除DataRow後,DataRow狀態將轉為Deleted,不過此行還存在在DataTable中的,只是狀態改變了,這時用DataTable.Rows.Count查看行數,跟刪除前是一樣的。只有在調用了DataTable.Remove(DataRow)方法後,此DataRow才被從DataTable移除,狀態也回復到Detached孤立狀態。
一旦調用了DataTable.AcceptChanges()方法後,所有的行將根據不同的狀態做不同的處理,Added、Modified、Unchanged將保留當前值,Deleted的行將從DataTable中移除,最後所有的行的狀態都置為Unchanged。當DataTable是從DataAdapter.Fill(DataSet,DataTable)方法填充而形成的,Fill()方法將自動調用AcceptChanges()方法,將DataTable的行狀態都置為Unchanged。並且,如果Fill方法中指定的那個DataTable在要填充的那個DataSet不存在時,會生成一個跟數據源表同樣的結構的DataTable並填充數據
用於從 DataTable 對象中刪除 DataRow 對象的方法有兩種:DataRowCollection 對象的 Remove 方法和 DataRow 對象的 Delete 方法。Remove 方法從 DataRowCollection 中刪除 DataRow,而 Delete 方法只將行標記為刪除。當應用程序調用 AcceptChanges 方法時,才會發生實際的刪除。通過使用 Delete,您可以在實際刪除之前先以編程方式檢查哪些行標記為刪除。如果將行標記為刪除,其 RowState 屬性會設置為 Deleted。
在將 DataSet 或 DataTable 與 DataAdapter 和關系型數據源一起使用時,用 DataRow 的 Delete 方法移除行。Delete 方法只是在 DataSet 或 DataTable 中將行標記為 Deleted,而不會移除它。而 DataAdapter 在遇到標記為 Deleted 的行時,會執行其 DeleteCommand 方法以在數據源中刪除該行。然後,就可以用 AcceptChanges 方法永久移除該行。如果使用 Remove 刪除該行,則該行將從表中完全移除,但 DataAdapter 不會在數據源中刪除該行。
DataTable.AcceptChanges的理解