Hopes

          Start Here..

           

          數據集 DataRow.RowState 屬性深入分析

          異常詳細信息: System.Data.DeletedRowInaccessibleException: 不能通過已刪除的行訪問該行的信息。 

          數據集 DataRow.RowState 屬性深入分析

          分類: asp.net2010-08-25 16:26 571人閱讀 評論(2) 收藏 舉報

          1. RowState 介紹

          RowState 是 DataRow 很重要的一個屬性, 表示 DataRow 當前的狀態. RowState 有 Added, Modified, Unchanged, Deleted, Detached 幾種, 分別表示 DataRow 被添加, 修改, 無變化, 刪除, 從表中脫離. 在調用一些方法或者進行某些操作之后, 這些狀態可以相互轉化.

          DataAdapter 可以根據 RowState 來決定如何影響數據庫等存儲位置. 如果 DataRow 的狀態為 Added, DataAdapter將把 DataRow 添加到數據庫等存儲位置, 對于 Modified, Deleted 則將執行更新和刪除操作. 其實, 最終的操作效果還是決定于 DataAdapter 的 SelectCommand, UpdateCommand 等 DbCommand. 如果, 在 UpdateCommand 中寫入 Delete 語句或者執行有刪除操作的存儲過程, 那么狀態為 Modified 的 DataRow 最終將在數據庫中刪除而不是更新. (注: 下文中所說的 DataAdapter 操作均如此.)

          2. 從不同位置載入 DataRow 后 RowState 的狀態

          a. 從 xml 文件或者使用 DataTable.Rows.Add(params object[]) 方法添加的 DataRow 的 RowState 為 Added.
          使用上面方式增加的 DataRow, 如果使用 DataAdapter 更新, 將執行 insert 操作, 例如: 添加到 sql server 數據庫中.

          b. 如果 DataAdapter.AcceptChangesDuringFill 屬性為 true, 使用 DataAdapter.Fill 方法填充的 DataRow 的 RowState 為 Unchanged, 否則, 為 Added, 默認 AcceptChangesDuringFill 為 true.
          例如: 默認情況下, 從 sql server 數據庫讀取的 DataRow, 然后直接使用 DataAdapter 更新的話, 是不會有任何數據被修改的, 因為 DataAdapter 不對狀態為 Unchanged 的 DataRow 執行任何操作.

          3. 修改, 更改, 刪除后的 DataRow.RowState 轉化

          a. 對于狀態為 Unchanged 或者 Modified 的 DataRow, 修改數據后的狀態為 Modified.
          這表示 DataRow 需要將自己的數據通過 DataAdapter 更新回數據庫等存儲位置. 因為, DataRow 中的數據可能已經和自己先前的版本不同.

          b. 對于狀態為 Added 的 DataRow, 修改數據后仍然為 Added.
          DataAdapter 對狀態為 Added 的 DataRow 將執行添加操作. 很明顯, 即使修改 DataRow 仍然應該保持狀態為 Added, 否則無法在 DataAdapter 更新的時候被添加到數據庫等存儲位置.

          c. 如果 DataAdapter.AcceptChangesDuringUpdate 屬性為 true, 使用 DataAdapter.Update 更新后的 DataRow 的狀態為 Unchanged, 否則, DataRow 的狀態保持不變, 默認 AcceptChangesDuringUpdate 為 true.
          默認情況下, 狀態為 Unchanged 說明 DataRow 當前的數據沒有經歷過改變, 你可以認為和數據庫中的數據一致, 但并非都如此.

          d. 對于狀態為 Unchanged 的 DataRow, 調用 Delete 方法后狀態為 Deleted.
          DataAdapter 對狀態為 Deleted 的 DataRow 執行刪除操作, 將數據庫等存儲位置的對應數據刪除.

          e. 對于狀態為 Added 的 DataRow, 調用 Delete 方法后狀態為 Detached.
          Added 狀態的 DataRow 可能并不存在于數據庫等存儲位置, 因此狀態轉化為 Detached 而不是 Deleted,DataAdapter 不會處理狀態為 Detached 的 DataRow.

          f. 使用 DataTable.Rows.Remove 方法移除 DataRow 后, DataRow 狀態為 Detached.

          4. 使用 AcceptChanges, RejectChanges, SetAdded, SetModified 方法后 DataRow.RowState 的轉化

          a. 狀態為 Unchanged, Added, Modified 的 DataRow, 使用 DataRow.AcceptChanges 方法, 行狀態將轉化為 Unchanged.
          以上三種狀態的 DataRow, 其目的相當于添加或者修改數據, 因此接受變化后這些 DataRow 存在于 DataTable 中, 并且狀態為 Unchanged. 如果這時使用 DataAdapter 更新, 將不會對數據庫等存儲位置有任何的影響, 因為狀態已經為 Unchanged, 這本應該在 DataAdapter 更新后轉化的.

          b. 狀態為 Deleted 的 DataRow, 使用 DataRow.AcceptChanges 方法, 行狀態轉化為 Detached.
          目的為刪除數據的 DataRow, 接受變化后就從 DataTable 中脫離, 因此狀態變為 Detached.

          c. 狀態為 Detached 的 DataRow, 不能使用 DataRow.AcceptChanges 方法.

          d. 狀態為 Unchanged, Modified, Deleted 的 DataRow, 使用 DataRow.RejectChanges 方法, 行狀態將轉化為 Unchanged.
          以上三種狀態的 DataRow, 其目的相當于刪除或者修改數據, 因此拒絕變化后這些 DataRow 存在于 DataTable 中, 并且狀態為 Unchanged. 如果這時使用 DataAdapter 更新, 其情況將類似于 a.

          e. 狀態為 Added, Detached 的 DataRow, 使用 DataRow.RejectChanges 方法, 行狀態將轉化為 Detached.
          狀態為 Added 的 DataRow 目的在于添加, 因此拒絕后從 DataTable 脫離, 狀態為 Detached.

          f. 對狀態為 Unchanged 的 DataRow, 可以使用 DataRow.SetAdded, DataRow.SetModified 方法使行狀態轉化為 Added 或者 Modified.
          SetAdded, SetModified 方法對狀態不是 Unchanged 的 DataRow 使用將拋出異常.

          5. 使用 ImportRow, Copy 方法后 DataRow.RowState 的轉化

          a. 使用 DataTable.ImportRow 方法導入 DataRow 后, 導入的 DataRow 和原 DataRow 的行狀態一致.
          ImportRow 方法采用復制的方式導入 DataRow, 狀態為 Detached 的 DataRow, 無法導入到 DataTable, 但不會產生異常.

          b. 使用 DataTable.Copy 或者 DataSet.Copy 方法, DataRow 的狀態保持不變.

          6. 訪問不同 RowState 的 DataRow 中的數據

          a. 對于狀態為 Added, Unchanged, Modified 的 DataRow, 可以方便的通過 DataRow[<列名>] 訪問數據.

          b. 狀態為 Deleted 的 DataRow 需要使用 DataRow[<列名>, DataRowVersion.Original] 來訪問.
          對于已經調用 Delete 方法的 DataRow, 需要指定訪問數據的 Original 版本.

          c. 狀態為 Detched 的 DataRow, 似乎沒有方法訪問其中的數據.
          DataRow 已經從 DataTable 中移除, 這可能使其中的數據無法訪問.

          7. 獲取 DataTable 中不同 RowState 的 DataRow

          a. 可以通過 DataTable.GetChanges(DataRowState) 得到 DataTable 中不同 RowState 的 DataRow 的副本.
          GetChanges 方法將返回一個新的 DataTable, 其中包含了指定行狀態的 DataRow 的副本, 修改這些副本不會影響原DataTable 中的 DataRow. 如果使用不帶參數的 GetChanges 方法將返回包含行狀態為 Added, Modified, Deleted 的DataRow 副本的 DataTable. 可以使用位或運算符 | 組合獲取多種狀態的 DataRow. 另外, 狀態為 Detached 的DataRow 似乎是無法通過 GetChanges 方法獲取的.

          分享到: 
        1. 上一篇:C# 策略模式
        2. 下一篇:事件傳值
        3. posted on 2012-08-02 16:54 ** 閱讀(1245) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學習

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 施秉县| 永德县| 咸丰县| 北海市| 九龙城区| 东乡县| 两当县| 容城县| 孝感市| 泸州市| 青铜峡市| 乐都县| 密云县| 九台市| 南平市| 凌源市| 鄯善县| 浦东新区| 泰兴市| 尉犁县| 井冈山市| 呼玛县| 鄯善县| 梁山县| 武川县| 申扎县| 黑龙江省| 旬阳县| 祁门县| 金沙县| 武乡县| 江陵县| 平遥县| 文成县| 绥德县| 岐山县| 芷江| 巴楚县| 延吉市| 舞钢市| 全州县|