PDA

View Full Version : سوال: روش استفاده از transaction در دستوراتي كه نوشتم؟



ebrahimv
یک شنبه 22 آذر 1388, 16:16 عصر
من اين دستورات را دارم كه عمل آپديت را در چند جدول انجام مي دهد من مي خواهم اگر هر يك از اين آپديت ها انجام نگرفت كل عمليات لغو شود.


Try
Me.TblMomaizeTableAdapter.Update(Me.MayoralDataSet .tblMomaize)
Me.TblMZaminTableAdapter.Update(Me.MayoralDataSet. tblMZamin)
Me.TblMMalekTableAdapter.Update(Me.MayoralDataSet. tblMMalek)
Me.TblMSakhtemanTableAdapter.Update(Me.MayoralData Set.tblMSakhteman)
Me.TblNTajhezatTableAdapter.Update(Me.MayoralDataS et.tblNTajhezat)
Me.TblJapheTableAdapter.Update(Me.MayoralDataSet.t blJaphe)
Me.TblShopTableAdapter.Update(Me.MayoralDataSet.tb lShop)
Catch ex As Exception
End Try



داخل پارانتز ( نمي دونم كي از شرمندگي اين همه زحمتي كه به شما دوستان ميدم در ميام)

saadi2
یک شنبه 22 آذر 1388, 16:54 عصر
برای استفاده از تراکنش معمولی باید از کانکشن و کامند استفاده کرد

ولی یک راه حل دیگری هم هست که هنوز خودم مطمئن نیستم لطفا امتحان کنید



Imports System.Transactions
PublicClass Form1
Using scope As TransactionScope = New TransactionScope()
Try
Me.TblMomaizeTableAdapter.Update(Me.MayoralDataSet .tblMomaize)
Me.TblMZaminTableAdapter.Update(Me.MayoralDataSet. tblMZamin)
Me.TblMMalekTableAdapter.Update(Me.MayoralDataSet. tblMMalek)
Me.TblMSakhtemanTableAdapter.Update(Me.MayoralData Set.tblMSakhteman)
Me.TblNTajhezatTableAdapter.Update(Me.MayoralDataS et.tblNTajhezat)
Me.TblJapheTableAdapter.Update(Me.MayoralDataSet.t blJaphe)
Me.TblShopTableAdapter.Update(Me.MayoralDataSet.tb lShop)
scope.Complete()
Catch ex As Exception
EndTry
EndUsing

DoDoklak
یک شنبه 22 آذر 1388, 17:32 عصر
بدون پیچیدگی، عمل مدیریت اطلاعات را شخصا" انجام دهید :
کلاس: CommittableTransaction
مشخصه ی بارز: پر کاربرد ترین روش

کلاس CommittableTransaction در فضای نامی System.Transactions قرار دارد، به طور پیش فرض ارجاعی به فایل system.transactions.dll وجود ندارد، پس شما باید ابتدا یک ارجاع به فایل system.transactions.dll ایجاد کنید، تا بتوانید فضای نامی System.Transactions را به برنامه Imports کنید. (نحوه ی افزودن ارجاع به فایل، در پایان مقاله توضح داده شده است.)
نکته: در صورتی که روش قبل را در پروژه ای پیاده سازی کرده اید، نیازی به افزودن دوباره ی ارجاع برای همان پروژه نیست.

Imports System.Transactions
اکنون باید یک شی از کلاس CommittableTransaction ایجاد کنید:

Dim sqlTransaction1 As New CommittableTransaction
همچنین باید بعد از باز کردن مسیر ارتباط با Database ( دستور ()sqlConnection1.Open ) ، شی CommittableTransaction را به عنوان پارامتر به متد EnlistTransaction از شی sqlConnection1 ارسال کنید، تا Transaction بر روی این ارتباط، از همین لحظه آغاز شود.

sqlConnection1.EnlistTransaction(sqlTransaction1)
در این روش باید عملیات ادامه ی کار و بازگشت به قبل از خطا را به صورت دستی پیاده سازی کنید. در صورتی که خطایی رخ دهد، لازم است متد Rollback از شی را فراخوانی کنید:

sqlTransaction1.Rollback()
و در صورت اجرای موفقیت آمیز دستورات، لازم است متد Commit از شی را ( برای اعمال تغییرات در Database ) فراخوانی کنید:

sqlTransaction1.Commit()

جایگذاری این دستورات توسط شما و طبق صلاحدید شما انجام می پذیرد، ولی به عنوان یک استاندارد تعریف نشده، فراخوانی متد Commit بلافاصله قبل از بستن ارتباط، و فراخوانی متد Rollback در قسمت Catch شده، قرار می گیرد.
نکته: توجه داشته باشید که نمی توانید قبل از ارسال شی به ارتباط باز شده، عمل Commit و یا Rollback را انجام دهید، ولی قرار دادن آنها پس از بستن ارتباط، مشکلی ایجاد نمی کند.


یه نمونه کد زیر توجه کنید



Private Sub AddToTable_CommitableTransaction()
Dim sqlTransaction1 As New CommittableTransaction
Dim sqlConnection1 As New SqlConnection(strConn)
Dim sqlDataAdapter1 As New SqlDataAdapter
Dim intMax As Integer = GetMaximum("ID") + 1
Dim strQuery As String = _
"Insert Into tblEmployee (ID, LastName, FirstName, Gender, City) " & _
"Values(" & intMax & ", 'Akbari', 'Hamid', 'Male', 'Mashhad')"
Dim sqlCommand1 As New SqlCommand(strQuery, sqlConnection1)
sqlDataAdapter1.InsertCommand = sqlCommand1
Try
sqlConnection1.Open()
sqlConnection1.EnlistTransaction(sqlTransaction1)
sqlCommand1.ExecuteNonQuery()
sqlTransaction1.Commit()
MessageBox.Show("Insert operation was successful.", _
"Commitable Transaction")
Catch ex As Exception
sqlTransaction1.Rollback()
MessageBox.Show("An error occured!")
End Try
sqlConnection1.Close()
sqlTransaction1.Dispose()
End Sub


