PDA

View Full Version : اجرای همزمان سه دستور insert



نسرین2000
چهارشنبه 10 اردیبهشت 1393, 07:57 صبح
سلام
در فرم ثبت اطلاعات اطلاعاتی که کاربر وارد می کنه به سه دسته تقسیم می شوند : اطلاعات میهمان ، همراه ، سوئیت ( برنامه هتل داری )
سه دستور insert نوشتم که این سه دسته اطلاعات را توسط دکمه ثبت در سه جدول guest, hamrah , suite ثبت می کند .
مشکل اینجاست که گاهی دو دستور insert اولی اجرا می شوند ولی دستور سوم خطا می دهد و نتیجه اش این می شود که میهمان و همراه در جداول مربوطه ثبت می شوند ولی سوئیتی برای آنها ثبت نمی شود برای رفع این مشکل و اجرای هر سه دستور ( به صورتی که اگر یکی از دستورات ارور داد دو دستور دیگر هم اجرا نشوند ) به چه صورت باید عمل کنم ؟

ROSTAM2
چهارشنبه 10 اردیبهشت 1393, 09:46 صبح
خوب معلومه باید خطاش رو بگیری کار دیگه ای که نمی شه کرد!!

gilsoft
چهارشنبه 10 اردیبهشت 1393, 15:12 عصر
سلام دوست عزیز

پیشنهاد من اینه که: از Transaction استفاده کنید ....

mc_laren
سه شنبه 16 اردیبهشت 1393, 14:24 عصر
برای انجام اینکار باید از همانطور که دوست خوبمونو گفتن باید از تراکنش استفاده کنید، مطابق روش زیر :

Dim OleCnn As New SqlConnection(StrCnn)
OleCnn.Open()
Dim OleTran As SqlTransaction = OleCnn.BeginTransaction
Try

Dim OleCmd As SqlCommand = OleCnn.CreateCommand()
OleCmd.Transaction = OleTran

OleCmd.CommandText = "دستور اول"
OleCmd.ExecuteNonQuery()

OleCmd.CommandText = "دستور دوم"
OleCmd.ExecuteNonQuery()

OleCmd.CommandText = "دستور سوم"
OleCmd.ExecuteNonQuery()


OleTran.Commit()
OleCnn.Close()

Catch ex As Exception
OleTran.Rollback()
End Try

وقتی از تراکنش برای اجرای دستوراتتون استفاده می کنید، تنها زمانی نتیجه دستورات اعمال می شود که هر سه دستور (دراینجا) بدون خطا اجرا شوند.
البته این یک مثال بود، و شما می توانید تعداد بسیار بیشتری دستور را همزمان اجرا کنید

نسرین2000
سه شنبه 30 اردیبهشت 1393, 08:52 صبح
برای انجام اینکار باید از همانطور که دوست خوبمونو گفتن باید از تراکنش استفاده کنید، مطابق روش زیر :

Dim OleCnn As New SqlConnection(StrCnn)
OleCnn.Open()
Dim OleTran As SqlTransaction = OleCnn.BeginTransaction
Try

Dim OleCmd As SqlCommand = OleCnn.CreateCommand()
OleCmd.Transaction = OleTran

OleCmd.CommandText = "دستور اول"
OleCmd.ExecuteNonQuery()

OleCmd.CommandText = "دستور دوم"
OleCmd.ExecuteNonQuery()

OleCmd.CommandText = "دستور سوم"
OleCmd.ExecuteNonQuery()


OleTran.Commit()
OleCnn.Close()

Catch ex As Exception
OleTran.Rollback()
End Try

وقتی از تراکنش برای اجرای دستوراتتون استفاده می کنید، تنها زمانی نتیجه دستورات اعمال می شود که هر سه دستور (دراینجا) بدون خطا اجرا شوند.
البته این یک مثال بود، و شما می توانید تعداد بسیار بیشتری دستور را همزمان اجرا کنید

با توجه به توضیحتون دستوراتم رو به صورت زیر نوشتم ولی اصلا اجرا نمی شوند ؟؟؟؟؟؟؟
objconnection.Open()
Dim OleTran As SqlTransaction = objconnection.BeginTransaction
Try
Dim OleCmd As SqlCommand = objconnection.CreateCommand()
OleCmd.Transaction = OleTran

