<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hopes

    Start Here..

     

    數(shù)據(jù)集 DataRow.RowState 屬性深入分析

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

    數(shù)據(jù)集 DataRow.RowState 屬性深入分析

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

    1. RowState 介紹

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

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

    2. 從不同位置載入 DataRow 后 RowState 的狀態(tài)

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

    b. 如果 DataAdapter.AcceptChangesDuringFill 屬性為 true, 使用 DataAdapter.Fill 方法填充的 DataRow 的 RowState 為 Unchanged, 否則, 為 Added, 默認(rèn) AcceptChangesDuringFill 為 true.
    例如: 默認(rèn)情況下, 從 sql server 數(shù)據(jù)庫讀取的 DataRow, 然后直接使用 DataAdapter 更新的話, 是不會有任何數(shù)據(jù)被修改的, 因?yàn)?nbsp;DataAdapter 不對狀態(tài)為 Unchanged 的 DataRow 執(zhí)行任何操作.

    3. 修改, 更改, 刪除后的 DataRow.RowState 轉(zhuǎn)化

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

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

    c. 如果 DataAdapter.AcceptChangesDuringUpdate 屬性為 true, 使用 DataAdapter.Update 更新后的 DataRow 的狀態(tài)為 Unchanged, 否則, DataRow 的狀態(tài)保持不變, 默認(rèn) AcceptChangesDuringUpdate 為 true.
    默認(rèn)情況下, 狀態(tài)為 Unchanged 說明 DataRow 當(dāng)前的數(shù)據(jù)沒有經(jīng)歷過改變, 你可以認(rèn)為和數(shù)據(jù)庫中的數(shù)據(jù)一致, 但并非都如此.

    d. 對于狀態(tài)為 Unchanged 的 DataRow, 調(diào)用 Delete 方法后狀態(tài)為 Deleted.
    DataAdapter 對狀態(tài)為 Deleted 的 DataRow 執(zhí)行刪除操作, 將數(shù)據(jù)庫等存儲位置的對應(yīng)數(shù)據(jù)刪除.

    e. 對于狀態(tài)為 Added 的 DataRow, 調(diào)用 Delete 方法后狀態(tài)為 Detached.
    Added 狀態(tài)的 DataRow 可能并不存在于數(shù)據(jù)庫等存儲位置, 因此狀態(tài)轉(zhuǎn)化為 Detached 而不是 Deleted,DataAdapter 不會處理狀態(tài)為 Detached 的 DataRow.

    f. 使用 DataTable.Rows.Remove 方法移除 DataRow 后, DataRow 狀態(tài)為 Detached.

    4. 使用 AcceptChanges, RejectChanges, SetAdded, SetModified 方法后 DataRow.RowState 的轉(zhuǎn)化

    a. 狀態(tài)為 Unchanged, Added, Modified 的 DataRow, 使用 DataRow.AcceptChanges 方法, 行狀態(tài)將轉(zhuǎn)化為 Unchanged.
    以上三種狀態(tài)的 DataRow, 其目的相當(dāng)于添加或者修改數(shù)據(jù), 因此接受變化后這些 DataRow 存在于 DataTable 中, 并且狀態(tài)為 Unchanged. 如果這時使用 DataAdapter 更新, 將不會對數(shù)據(jù)庫等存儲位置有任何的影響, 因?yàn)闋顟B(tài)已經(jīng)為 Unchanged, 這本應(yīng)該在 DataAdapter 更新后轉(zhuǎn)化的.

    b. 狀態(tài)為 Deleted 的 DataRow, 使用 DataRow.AcceptChanges 方法, 行狀態(tài)轉(zhuǎn)化為 Detached.
    目的為刪除數(shù)據(jù)的 DataRow, 接受變化后就從 DataTable 中脫離, 因此狀態(tài)變?yōu)?Detached.

    c. 狀態(tài)為 Detached 的 DataRow, 不能使用 DataRow.AcceptChanges 方法.

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

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

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

    5. 使用 ImportRow, Copy 方法后 DataRow.RowState 的轉(zhuǎn)化

    a. 使用 DataTable.ImportRow 方法導(dǎo)入 DataRow 后, 導(dǎo)入的 DataRow 和原 DataRow 的行狀態(tài)一致.
    ImportRow 方法采用復(fù)制的方式導(dǎo)入 DataRow, 狀態(tài)為 Detached 的 DataRow, 無法導(dǎo)入到 DataTable, 但不會產(chǎn)生異常.

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

    6. 訪問不同 RowState 的 DataRow 中的數(shù)據(jù)

    a. 對于狀態(tài)為 Added, Unchanged, Modified 的 DataRow, 可以方便的通過 DataRow[<列名>] 訪問數(shù)據(jù).

    b. 狀態(tài)為 Deleted 的 DataRow 需要使用 DataRow[<列名>, DataRowVersion.Original] 來訪問.
    對于已經(jīng)調(diào)用 Delete 方法的 DataRow, 需要指定訪問數(shù)據(jù)的 Original 版本.

    c. 狀態(tài)為 Detched 的 DataRow, 似乎沒有方法訪問其中的數(shù)據(jù).
    DataRow 已經(jīng)從 DataTable 中移除, 這可能使其中的數(shù)據(jù)無法訪問.

    7. 獲取 DataTable 中不同 RowState 的 DataRow

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

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


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計

    公告

    你好!

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    收藏夾

    C#學(xué)習(xí)

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 九九九精品视频免费| 久久精品国产亚洲av麻豆蜜芽| 国产亚洲午夜精品| 国产精品无码一区二区三区免费| 国产精品亚洲综合久久| 亚洲专区中文字幕| 精品香蕉在线观看免费| 亚洲免费视频网址| 好男人视频在线观看免费看片| 中文字幕精品亚洲无线码二区| 亚洲伊人久久大香线蕉在观| 亚洲网站免费观看| 亚洲日本va在线观看| 午夜dj免费在线观看| 美美女高清毛片视频黄的一免费 | 最近高清中文字幕无吗免费看| 久久久久亚洲AV无码观看| 真人做人试看60分钟免费视频| 亚洲不卡在线观看| 日本二区免费一片黄2019| 日本高清免费中文在线看| 亚洲人成图片小说网站| 黄色一级免费网站| 国产亚洲精品线观看动态图| 久久这里只精品热免费99| 久久亚洲AV无码西西人体| 免费成人在线电影| 亚洲级αV无码毛片久久精品| 无码av免费一区二区三区| 中文字幕亚洲精品无码| 亚洲?V无码成人精品区日韩 | 在线免费视频一区| 国产午夜亚洲精品不卡免下载 | 久久亚洲日韩看片无码| 小小影视日本动漫观看免费| 久久国产一片免费观看| 中文字幕第一页亚洲| 中文字幕乱码免费视频| 亚洲免费无码在线| 亚洲一区二区三区亚瑟| 中文字幕精品亚洲无线码一区应用|