PDA

View Full Version : آموزش: اجرای عملیات به شکل Batch با استفاده از DataAdapter ها (ADO .NET)



tooraj_azizi_1035
پنج شنبه 09 شهریور 1391, 20:15 عصر
Batch support در ADO .NET به DataAdapter اجازه می دهد تا عملیات INSERT، UPDATE و DELETE که از یک DataSet یا DataTable به سرور ارسال می شود گروه بندی شوند به جای اینکه در هر لحظه یک دستور به سرور ارسال شود. کاهش تعداد رفت و برگشت به سرور عمدتاً منجر به دستاور چشمگیری از لحاظ Performance می گردد. Batch Update ها در Provider های SQL Server و Oracle پشتیبانی می شوند. (System.Data.SqlClient و System.Data.OracleClient)

در نسخه های قبلی ADO .NET به روز رسانی دیتابیس برای ثبت تغییراتی که در DataSet انجام شده بود، متد Update شیء DataAdapter عمل به روز رسانی را به شکل هر بار یک ردیف اجرا می کرد. وقتی عمل iteration روی ردیف های یک جدول مشخص انجام می شد، این متد هر ردیف را برای اطلاع از تغییر کردن آزمایش می کرد. اگر ردیف تغییر کرده بود، بسته به مقدار خاصیت RowState آن ردیف دستور UpdateCommand, InsertCommand, یا DeleteCommandمربوطه فرخوانی می شد. هر دستور به روز رسانی نیازمند رفت و برگشت در شبکه به دیتابیس می بود.

با انتشار ADO .NET 2.0 کلاس DbDataAdapter خاصیت UpdateBatchSize را در معرض استفاده قرار داد. ست کردن UpdateBatchSize به مقدار صحیح مثبت باعث می شود به روز رسانی دیتابیس به شکل دسته ای با اندازه مشخص انجام شود. به عنوان مثال ست کردن UpdateBatchSize به 10 باعث گروه بندی 10 دستور مجزا و سپس ارسال آنها به عنوان یک Batch می شود. ست کردن UpdateBatchSize به صفر باعث می شود DataAdapter از بزرگترین Batch size ممکن که سرور پشتیبانی می کند استفاده کند. ست کردن به 1 به روز رسانی دسته ای را غیر فعال کرده و ردیف ها یکبار در لحظه ارسال می شوند.

اجرای یک Batch خیلی بزرگ باعث کاهش کارایی می شود. بنابراین شما باید برای دستیابی به Batch size بهینه قبل از پیاده سازی برنامه تان آزمایش لازم را انجام دهید.

استفاده از خاصیت UpdateBatchSize

هنگامی که به Batch update فعال است، مقدار خاصیت UpdatedRowSource خواص UpdateCommand, InsertCommand وDeleteCommandشیء DataAdapter باید به None یا OutputParameters ست شود. هنگام اجرای یک Batch update مقدار FirstReturnedRecord یا Both برای خاصیت UpdatedRowSource فرمان نامعتبر خواهد بود.