Dim j As Integer
For j = 0 To lst.Items.Count - 1
If lst.Items(j) = 101 Then
OleCmd.CommandText = "update state_suite set s101=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 102 Then
OleCmd.CommandText = "update state_suite set s102=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 103 Then
OleCmd.CommandText = "update state_suite set s103=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 104 Then
OleCmd.CommandText = "update state_suite set s104=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 105 Then
OleCmd.CommandText = "update state_suite set s105=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 106 Then
OleCmd.CommandText = "update state_suite set s106=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 107 Then
OleCmd.CommandText = "update state_suite set s107=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 108 Then
OleCmd.CommandText = "update state_suite set s108=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 109 Then
OleCmd.CommandText = "update state_suite set s109=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 110 Then
OleCmd.CommandText = "update state_suite set s110=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 111 Then
OleCmd.CommandText = "update state_suite set s111=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 112 Then
OleCmd.CommandText = "update state_suite set s112=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 201 Then
OleCmd.CommandText = "update state_suite set s201=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 202 Then
OleCmd.CommandText = "update state_suite set s202=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 203 Then
OleCmd.CommandText = "update state_suite set s203=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 204 Then
OleCmd.CommandText = "update state_suite set s204=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 205 Then
OleCmd.CommandText = "update state_suite set s205=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 206 Then
OleCmd.CommandText = "update state_suite set s206=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 207 Then
OleCmd.CommandText = "update state_suite set s207=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 208 Then
OleCmd.CommandText = "update state_suite set s208=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 209 Then
OleCmd.CommandText = "update state_suite set s209=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 210 Then
OleCmd.CommandText = "update state_suite set s210=1"
OleCmd.ExecuteNonQuery()
End If
If lst.Items(j) = 211 Then
OleCmd.CommandText = "update state_suite set s211=1"
OleCmd.ExecuteNonQuery()
End If
Next


OleCmd.CommandText = "insert into guest (guest_id , first_name , last_name , father_name , no_shenasnameh , no_meli , shoghl , date_tavalod , mahale_tavalod , phone , address) values (@guest_id , @first_name , @last_name , @father_name ,@no_shenasnameh ,@no_meli, @shoghl ,@date_tavalod , @mahale_tavalod , @phone , @address"
OleCmd.Parameters.AddWithValue("@guest_id", txtguest_id.Text)
OleCmd.Parameters.AddWithValue("@first_name", txtfirst_name.Text)
OleCmd.Parameters.AddWithValue("@last_name", txtlast_name.Text)
OleCmd.Parameters.AddWithValue("@father_name", txtfather_name.Text)
OleCmd.Parameters.AddWithValue("@no_shenasnameh", txtno_shenasnameh.Text)
OleCmd.Parameters.AddWithValue("@no_meli", txtno_meli.Text)
OleCmd.Parameters.AddWithValue("@shoghl", txtshoghl.Text)
OleCmd.Parameters.AddWithValue("@date_tavalod", txtdate_tavalod.Text)
OleCmd.Parameters.AddWithValue("@mahale_tavalod", txtmahale_tavalod.Text)
OleCmd.Parameters.AddWithValue("@phone", txtphone.Text)
OleCmd.Parameters.AddWithValue("@address", txtaddress.Text)
OleCmd.ExecuteNonQuery()


OleCmd.CommandText = "insert into suite (guest_id,no_suite, date_vorood ,time_vorood , date_vorood1, date_khorooj ,modat_eghamat, moaref , pishpardakht , pay_night, takhfif ,darcad_takhfif, pardakht,nahve_pardakht ) values ( @guest_id ,@no_suite, @date_vorood , @time_vorood , @date_vorood1 , @date_khorooj ,@modat_eghamat, @moaref , @pishpardakht , @pay_night, @takhfif ,@darcad_takhfif, @pardakht , @nahve_pardakht)"
OleCmd.Parameters.AddWithValue("@guest_id", txtguest_id.Text)
OleCmd.Parameters.AddWithValue("@no_suite", DispSuit(lst))
OleCmd.Parameters.AddWithValue("@date_vorood", HM_Fcdate_v.Text)
OleCmd.Parameters.AddWithValue("@time_vorood", txttime_vorood.Text)
OleCmd.Parameters.AddWithValue("@date_vorood1", ShamsiToMiladi(CType(HM_Fcdate_v.Text, String)))
OleCmd.Parameters.AddWithValue("@modat_eghamat", txtmodat_eghamat.Text)
OleCmd.Parameters.AddWithValue("@moaref", txtmoaref.Text)
OleCmd.Parameters.AddWithValue("@pishpardakht", txtpishpardakht.Text)
OleCmd.Parameters.AddWithValue("@pay_night", txtpay_night.Text)
OleCmd.Parameters.AddWithValue("@takhfif", txttakhfif.Text)
OleCmd.Parameters.AddWithValue("@darcad_takhfif", txtdarcad.Text)
OleCmd.Parameters.AddWithValue("@pardakht", txtpishpardakht.Text)
OleCmd.Parameters.AddWithValue("@nahve_pardakht", cbonahve_pardakht.Text)
OleCmd.ExecuteNonQuery()