در این سابروتین، برنامه ابتدا یک شی CommittableTransaction ایجاد می کند، و بعد از باز کردن ارتباط، شی CommittableTransaction را به عنوان Transaction کمکی به شی sqlConnection1 ارسال می کند. سپس عملیات درج در جدول را انجام می دهد. در پایان در صورتی که خطایی رخ ندهد، متد Commit فراخوانی شده و تغییرات در Database ثبت می شوند و اجرای برنامه پس از درج، با موفقیت به پایان می رسد. در غیر این صورت، اگر در ساختار Try... Catch... End Try خطایی رخ دهد، اجرای برنامه، قبل از فراخوانی متد Commit از شی CommittableTransaction ، به داخل Catch منتقل می شود و در نتیجه متد Commit فراخوانی نشده و در عوض متد Rollback فراخوانی می شود. این متد ( برخلاف روش اول )، صراحتا تمامی تغییرات Database ( از ارسال شی CommittableTransaction به ارتباط، تا اینجا ) نادیده گرفته می شود و Database به حالتی که قبل از اجرای سابروتین AddToTable داشته، باز می گردد.

برای افزودن یک ارجاع به فایل system.transactions.dll مراحل زیر را انجام دهید:
از منوی Project آخرین گزینه را انتخاب کنید، تا صفحه ی Project Properties باز شود. در تب References بر روی دکمه ی ...Add کلیک کنید، تا صفحه ی Add References باز شود. در این صفحه در تب اول ( NET. )، به دنبال System.Transactions بگردید، آن را انتخاب کنید و بر روی دکمه ی OK کلیک کنید.
در این لحظه یک ارجاع به فایل system.transactions.dll ایجاد می شود. پروژه را توسط گزینه ی SaveAll از منوی File ذخیره کرده و صفحه ی Project Properties را ببندید

ebrahimv
دوشنبه 23 آذر 1388, 09:16 صبح
برای استفاده از تراکنش معمولی باید از کانکشن و کامند استفاده کرد

ولی یک راه حل دیگری هم هست که هنوز خودم مطمئن نیستم لطفا امتحان کنید



Imports System.Transactions
PublicClass Form1
Using scope As TransactionScope = New TransactionScope()
Try
Me.TblMomaizeTableAdapter.Update(Me.MayoralDataSet .tblMomaize)
Me.TblMZaminTableAdapter.Update(Me.MayoralDataSet. tblMZamin)
Me.TblMMalekTableAdapter.Update(Me.MayoralDataSet. tblMMalek)
Me.TblMSakhtemanTableAdapter.Update(Me.MayoralData Set.tblMSakhteman)
Me.TblNTajhezatTableAdapter.Update(Me.MayoralDataS et.tblNTajhezat)
Me.TblJapheTableAdapter.Update(Me.MayoralDataSet.t blJaphe)
Me.TblShopTableAdapter.Update(Me.MayoralDataSet.tb lShop)
scope.Complete()
Catch ex As Exception
EndTry
EndUsing

روش خوبیه ولی نمیدونم به یکی از آپدیتام که در حالت آدی کار میکونه ایراد میده
در کل روش خوبی در برخی موارد هست

sh2007
دوشنبه 23 آذر 1388, 12:55 عصر
روش خوبیه ولی نمیدونم به یکی از آپدیتام که در حالت آدی کار میکونه ایراد میده
در کل روش خوبی در برخی موارد هست

دوست من اين روش خوبي هست اما يه سوال اگه خواستي تعداد 100 ركورد رو در بانك اعمال كني چه توي حلقه For

ebrahimv
دوشنبه 23 آذر 1388, 18:09 عصر
دوست من اين روش خوبي هست اما يه سوال اگه خواستي تعداد 100 ركورد رو در بانك اعمال كني چه توي حلقه For
100 تا ركورد را به نظر من هيچ وقت نبايد با For توي پايگاه داده ذخيره كر ابتدا بايد آن ها را در DataTable ذخيره كرد و سپس با يه دستور آپديد تمام اطلاعات موجود در DataTabl را در پايگاه داده ذخيره كرد.
مانند كاري كه من در دستورات بالا انجام ميدهم مثلا اين دستور


Me.TblMomaizeTableAdapter.Update(Me.MayoralDataSet .tblMomaize)

بسته به اطلاعاتي كه درون datatabl هست امكان داره تعدادي زيادي عمل Insert , Update, Delet را انجام دهد.

ebrahimv
شنبه 28 آذر 1388, 13:13 عصر
سلام دوستان
من جواب شو خودم پيدا كردم و براي اين كه اين پست بدون جواب نمونه براتون مينويسم
همانتور كه در دستوراتي كه ديديد من از TableAdapterبراي آپديت هر يك از جدول ها استفاده ميكردم و يك شي به نام TableAdapterManager وجود دارد كه مديريتTableAdapter ها را بر عهده ميگيرد و ما TableAdapter ها را به TableAdapterManager وصل ميكنيم و با اين دستور همه انها را يك جا آپديت ميكنيم و هر تراكنشي هم لازم باشد خود اعمال ميكند


TableAdapterManager1.UpdateAll(MayoralDataSet)