SqlDataAdapter DataSet DataTable 詳解


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()方法,重新從數據庫中加載數據

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM