PDA

View Full Version : جلوگیری از تغییرات در پایگاه داده در صورت وجود خطا



sh2007
یک شنبه 20 آذر 1390, 18:55 عصر
دوستان سلام
من سه خط کد زیر را اجرا می کنم توی محیط وی بی نت

Cmd1.CommandText = "DELETE Account_CreditRelation WHERE Acount_CreditDebitId= " & DGVriz.CurrentRow.Cells(1).Value
Cmd1.ExecuteNonQuery()



Cmd2.CommandText = "DELETE Account WHERE AccountId= " & DGVriz.CurrentRow.Cells(0).Value
Cmd2.ExecuteNonQuery()




Cmd3.CommandText = "DELETE CreditDebit WHERE CreditDebitId= " & DGVriz.CurrentRow.Cells(2).Value
Cmd3.ExecuteNonQuery()



خب حالا احتمال دارد توی یکی از cmd ها خطا باشه چطوری می تونم کنترل کنم اگه توی یکی خطا بود بقیه اجرا نشه و تغییرات همه منتفی بشه چطور می تونم این کدهام رو بهینه کنم
ممنون از راهنمائیتان

Mani_rf
یک شنبه 20 آذر 1390, 19:51 عصر
برای کنترل برروی اعمالی که روی دیتابیس انجام میشه و برای کنسل کردن اونها در صورتی که نیاز شد مانند مواقعی که اطلاعات کامل وارد نمیشه یا به خطا میخوری باید از Transaction ها استفاده کنی .
این لینک (http://msdn.microsoft.com/en-us/library/4b1h6b1d.aspx)را نگاه کن به صورت کامل توضیح داده است.

mgh64120
یک شنبه 20 آذر 1390, 23:06 عصر
سلام دوست عزيز
طبق گفته ي دوست عزيز Mani_rf شما بايد از Transactionها استفاده كنيد.
اما چون لينك ايشان جواب نميده(لينك خرابه)، اين مثال رو براتون ميذارم :
Dim Trans As SqlTransaction
Dim Cmd As New SqlCommand()
If Con.State = ConnectionState.Closed Then Con.Open()
Cmd.Connection = Con
Trans = Con.BeginTransaction
Cmd.Transaction = Trans
Try
Cmd.CommandText = "DELETE Account_CreditRelation WHERE Acount_CreditDebitId= " & DGVriz.CurrentRow.Cells(1).Value & ";"
Cmd.CommandText += "DELETE Account WHERE AccountId= " & DGVriz.CurrentRow.Cells(0).Value & ";"
Cmd.CommandText += "DELETE CreditDebit WHERE CreditDebitId= " & DGVriz.CurrentRow.Cells(2).Value
Cmd.ExecuteNonQuery()
Trans.Commit()
Catch sqlExceptionErr As SqlException
Trans.Rollback()
End Try
توجه داشته باشيد كه بايد از يك SqlCommand استفاده كنيد(cmd) نه سه تا (cmd1,cmd2,cmd3)
و براي اينكه سه دستور DELETE از هم جدا شوند از كاراكتر ; استفاده مي كنيم.
موفق باشيد...

Mani_rf
دوشنبه 21 آذر 1390, 07:45 صبح
سلام دوست عزيز
طبق گفته ي دوست عزيز Mani_rf شما بايد از Transactionها استفاده كنيد.
اما چون لينك ايشان جواب نميده(لينك خرابه)، اين مثال رو براتون ميذارم :
Dim Trans As SqlTransaction
Dim Cmd As New SqlCommand()
If Con.State = ConnectionState.Closed Then Con.Open()
Cmd.Connection = Con
Trans = Con.BeginTransaction
Cmd.Transaction = Trans
Try
Cmd.CommandText = "DELETE Account_CreditRelation WHERE Acount_CreditDebitId= " & DGVriz.CurrentRow.Cells(1).Value & ";"
Cmd.CommandText += "DELETE Account WHERE AccountId= " & DGVriz.CurrentRow.Cells(0).Value & ";"
Cmd.CommandText += "DELETE CreditDebit WHERE CreditDebitId= " & DGVriz.CurrentRow.Cells(2).Value
Cmd.ExecuteNonQuery()
Trans.Commit()
Catch sqlExceptionErr As SqlException
Trans.Rollback()
End Try
توجه داشته باشيد كه بايد از يك SqlCommand استفاده كنيد(cmd) نه سه تا (cmd1,cmd2,cmd3)
و براي اينكه سه دستور DELETE از هم جدا شوند از كاراكتر ; استفاده مي كنيم.
موفق باشيد...

ممنون از مثالی که زدی. لینک سالمه اگر باز نشد همون صفحه را دوباره رفرش کنید تا باز بشه.