使用 DataAdapter 執行數據源批量更新

SqlDataAdapter 類

SqlDataAdapterDataSet 和 SQL Server 之間的橋接器,用於檢索和保存數據。 SqlDataAdapter 通過對數據源使用適當的 Transact-SQL 語句映射 Fill(它可更改 DataSet 中的數據以匹配數據源中的數據)和 Update(它可更改數據源中的數據以匹配 DataSet 中的數據)來提供這一橋接。 更新是逐行進行的。 對於每個已插入、修改和刪除的行,Update 方法會確定已對其執行的更改的類型(InsertUpdateDelete)。 根據更改類型,執行 InsertUpdateDelete 命令模板將已修改的行傳播給數據源。 SqlDataAdapter 填充 DataSet 時,它爲返回的數據創建必需的表和列(如果這些表和列尚不存在)。 但是,除非 MissingSchemaAction 屬性設置爲 AddWithKey,否則這個隱式創建的架構中不包括主鍵信息。 也可以使用 FillSchema,讓 SqlDataAdapter 創建 DataSet 的架構,並在用數據填充它之前就將主鍵信息包括進去。

 

DataAdapter 的 Update 方法會循環訪問指定 DataTable 中的行,檢查每個 DataRow,確定是否已修改。如果該行已修改,將根據該行的 RowState 屬性值調用相應的 UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及網絡與數據庫之間的雙向數據傳輸

下面是對RowState的說明:

每個 DataRow 對象都具有 RowState 屬性,您可以檢查此屬性來確定行的當前狀態。下表提供了對每個 RowState 枚舉值的簡短說明。

RowState 值                                                                                說明 
Unchanged                              自上次調用 AcceptChanges 以來或由 DataAdapter.Fill 創建該行以來,沒有進行任何更改。 
Added                                                          已將該行添加到表中,但尚未調用 AcceptChanges。 
Modified                                                                          已更改了行的某個元素。 
Deleted                                                        已從表中刪除該行,並且尚未調用 AcceptChanges。 
Detached       該行不是任何 DataRowCollection 的一部分。新創建的行的 RowState 設置爲 Detached。通過調用 Add 方法將新的DataRow 添加到 DataRowCollection 後,RowState 屬性的值設置爲 Added。將使用 Remove 方法,或使用 Delete 方法接着使用 AcceptChanges 方法從 DataRowCollection 中移除的行也設置爲 Detached。


對 DataSet、DataTable 或 DataRow 調用 AcceptChanges 時,會移除行狀態爲 Deleted 的所有行。剩餘行的行狀態爲 Unchanged,並且 Original 行版本中的值將被 Current 行版本值覆蓋。調用 RejectChanges 時,會移除行狀態爲 Added 的所有行。剩餘行的行狀態爲 Unchanged,並且 Current 行版本中的值將被 Original 行版本值覆蓋。

SqlDataAdapter.UpdateBatchSize 屬性

在 ADO.NET 2.0 中,DataAdapter 公開了 UpdateBatchSize 屬性。將 UpdateBatchSize 設置爲正整數值將使對數據庫的更新以指定大小的批次進行發送。例如,如果將 UpdateBatchSize 設置爲 10,會將 10 個獨立的語句組合在一起並作爲一批提交。將 UpdateBatchSize 設置爲 0 將導致 DataAdapter 使用服務器可以處理的最大批次的大小。如果將其設置爲 1,則禁用批量更新,因爲此時每次發送一行。此操作可以減少到服務器的往返過程數,執行極大規模的批處理會降低性能。 因此,在實現應用程序前應進行測試以得到最佳的批大小。

效果

 0

                          批大小沒有限制。

 1

                            禁用批量更新。

>1 

     一次使用多批 UpdateBatchSize 操作來發送更改。

將此值設置爲 1 之外的值時,與 SqlDataAdapter 關聯的所有命令必須將其 UpdatedRowSource 屬性設置爲 NoneOutputParameters否則將引發異常。如果該值設置爲小於零的數,將引發 ArgumentOutOfRangeException

SqlCommandBuilder 類
SqlDataAdapter 不會自動生成實現 DataSet 的更改與關聯的 SQL Server 實例之間的協調所需的 Transact-SQL 語句。 但是,如果設置了 SqlDataAdapterSelectCommand 屬性,則可以創建一個 SqlCommandBuilder 對象來自動生成用於單表更新的 Transact-SQL 語句。 然後,SqlCommandBuilder 將生成其他任何未設置的 Transact-SQL 語句。 

如果 DataTable 映射到單個數據庫表或從單個數據庫表生成,則可以利用 DbCommandBuilder 對象自動生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。有關更多信息,請參見自動生成命令

SelectCommand 必須至少返回一個主鍵列或唯一的列 如果什麼都沒有返回,就會產生 InvalidOperation 異常,不生成命令。所以用此方法批量更新數據時數據表必須要設置主鍵。

SqlCommandBuilder 還使用由 SelectCommand 引用的 ConnectionCommandTimeoutTransaction 屬性。 如果修改了這些屬性中的一個或多個,或者替換了 SelectCommand 本身,用戶則應調用 RefreshSchema 否則,InsertCommandUpdateCommandDeleteCommand 屬性都保留它們以前的值。

SqlCommandBuilder 對象可以使用以下方法自動獲取更新,插入,刪除操作所需SqlCommand 對象。

 

GetInsertCommand() 獲取自動生成的、對數據庫執行插入操作所需的 SqlCommand 對象。

GetUpdateCommand() 獲取自動生成的、對數據庫執行更新操作所需的 SqlCommand 對象。

GetDeleteCommand() 獲取自動生成的、對數據庫執行刪除操作所需的 SqlCommand 對象。

批量更新數據實例:

   

使用OracleDataAdapter批量更新數據源相關文章:

OracleCommandBuilder 類

Oracle 和 ADO.NET

System.Data.OracleClient 中的類型已過時。 這些類型在 .NET Framework 4 中受到支持,但將在以後的版本中刪除。 Microsoft 建議使用第三方 Oracle 提供程序。

相關文章:

使用 DataAdapter 執行批量更新

使用 DataAdapter 更新數據源

處理與批量更新有關的事件和錯誤

使用DataAdapter更新數據源實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章