SqlDataAdapter DataSet DataTable 詳解

來源:互聯網
上載者:User

1.SqlDataAdapter調用預存程序

DataSet ds = new DataSet();SqlDataAdapter da = new SqlDataAdapter("GetAllUsers", "server=(local);database=DemoDB;Integrated Security=true;");da.SelectCommand.CommandType = CommandType.StoredProcedure;da.Fill(ds);this.dataGridView1.DataSource = ds.Tables[0];

 

2.高效的填充DataSet

   Fill()方法執行SelectCommand,會使用查詢結果的內容和結構填充資料集中的資料表

   可以通過下列方法提高效能:

   a.DataSet.EnforceConstrains=false

   b.對DataTable對象調用BeginLoadData()方法

3.BeginLoadData()方法提升效能的原因:

      在填充一個資料集前顯示的定義資料結構,資料表,資料列以及資料關聯關係在資料載入

      前已經確定,是資料可以更高效的載入

4.如何顯示的定義一個資料集的資料結構

   a.建立一個類型化的資料集類

 b.以編程的方式建立資料表資料列和資料關聯等 – 或者以編程的方式建立資料表、資料列和資料關聯等對象

5.每個資料行對象都有一個RowState屬性
  – 標識資料集中每一行資料的狀態
  – 狀態的類型
  • DataRowState.Added 該行已經插入到資料集
  • DataRowState.Deleted 該行已經從資料集中刪除
  • DataRowState.Detached 該行已經建立,但未增加到資料集中的DataRowCollection
  • DataRowState.Modified 該行已經更改
  • DataRowState.Unchanged 該行沒有發生任何變化
6.DataSet 跟蹤更改的方式
  每個資料集都對每一行資料維護兩份拷貝
    – 目前的版本DataRowVersion.Current

    if (row.RowState == DataRowState.Added)
      row[ “FieldName ",DataRowVersion.Current ] row[ FieldName ,DataRowVersion.Current]
    – 原始版本 DataRowVersion.Original
    if (row RowState ==DataRowState Deleted) if  (row .RowState== DataRowState.Deleted)
      row[“FieldName",DataRowVersion.Original]
7.資料更新命令
  • 一個SqlDataAdapter 或OleDbDataAdapter 對象都有一些命令對象可以用來更改資料來源的資料
    – InsertCommand
    – UpdateCommand
    – DeleteCommand
  • 文法:對Sql 和OleDb 的資料配接器以及各個命令 q 資料 各個命令對象完全相同
    – public SqlCommand InsertCommand {g et ; set ;} p q {g ; ;}
8.使用CommandBuilder產生命令 使用CommandBuilder產生命令
  • InsertCommand
    – 在資料來源處為表中所有RowState為Added 的行插入一行。插入所有可更新列的值

     (但是不包括標識 運算式或時間戳記等列) 所有可更新列的值(但是不包括標識、運算式或時間戳記等列)。
  • UpdateCommand
    – 在資料來源處更新表中所有RowState為Modified 的行。更新所有 在資料來源處更新表中所有RowState為Modified  的行。

      更新所有列的值,不可更新的列除外,例如識別欄位或運算式列。
    – 更新符合以下條件的所有行:資料來源中的列值匹配行的主鍵列值,並且資料來源中的剩餘列匹配行的原始值 。
  • DeleteCommand
    – 在資料來源處刪除表中所有RowState為Deleted  的行。刪除符合以下條件的所有行:列值匹配行的主鍵列值,並且資料來源中的剩餘列匹配行的原始值。

9.使用DataSet 對象的GetChanges 方法的時機
  • 當需要將資料更改傳給由另一個對象使用的另一個類的時候調用GetChanges()方法
  • 使用GetChanges() 方法得到包含該資料集中所有資料更改的資料集的拷貝
    – 從資料被載入開始
    – 從AcceptChanges() 方法最後一次被調用開始
10.將更改合并到一個DataSet 對象

  • 使用Merge()方法合并兩個資料集:一個未經處理資料集以及一個僅包含對未經處理資料集更 始資料集以及 個僅包含對未經處理資料集更改的資料集
    aDataSet Merge( anotherDataSet) aDataSet. Merge ( anotherDataSet)
  • 被合并的兩個資料集要有相同的資料結構
11.使用DataSet 更新資料來源

  • 資料配接器的Update() 方法對指定的資料表中被更新過的每一行調用適當的SQL語句中被更新每行調用句
  • 程式碼範例
    aDataAdapter.Update ( aDataSet, aDataTable) aDataAdapter.Update ( aDataSet,  aDataTable)
12.DataSet 接受資料更改的方式

  • 資料集的A cceptChanges()方法提交自資料被載入或自此次調用起所有該資料集的資料更改
  • 可以對整個資料集調用AcceptChanges() 方法,或者對一個DataTable 對象的一個資料行對象調用

13.發生衝突
  • 非串連環境使用了開放式並發機制
    – 在一步資料操作完成後資料庫鎖立即被釋放
    – 非串連環境使用開放式並發機制保證其他資源對資料庫的同步訪問
    – 保守式並發機制在整個資料操作過程中保持資料庫的鎖
  • 在更新資料庫時會產生資料衝突
    – 另一個應用或服務可能已經更改了資料
  • 例如
    – 刪除已經不存在的行
    – 更新已經被更新的列
14.檢測衝突
  • 資料配接器設定精靈可以產生用來監測衝突的SQL語句
  • 當更新資料庫時
    – 資料更新命令比較資料庫中的當前資料與原始值
    – 任何不同都會拋出一個衝突
15.解決衝突
  • 使用HasErrors屬性來測試錯誤
    – DataSet.HasErrors
    – DataTable.HasErrors
    – DataRow.HasErrors
  • 選擇下列一種策略解決衝突
    – 用資料集中的值覆蓋曾經有過的資料操作
  • 適用於管理員系統用來強制將資料覆蓋資料來源中的資料
    – 保持資料集中衝突行以便後續重新更新資料庫
  • 將衝突的資料儲存在資料集中以便重試
  • “使用開放式並發”選項的預設策略
  • 拒絕衝突的行並在資料集中復原到初始值
    – 拒絕在本機資料集中衝突的資料,將資料復原 拒絕在本機資料集中衝突的資料,將資料復原到從資料庫中載入得到的初始值
    – 對衝突的資料集資料表資料行調用 – 對衝突的資料集、資料表、資料行調用RejectChanges()方法
  • 拒絕衝突的行並從資料庫得到最近的資料
    – 調用資料集的Clear()方法,重新從資料庫中載入資料

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.