If grdhamrah.RowCount >= 1 Then
Dim i As Integer


For i = 0 To grdhamrah.RowCount - 1
arr.Clear()
If grdhamrah.Item(0, i).Value = Nothing Then
arr.Add("")
Else
arr.Add(grdhamrah.Item(0, i).Value)
End If
If grdhamrah.Item(1, i).Value = Nothing Then
arr.Add("")
Else
arr.Add(grdhamrah.Item(1, i).Value)
End If
If grdhamrah.Item(2, i).Value = Nothing Then
arr.Add("")
Else
arr.Add(grdhamrah.Item(2, i).Value)

End If
If grdhamrah.Item(3, i).Value = Nothing Then
arr.Add("")
Else
arr.Add(grdhamrah.Item(3, i).Value)
End If
OleCmd.CommandText = "insert into hamrah(guest_id_random , guest_id ,first_name,last_name, nesbat) values(@guest_id_random , @guest_id,@first_nameh,@last_nameh,@nesbat) "
OleCmd.Parameters.Clear()
OleCmd.Parameters.Add("@guest_id_random", SqlDbType.NVarChar).Value = arr(0).ToString()
OleCmd.Parameters.AddWithValue("@guest_id", txtguest_id.Text)
OleCmd.Parameters.Add("@first_nameh", SqlDbType.NVarChar).Value = arr(1).ToString()
OleCmd.Parameters.Add("@last_nameh", SqlDbType.NVarChar).Value = arr(2).ToString()
OleCmd.Parameters.Add("@nesbat", SqlDbType.NVarChar).Value = arr(3).ToString()
OleCmd.ExecuteNonQuery()
Next i
End If
MessageBox.Show("میهمان جدید ثبت شد ")
OleTran.Commit()
objconnection.Close()

Catch ex As Exception
OleTran.Rollback()
End Try

Reza Safa
سه شنبه 30 اردیبهشت 1393, 12:11 عصر
سلام
من با توجه دستورات فوق که شما برای برنامتون پیاده کردید ... نحوه تعریف کردن جدول سویت غیر منطقی میدونم
نه اینکه اشتباه باشه اما راه های ساده تر هم بود ...
دیدتونو بهتر کنید ....
سورس های این برنامه که دارید مینویسید رو نگاه کنید به نحوه طراحی دیتابیس و الگو برداری کنید
من فکر می کنم دلیلی اینکه الان به مشکل خوردید همین عدم طراحی نامناسب دیتابیس هستش
یه جستجو کنی سورس کد های عالی پیدا میکنی اونهارو با دقت بررسی کن و الگو بگیر
http://www.a1vbcode.com/code.asp?type=vb.net
به این لینک یه سر بزن جستجو کن اگه این برنامه رو داشته باشه می تونی چنتا مدل ببینی و الگو برداری کنی

نسرین2000
سه شنبه 30 اردیبهشت 1393, 12:16 عصر
خود transaction مشکل داره که اجرا نمی شه ؟

Reza Safa
سه شنبه 30 اردیبهشت 1393, 12:21 عصر
خود transaction مشکل داره که اجرا نمی شه ؟
اول اینکه پیغام خطا چی هستش
دوم اینکه خیلی پیچیده ساختی
حالا پیغام خطا رو بگو شاید ... شاید تونستم کمک کنم

نسرین2000
سه شنبه 30 اردیبهشت 1393, 13:21 عصر
اصلا پیغام خطا نمی ده ولی دستورات رو اجرا نمی کنه

محمد آشتیانی
سه شنبه 30 اردیبهشت 1393, 13:59 عصر
سلام
خب نبایدم خطا بده وقتی شما کدتو تو بلوک Try..Catch گذاشتی
تو قسمت Catch و قبل از OleTran.RollBack بنویس



MsgBox(ex.message)


تا شرح خطا رو در صورت رخ دادن خطا نشون بده.