C#獲得變革過的DataTable記載的完成辦法。本站提示廣大學習愛好者:(C#獲得變革過的DataTable記載的完成辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#獲得變革過的DataTable記載的完成辦法正文
本文實例講述了C#獲得變革過的DataTable記載的完成辦法,是一個異常適用的功效!詳細完成辦法以下:
起首DataTable可以看作是一個物理表的內存式存儲,每個DataRow都有一個屬性叫做RowState。是以隨意率性一行中某一個字段產生轉變,那末全部DataRow的RowState也就產生了轉變。RowState是一個列舉,個中包括5個內容:
1)Detached:未被附加(普通剛創立的DataRow,或許曾經被Remove或許RemoveAt,或許Delete以後挪用過AcceptChanges辦法的行,或許是WinForm控件DataGridView默許設置下最初誰人永久也留出的空行……都被主動設置該狀況)。
2)Added:剛添加的新行。
3)Deleted:剛被刪除的行(留意:這裡只是從內存表中刪除,物理數據表中還沒有刪除,此時你沒法直接去拜訪該行的某個字段的內容!)。
4)Modified:剛被修正的行。
5)Unchanged:本來的行。
DataTable批量經由過程外部遍歷這些行的RowState,然後借助DataAdapter的CRUD辦法依據這些State挪用分歧的語句批量更新到真實數據表中。
假如要撤消可以挪用DataTable的RejectChanges辦法,確認從內存表中刪除才挪用AcceptChanges辦法。
經由過程DataRow的RowState最多只能斷定哪行被修正,那末挪用分歧的語句若何停止更新呢?好比說我要更新一行,確定應用update……where語句,where前面的前提是一個舊值,set是一個新值,若何獲得舊值呢?
.NET中的DataColumn有一個屬性叫做DataRowVersion,這個屬性有4個:
1)Current:以後數值(DataRowState=Deleted時刻有效)。
2)Original:本來數值(DataRowState=Added或許Unchanged時刻有效)。
3)Proposed:建議數值(僅在DataRowState=Detached的時刻有用)。
3)Default:默許數值(DataRowState=Added,Modified或許Unchanged時,等於Current;假如DataRowState=Deleted,等於Original;假如DataRowState=Detached,那末等於Proposed)。該屬性可以主動調劑,你吃禁絕哪一行的屬性,一概可使用這個屬性獲得特定字段的內容。
依據這個軌則,我們再聯合微軟DataTable的GetChanges辦法隨意馬虎可以獲得做了隨意率性變革的源數據和實際數據,詳細C#完成代碼以下:
DataTable dt = new DataTable(); dt.Columns.Add("Id"); for (int i = 1; i < 11; i++) { dt.Rows.Add(i); } dt.AcceptChanges(); //添加第十一行 dt.Rows.Add(11); //修正第二行 dt.Rows[1][0] = 21; //刪除第一行 dt.Rows[0].Delete(); //檢索情形 DataTable cdt = dt.GetChanges(); for (int i = 0; i <cdt.Rows.Count; i++) { if (cdt.Rows[i].RowState == DataRowState.Deleted) { Console.WriteLine("刪除的行索引{0},本來數值是{1}",i,cdt.Rows[i][0,DataRowVersion.Original]); } else if (cdt.Rows[i].RowState == DataRowState.Modified) { Console.WriteLine("修正的行索引{0},本來數值是{1},如今的新數值{2}", i, cdt.Rows[i][0, DataRowVersion.Original],cdt.Rows[i][0,DataRowVersion.Current]); } else if (cdt.Rows[i].RowState == DataRowState.Added) { Console.WriteLine("新添加行索引{0},數值是{1}", i, cdt.Rows[i][0, DataRowVersion.Current]); } }