PDA

View Full Version : بهينه سازي كد حذف ركورد از دو جدول



swallow.pa
سه شنبه 20 تیر 1391, 17:14 عصر
دوستان سلام
من دو تا جدول دارم كه يكي هيدر و ديگري ايتمه
خب حالا مي خوام از هيدر يك ركوردي رو پاك كنم كه توي ايتم هست
اين كد منه
مي خواستم دوستان كد من رو ببينن و اونو بهينه سازي كنن بدين صورت كه اگه خطايي پيش اومد عمليات پاك كردن متوقف شود
ممنون


Using Cmd As New SqlClient.SqlCommand(String.Format("DELETE FROM InstructionItem WHERE InstructionHeaderRef={0}", DataGridViewX1.CurrentRow.Cells(0).Value), Cn)
If Cn.State = ConnectionState.Closed Then Cn.Open()
Cmd.ExecuteNonQuery()
Cn.Close()
End Using
DataSet.InstructionItem.Clear()
DataGridViewX1.Rows.RemoveAt(DataGridViewX1.Curren tRow.Index.ToString)

Using Cmd As New SqlClient.SqlCommand(String.Format("DELETE FROM InstructionHeader WHERE InstructionHeaderId={0}", DataGridViewX1.CurrentRow.Cells(0).Value), Cn)
If Cn.State = ConnectionState.Closed Then Cn.Open()
Cmd.ExecuteNonQuery()
Cn.Close()
End Using

mehdi.mousavi
سه شنبه 20 تیر 1391, 17:59 عصر
مي خواستم دوستان كد من رو ببينن و اونو بهينه سازي كنن بدين صورت كه اگه خطايي پيش اومد عمليات پاك كردن متوقف شود

سلام.


توقف عملیات پاکسازی، بهینه سازی نیست! احتمالا شما دنبال این هستید که یا رکورد ها از هر دو جدول تواما پاک بشه، یا اگر خطایی در یکی از دو جدول رخ داد و داده مورد نظر پاک نشده، هر دو جدول دست نخورده باقی بمونه. به چنین روندی یک روند Transactional میگن. برای انجام این کار چند راه وجود داره:

Stored Procedure ای ایجاد کنید، کلید مورد نظر رو به اون پاس کنید، و عملیات حدف رو همون سمت RDBMS انجام بدید. بدین ترتیب میتونید در داخل همون SP یک Transaction تعریف کنید و روند حذف داده ها رو از همونجا کنترل کنید. مزیت این روش اینه که شما فقط یکبار به سرور Round Trip خواهید داشت.
روش دیگه، استفاده از TransactionScope برای Enlist کردن دو عمل در یک transaction هستش. (لطفا برای آشنایی با این روش، به MSDN و کلاس TransactionScope رجوع کنید).
روش دیگه، استفاده از SqlTransaction هاست (که تقریبا شبیه روش قبلی است، اما صرفا از توانایی های ADO.NET بصورت مستقیم بهره میبره و شما بصورت Explicitly باید هر دو Command رو در Transaction مورد نظر، Enlist کنید).
روش چهارم استفاده از Cascading Delete هستش بدین ترتیب که وقتی Record اصلی از بانک حذف شد، رکوردهای Child اش بطور خودکار حذف خواهند شد و شما دیگه نگران حذف رکوردها از جدول دوم نخواهید بود.

ترکیب کدهای UI و DAL کار صحیحی نیست، شما باید عملیات CRUD رو در Module جداگانه ای انجام بدید تا کدها Tightly Coupled نباشن. وقتی کدی Tightly-Coupled شد، اونوقت نگهداری اون کد کابوسه.
کدی که شما نوشته اید، علاوه بر اشتباهاتی که بهشون اشاره کردم، در برابر حملات SQL Injection نیز صدمه پذیره. شما حتما باید از Parametric Command ها استفاده کنید (لطفا در نوشته های قبلی من جستجو کنید).
کد رو حتما Refactor کنید تا خوانا بشه. نیازی نیست شما چندین بار DataGridViewX1.CurrentRow.Cells(0) رو محاسبه کنید. کافیه متغیری تعریف کنید، اینو بهش Assign کنید و در مابقی کد از اون متغیر استفاده کنید.

موفق باشید.