روال زیر استفاده از خاصیت UpdateBatchSize را نمایش می دهد. این روال دو آرگومان را می گیرد، یکی شیء DataSet که دارای فیلدهای ProductCategoryID و Name در جدول Production.ProductCategoryاست و یک عدد صحیح که بیانگر Batch size (تعداد ردیف ها در یک Batch) است. این کد یک شیء SqlDataAdapter ایجاد کرده و خواص UpdateCommand, InsertCommand وDeleteCommandآن را ست می کند. این کد فرض می کند که شیء DataSet دارای ردیف های تغییر یافته است. خاصیت UpdateBatchSize را ست کرده و عمل به روز رسانی را انجام می دهد.
publicstaticvoid BatchUpdate(DataTable dataTable,Int32 batchSize)
{
// Assumes GetConnectionString() returns a valid connection string.

string connectionString = GetConnectionString();

// Connect to the AdventureWorks database.

using (SqlConnection connection = new
SqlConnection(connectionString))
{

// Create a SqlDataAdapter.

SqlDataAdapter adapter = new SqlDataAdapter();

// Set the UPDATE command and parameters.

adapter.UpdateCommand = new SqlCommand(
"UPDATE Production.ProductCategory SET "
+ "Name=@Name WHERE ProductCategoryID=@ProdCatID;",
connection);
adapter.UpdateCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.UpdateCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;

// Set the INSERT command and parameter.

adapter.InsertCommand = new SqlCommand(
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",
connection);
adapter.InsertCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;

// Set the DELETE command and parameter.

adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Production.ProductCategory "
+ "WHERE ProductCategoryID=@ProdCatID;", connection);
adapter.DeleteCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;

// Set the batch size.

adapter.UpdateBatchSize = batchSize;

// Execute the update.

adapter.Update(dataTable);
}
}
هندل رویداد ها و خطاهای مرتبط با Batch update

DataAdapter دارای دو رویداد مرتبط با Update است: RowUpdating وRowUpdated. در نگارش های قبلی ADO .NET هنگامی که پردازش دسته ای غیر فعال بود، هر یک از این رویدادها برای هر ردیف پردازش شده تولید می شد. RowUpdating قبل از آنکه Updateرخ دهد تولید می شد و RowUpdatedپس از آنکه Update دیتابیس کامل می شد تولید می شد.

تغییر رفتار رویداد ها در Batch update

وقتی پردازش دسته ای فعال است، چندین ردیف با یک دستور دیتابیس به روز می شدند. بنابراین، تنها یک رویداد RowUpdatedبرای هر Batch روی می دهد در حالی که رویداد RowUpdating برای هر ردیف پردازش شده روی می دهد. وقتی پردازش دسته ای غیرفعال است، هر دو رویداد به شکل یکی در میان رخ می دهند و یک رویداد RowUpdating و یک رویداد RowUpdatedبرای یک ردیف و مجدداً برای ردیف بعدی رخ می دهد تا اینکه همه ردیف ها پردازش شوند.

دسترسی به ردیف های به روز شده

وقتی پردازش دسته ای غیرفعال است، ردیف به روز شده می تواند با خاصیت Row کلاس RowUpdatedEventArgs مورد دستیابی قرار بگیرد.

وقتی پردازش دسته ای فعال است، یک رویداد RowUpdatedبرای چندین ردیف تولید می شود. بنابراین خاصیت Row هر ردیف null است. رویداد RowUpdating کماکان برای هرردیف تولید می شود. متد CopyToRows کلاس RowUpdatedEventArgs به شما اجازه می دهد ردیف های به روز شده را با کپی ارجاعات به ردیف ها به یک آرایه دست پیدا کنید. اگر هیچ ردیفی پردازش نشده باشد، CopyToRows یک ArgumentNullException تولید می کند. از خاصیت RowCount برای برگرداندن تعداد ردیف های پردازش شده قبل از فراخوانی متد CopyToRows استفاده کنید.

هندل خطای داده ها

اجرای دسته ای دارای تاثیر مشابه اجرای مستقل هر دستور داخلش را دارد. دستورات به ترتیبی که وارد Batch شده اند اجرا می شوند. خطا ها در مد دسته ای هم به همان طریقی که در مد تک دستور هندل می شدند مدیریت می شوند. هر ردیف به شکل مجزا پردازش می شود. تنها ردیف هایی که در دیتابیس با موفقیت پردازش شده اند در DataRow متناظر موجود در DataTable به روز می شوند.

Data Provider و دیتابیس سرور مربوطه تعیین می کنند کدام نوع ساختار SQL برای اجرای دسته ای پشتیبانی می شوند. یک Exception ممکن است در صورتی که دستور support نشده ای برای اجرا ارسال شود، تولید شود.

منبع: http://www.farsimsdn.somee.com/Default.aspx?id=143