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()方法,重新從資料庫中載入資料