標籤:log 樣本 dao 特定 覆蓋 bsp 檢測 version lda
1. 配置 DataAdapter 以檢索資訊
1.1. DataAdapter
? 資料配接器是資料集與資料來源互動的橋樑
–使相當於資料來源本地拷貝的資料集可以與資料來源之間進行互動。
? 為資料庫提供的主要兩種資料配接器
– SqlDataAdapter:不經過OLEDB層直接與SQLServer互動,速度較OleDbDataAdapter快。
– OleDbDataAdapter:適用於任何可以用OLEDB資料提供者訪問的資料來源。
1.2. XxxDataAdapter物件模型
? Command 對象
– 通過資料配接器來讀取資料來源資訊的命令對象,並將其儲存在資料配接器的SelectCommand屬性中。
– 通過資料配接器可以將資料集中的改變提交到資料來源的Command對象中,並儲存在資料配接器的InsertCommand、UpdateCommand和
DeleteCommand屬性中。
? DataTableMapping(資料表映射)集合
– DataTableMapping集合儲存了資料集中的表、欄位與資料庫中的表、欄位的映射關係。
? 資料配接器的屬性
– SelectCommand 從資料來源中讀取資料
– InsertCommand 將資料由資料集插入資料來源
– UpdateCommand 將資料集中更新的行寫回資料來源
– DeleteCommand 在資料來源中刪除資料
? 資料配接器的方法
– Fill() 使用由SelectCommand屬性指定的Select語句從資料來源中讀取/更新資料到資料集。
– Update() 對資料集DataTable對象中特定的行調用執行Insert、Delete、Update操作的對應的命令對象。
1.3. 建立使用新SELECT 語句的DataAdapter
? 建立一個執行SELECT語句的資料配接器
–對非串連方式應用以唯讀方式訪問資料。
? 在定義資料配接器時必須指定
–一個用於查詢的SELECT語句
– 一個新的或者已經存在的資料庫連接
1.4. 建立使用現有預存程序的 DataAdapter
? 可以編程建立一個執行預存程序
–為SelectCommand指定一個預存程序。
– 如果需要可以為InsertCommand、UpdateCommand和DeleteCommond指定預存程序。
? 必須指定
– 一個新的或者已經存在的資料庫連接
– 調用的預存程序
2. 使用 DataAdapter 填充 DataSet
2.1. 使用 DataAdapter 填充 DataSet
? 可以使用資料配接器來填充資料集
–調用資料配接器的Fill()方法。
? Fill()方法執行SelectCommand
–使用查詢結果的內容和結構填充資料集中的資料表。
? 可以通過下列方法提高效能
– DataSet.EnforceConstraints=False。
– 對DataTable 對象調用BeginLoadData()方法。
2.2. 高效地填充 Dataset
? 在填充一個資料集前顯式地定義資料結構
– 資料表、資料列以及資料關聯在資料被載入前已經確定。
– 使資料可以被更高效地載入。
? 如何顯式地定義一個資料集的資料結構
– 建立一個類型化的資料集類
dsCustomers.Customers.BeginLoadData();
daCustomers.Fill(dsCustomers.Customers);
dsCustomers.Customers.EndLoadData();
DataGrid1.DataSource = dsCustomers.Customers.DefaultView;
– 或者以編程的方式建立資料表、資料列和資料關聯等。
2.3. 為 DataSet 指定附加約束
? 可以在資料結構未知的情況下填充資料集
– 資料集的資料結構在設計階段未知。
– 在運行時根據得到的資料來確定資料集的資料結構。
– 可以在運行時通過資料配接器控制如何建立並產生資料集的資料結構。
? 使用MissingSchemaAction屬性控制資料結構產生
? 調用FillSchema()方法建立一個新的資料集的資料結構
2.4. 使用多個DataAdapter 填充一個DataSet
? 可以使用多個資料配接器填充一個資料集
–每個資料配接器填充資料集中一個獨立的表。
? 為每一個資料配接器調用Fill()方法
–在資料集中指定填充哪一個表
daCustomers.Fill(dsCustomerOrders.Customers);
daOrders.Fill(dsCustomerOrders.Orders);
DataGrid1.DataSource =
dsCustomerOrders.Customers;
3. 配置DataAdapter 更新後台資料來源
3.1. DataSet 跟蹤更改的方式
? 每個資料行對象都有一個RowState屬性
– 標識資料集中每一行資料的狀態。
– 狀態的類型
? DataRowState.Added 該行已經插入到資料集
? DataRowState.Deleted 該行已經從資料集中刪除
? DataRowState.Detached 該行已經建立,但未增加到資料集中的DataRowCollection
? DataRowState.Modified 該行已經更改
? DataRowState.Unchanged 該行沒有發生任何變化
? 每個資料集都對每一行資料維護兩份拷貝
–目前的版本 DataRowVersion.Current
if (row.RowState == DataRowState.Added)
row[“FieldName",DataRowVersion.Current]
– 原始版本DataRowVersion.Original
if (row.RowState == DataRowState.Deleted)
row[“FieldName",DataRowVersion.Original]
3.2. 資料更新命令
? 一個SqlDataAdapter或OleDbDataAdapter對象都有一些命令對象可以用來更改資料來源的資料
– InsertCommand
– UpdateCommand
– DeleteCommand
? 文法:對Sql和OleDb的資料配接器以及各個命令對象完全相同
– public SqlCommand InsertCommand {get; set;}
3.3. 使用 CommandBuilder 產生命令
? InsertCommand
– 在資料來源處為表中所有RowState 為Added 的行插入一行。插入所有可更新列的值(但是不包括標識、運算式或時間戳記等列)。
? UpdateCommand
– 在資料來源處更新表中所有 RowState 為 Modified 的行。 更新所有列的值,不可更新的列除外,例如識別欄位或運算式列。
– 更新符合以下條件的所有行:資料來源中的列值匹配行的主鍵列值,並且資料來源中的剩餘列匹配行的原始值。
有關更多資訊,請參見本主題後面的“更新和刪除的開放式並行存取模型”。
? DeleteCommand
– 在資料來源處刪除表中所有RowState 為Deleted 的行。刪除符合以下條件的所有行:列值匹配行的主鍵列值,並且資料來源中的
剩餘列匹配行的原始值。
4. 將資料更改儲存到資料來源
4.1. 使用DataSet對象的GetChanges方法的時機
? 當需要將資料更改傳給由另一個對象使用的另一個類的時候調用GetChanges()方法
If dsCustomers.HasChanges(DataRowState.Modified) ThenDim dsTemp As DataSetdsTemp = dsCustomers.GetChanges(DataRowState.Modified)DataGrid1.DataSource = dsTemp.Tables(0).DefaultViewEnd If
? 使用GetChanges()方法得到包含該資料集中所有資料更改的資料集的拷貝
– 從資料被載入開始。
– 從AcceptChanges()方法最後一次被調用開始。
4.2. 將更改合并到一個DataSet對象
? 使用Merge()方法合并兩個資料集:一個未經處理資料集以及一個僅包含對未經處理資料集更改的資料集aDataSet.Merge(anotherDataSet)
? 被合并的兩個資料集要有相同的資料結構
4.3. 使用DataSet更新資料來源
? 資料配接器的Update()方法對指定的資料表中被更新過的每一行調用適當的SQL語句
– INSERT
– UPDATE
– DELETE
? 程式碼範例
aDataAdapter.Update(aDataSet, aDataTable)
4.4. DataSet接受資料更改的方式
? 資料集的AcceptChanges()方法提交自資料被載入或自此次調用起所有該資料集的資料更改
? 可以對整個資料集調用AcceptChanges()方法,或者對一個DataTable 對象的一個資料行對象調用
5. 衝突處理
5.1. 發生衝突
? 非串連環境使用了開放式並發機制
– 在一步資料操作完成後資料庫鎖立即被釋放。
– 非串連環境使用開放式並發機制保證其他資源對資料庫的同步訪問。
– 保守式並發機制在整個資料操作過程中保持資料庫的鎖。
? 在更新資料庫時會產生資料衝突
– 另一個應用或服務可能已經更改了資料
? 例如
– 刪除已經不存在的行
– 更新已經被更新的列
5.2. 檢測衝突
? 資料配接器設定精靈可以產生用來監測衝突的SQL語句
? 當更新資料庫時
–資料更新命令比較資料庫中的當前資料與原始值。
– 任何不同都會拋出一個衝突。
5.3. 解決衝突
? 使用HasErrors屬性來測試錯誤
– DataSet.HasErrors
– DataTable.HasErrors
– DataRow.HasErrors
? 選擇下列一種策略解決衝突
– 用資料集中的值覆蓋曾經有過的資料操作。
? 適用於管理員系統用來強制將資料覆蓋資料來源中的資料
– 保持資料集中衝突行以便後續重新更新資料庫。
? 將衝突的資料儲存在資料集中以便重試
? “使用開放式並發”選項的預設策略
? 拒絕衝突的行並在資料集中復原到初始值
–拒絕在本機資料集中衝突的資料,將資料復原到從資料庫中載入得到的初始值。
–對衝突的資料集、資料表、資料行調用RejectChanges()方法。
? 拒絕衝突的行並從資料庫得到最近的資料
– 調用資料集的Clear()方法,重新從資料庫中載入資料。
ADO.NET 非串連方式進行資料訪問