熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用DataAdapter執行批量更新

2013-11-13 09:59:14  來源: .NET編程 

  在以前版本的 ADONET 中使用 DataSet 中的更改來更新數據庫時DataAdapter 的 Update 方法每次更新數據庫的一行因為該方法循環訪問指定 DataTable 中的行所以會檢查每個 DataRow確定是否已修改如果該行已修改將根據該行的 RowState 屬性值調用相應的 UpdateCommandInsertCommand 或 DeleteCommand每一次行更新都涉及網絡與數據庫之間的雙向數據傳輸

  在ADONET DataAdapter 公開了UpdateBatchSize 屬性將 UpdateBatchSize 設置為正整數值將使對數據庫的更新以指定大小的批次進行發送例如如果將 UpdateBatchSize 設置為 會將 個獨立的語句組合在一起並作為一批提交將 UpdateBatchSize 設置為 將導致 DataAdapter 使用服務器可以處理的最大批次的大小如果將其設置為 則禁用批量更新因為此時每次發送一行

  執行非常大的批次可能會降低性能因此在實現應用程序之前應測試最佳的批次大小設置

  使用 UpdateBatchSize 屬性

  啟用了批量更新後DataAdapter 的 UpdateCommandInsertCommand 和 DeleteCommand 的 UpdatedRowSource 屬性值應設置為 None 或 OutputParameters在執行批量更新時命令的FirstReturnedRecord 或 Both 的UpdatedRowSource 屬性值無效

  下面的過程演示如何使用 UpdateBatchSize 屬性該過程采用兩個參數一個 DataSet 對象其中包含代表 ProductionProductCategory 表中的ProductCategoryID 和 Name 字段的列一個代表批次大小的整數(批次中的行數)該代碼創建一個新的 SqlDataAdapter 對象設置其 UpdateCommandInsertCommand 和 DeleteCommand 屬性該代碼假定 DataSet 對象已修改了行它設置 UpdateBatchSize 屬性並執行更新

  protected void btnUpdateAddress_Click(object sender EventArgs e)

  {

  SqlDataAdapter EmpAdapter = new SqlDataAdapter();

  DataTable EmpDT = new DataTable();

  SqlConnection DBConSelect = new SqlConnection();

  SqlConnection DBConUpdate = new SqlConnection();

  SqlCommand SelectCommand = new SqlCommand();

  SqlCommand UpdateCommand = new SqlCommand();

  // Using different connection objects for select and updates from the

  // Northwind database

  DBConSelectConnectionString =

  ConfigurationManagerConnectionStrings[DSN_NorthWind]ConnectionString;

  DBConUpdateConnectionString =

  ConfigurationManagerConnectionStrings[DSN_NorthWind]ConnectionString;

  // Reading all records from the Employees table

  SelectCommandCommandText = SELECT top * FROM EMPLOYEES;

  SelectCommandCommandType = CommandTypeText;

  SelectCommandConnection = DBConSelect;

  UpdateCommandCommandText = UPDATE EMPLOYEES SET Address=@Address +

  City=@City Region=@Region Country=@Country;

  UpdateCommandCommandType = CommandTypeText;

  UpdateCommandConnection = DBConUpdate;

  SqlParameter AddressParam;

  AddressParam = new SqlParameter(@Address

  SqlDbTypeVarChar Address);

  SqlParameter CityParam;

  CityParam = new SqlParameter(@City SqlDbTypeVarChar City);

  SqlParameter RegionParam;

  RegionParam = new SqlParameter(@Region SqlDbTypeVarChar Region);

  SqlParameter CountryParam;

  CountryParam = new SqlParameter(@Country

  SqlDbTypeVarChar Country);

  UpdateCommandParametersAdd(AddressParam);

  UpdateCommandParametersAdd(CityParam);

  UpdateCommandParametersAdd(RegionParam);

  UpdateCommandParametersAdd(CountryParam);

  // Setting up Data Adapter with the Select and Update Commands

  // The Select command will be used to retrieve all employee

  // information from the Northwind database and the Update command

  // will be used to save changes back to the database

  EmpAdapterSelectCommand = SelectCommand;

  EmpAdapterUpdateCommand = UpdateCommand;

  EmpAdapterFill(EmpDT);

  DBConSelectClose();

  // Looping through all employee records and assigning them the new

  // address

  foreach (DataRow DR in EmpDTRows)

  {

  DR[Address] = W th Street Suite ;

  DR[City] = Edina;

  DR[Region] = Minnesota;

  DR[Country] = USA;

  }

  // Adding an event handler to listen to the RowUpdated event

  // This event will will fire after each batch is executed

  EmpAdapterRowUpdated +=  new SqlRowUpdatedEventHandler(OnRowUpdated);

  lblCounterText = ;

  EmpAdapterUpdateBatchSize = ;

  // It is important to set this property for batch processing of

  // updated records since batch updates are incapable of

  // updating the source with changes from the database

  UpdateCommandUpdatedRowSource = UpdateRowSourceNone;

  try

  {

  DBConUpdateOpen();

  EmpAdapterUpdate(EmpDT);

  }

  catch (Exception ex)

  {

  lblCounterText += exMessage + <Br>;

  }

  finally

  {

  if (DBConUpdateState == ConnectionStateOpen)

  {

  DBConUpdateClose();

  }

  }

  }

  private void OnRowUpdated(object sender SqlRowUpdatedEventArgs args)

  {

  lblCounterText += Batch is processed till row number = +

  argsRowCountToString() + <br>;

  }


From:http://tw.wingwit.com/Article/program/net/201311/12203.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.