PDA

View Full Version : خطا در transaction



baran-sh
یک شنبه 18 خرداد 1393, 08:40 صبح
سلام دوستان
من یه transaction نوشتم که سه تا دستور داشت و هیچ مشکلی نداشت و اجرا می شد . حالا یک دستور دیگه اضافه کردم و خطا می ده نمی دونم چرا ؟
دستور اینه :
olecmd.CommandText = "select no_suite from suite where guest_id = @guest_id "
olecmd.Parameters.AddWithValue("@guest_id", txtguest_id.Text)
Dim sreader As SqlDataReader = olecmd.ExecuteReader
If sreader.Read Then
lst.Items.AddRange(sreader.GetValue(0).ToString(). Split("-"c))
End If

خطایی هم که می ده میگه sreader باز است اول باید close کنید . حالا این یعنی چی ؟؟؟؟؟؟؟؟؟؟؟؟؟

baran-sh
دوشنبه 19 خرداد 1393, 07:57 صبح
دوستان یعنی هیچ کس نمی تونه این خطا رو برطرف کنه ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

__H2__
دوشنبه 19 خرداد 1393, 19:55 عصر
سلام
برای حل مشکل باید متن کامل خطا را قرار دهید...
طرز مطرح کردن سوال و دادن اطلاعات کامل در پاسخ سریع توسط دیگران کمک زیادی میکند
از متن فارسی که ترجمه کرده اید چنین بر می آید که توسط همین connection یا Command یک datareader دیگر باز کرده و هنوز close یا dispose نکرده اید، اگر چنین است اول باید مورد قبلی را close/dispose کنید و سپس نمونه جدیدی را execute کنید.
در صورت عدم حل مشکل، متن اصلی خطا را کامل قرار دهید.

نسرین2000
چهارشنبه 21 خرداد 1393, 07:30 صبح
سلام
کد transactin را در زیر آوردم :
objconnection.Open()
Dim oletran As SqlTransaction = objconnection.BeginTransaction
Try
Dim olecmd As SqlCommand = objconnection.CreateCommand
olecmd.Transaction = oletran

olecmd.CommandText = "select no_suite from suite where guest_id = @guest_id "
olecmd.Parameters.AddWithValue("@guest_id", txtguest_id.Text)
Dim sreader As SqlDataReader = olecmd.ExecuteReader
If sreader.Read Then
lst_help.Items.AddRange(sreader.GetValue(0).ToStri ng().Split("-"c))
End If
' sreader.Close()
olecmd.CommandText = " update guest SET first_name = @first_name , last_name=@last_name , father_name=@father_name , no_shenasnameh=@no_shenasnameh,no_meli=@no_meli, shoghl=@shoghl , date_tavalod=@date_tavalod , mahale_tavalod=@mahale_tavalod , phone=@phone , address=@address where guest_id=@guest_id1"
olecmd.Parameters.AddWithValue("@guest_id1", 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 = " update suite set no_suite=@no_suite, date_vorood=@date_vorood ,time_vorood=@time_vorood , date_vorood1=@date_vorood1, date_khorooj=@date_khorooj ,modat_eghamat=@modat_eghamat, moaref=@moaref , pishpardakht=@pishpardakht , pay_night=@pay_night, takhfif=@takhfif ,darcad_takhfif=@darcad_takhfif, pardakht=@pardakht,nahve_pardakht=@nahve_pardakht where guest_id=@guest_id2"
olecmd.Parameters.AddWithValue("@guest_id2", 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(Replace(HM_fcdate_v.Text, " ", ""), String)))
olecmd.Parameters.AddWithValue("@date_khorooj", HM_fcdate_kh.Text)
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()
MessageBox.Show("اطلاعات ویرایش شد")
oletran.Commit()

objconnection.Close()

Catch ex As Exception
MessageBox.Show("به علت خطااطلاعات ویرایش نشد ، لطفا دوباره امتحان کنید")
MsgBox(ex.Message)
oletran.Rollback()
End Try
خطایی که می ده اینه :

" this is already an open datareader associated whit this command which must be closed first "
وقتی هم که datareader رو close می کنم ( sreader.close) این دفعه خطای زیر را می دهد :

" object refrence not set to an instance of an object"

__H2__
پنج شنبه 22 خرداد 1393, 17:03 عصر
سلام

خطای اولی که دریافت میکنید منطقی است ولی طبق چیزی که میبینم دلیل خطای دوم را متوجه نمیشوم.
خطای دوم مربوط به null بودم یک شی است، دقیقاً در کدام خط این خطا را دریافت میکنید؟ در صورت نیاز دستور Try-Catch را موقتاً حذف کنید و ببینید دقیقاً در چه خطی این خطای دوم رخ میدهد. (شاید ExecuteNonQuery اول اجرا شده و این خطا از تابع/شی DispSuit یا ShamsiToMiladi و... باشد و شاید هم نباشد ولی خط وقوع آن مهم است)


بهرحال ...


مورد دیگری هم در کد شما وجود دارد، ایراد نیست ولی بهتر میشود...

شما دستور SQL را (یعنی select no_suite from suite where guest_id = @guest_id) اجرا کرده اید ولی فقط یک تک خروجی از آن گرفته اید، خوب پس بهتر است بجای ExecuteReader از دستور ساده تر ExecuteScalar که دقیقاً مخصوص همین کار است استفاده کنید.
این تابع دقیقاً یک مقدار را بر میگرداند میتوانید پس از برسی آنکه تهی نباشد (x IsNot DBNull.Value) آن را به نوع مورد CType کنید.
در این شرایط دیگر نیازی به تعریف DataReader هم نخواهید داشت.

نسرین2000
شنبه 24 خرداد 1393, 07:17 صبح
دوست عزیز ممنون از پاسختون
بله شما کاملا درست می گید خطا به خاطر تابع shamsitomiladi است ولی دلیلش رو متوجه نمی شم ؟؟؟؟؟؟؟؟؟
از این تابع قبلا هم استفاده کردم و مشکلی نداشته یعنی قبلا که این کدها رو درون transaction نذاشته بودم درست کار می کردم ولی حالا که با transaction نوشتم خطا می ده ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

__H2__
شنبه 24 خرداد 1393, 22:44 عصر
سلام مجدد
خطای object refrence not set to an instance of an object ارتباطی با تراکنش و دیتابیس و... ندارد، یک شی null است و از آن استفاده کرده اید.
کافی است break point ای در تابع shamsitomiladi تان قرار دهید و کدهایتان را خط به خط اجرا کنید.
در صورت ادامه مشکل کدهای تابع مذکور را اینجا قرار دهید.
موفق باشید.

نسرین2000
یک شنبه 25 خرداد 1393, 07:19 صبح
سلام
طبق راهنماییتون breakpoint گذاشتم و دیدم مقدار HM_fcdate_v.Text تهی (null) است ولی نمی دونم چرا ؟؟؟؟؟؟ چون توی تکس باکش HM_fcdate_v.Text مقدار تاریخ را دارم ولی نمی دونم چرا به جای اینکه تاریخ رو برگردونه مثلا 93/2/23 مقدار تهی رو برمی گردونه ؟؟؟؟؟؟
لازم به ذکر است من قبل از اینکه از transaction استفاده کنم همین کدها رو نوشته بودم و اصلا مشکلی نداشت و مقدار تاریخ رو برمیگردوند ولی با transaction مقدار تهی رو برمیگردونه ؟؟
کدهای قبل از transaction و بعد از transaction رو براتون می ذارم . به نظر شما این خطا با transaction چه ارتباطی داره ؟
olecmd.CommandText = " update suite set no_suite=@no_suite, date_vorood=@date_vorood ,time_vorood=@time_vorood , date_vorood1=@date_vorood1, date_khorooj=@date_khorooj ,modat_eghamat=@modat_eghamat, moaref=@moaref , pishpardakht=@pishpardakht , pay_night=@pay_night, takhfif=@takhfif ,darcad_takhfif=@darcad_takhfif, pardakht=@pardakht,nahve_pardakht=@nahve_pardakht where guest_id=@guest_id2"
olecmd.Parameters.AddWithValue("@guest_id2", 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(Replace(HM_fcdate_v.Text, " ", ""), String)))
olecmd.Parameters.AddWithValue("@date_khorooj", HM_fcdate_kh.Text)
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()

Dim objsuite As New SqlCommand
objsuite.Connection = objconnection
objsuite.CommandText = " update suite set no_suite=@no_suite, date_vorood=@date_vorood ,time_vorood=@time_vorood , date_vorood1=@date_vorood1, date_khorooj=@date_khorooj ,modat_eghamat=@modat_eghamat, moaref=@moaref , pishpardakht=@pishpardakht , pay_night=@pay_night, takhfif=@takhfif ,darcad_takhfif=@darcad_takhfif, pardakht=@pardakht,nahve_pardakht=@nahve_pardakht where guest_id=@guest_id"
objsuite.Parameters.AddWithValue("@guest_id", txtguest_id.Text)
objsuite.Parameters.AddWithValue("@no_suite", DispSuit(lst))
objsuite.Parameters.AddWithValue("@date_vorood", HM_fcdate_v.Text)
objsuite.Parameters.AddWithValue("@time_vorood", txttime_vorood.Text)
objsuite.Parameters.AddWithValue("@date_vorood1", ShamsiToMiladi(CType(Replace(HM_fcdate_v.Text, " ", ""), String)))
objsuite.Parameters.AddWithValue("@date_khorooj", HM_fcdate_kh.Text)
objsuite.Parameters.AddWithValue("@modat_eghamat", txtmodat_eghamat.Text)
objsuite.Parameters.AddWithValue("@moaref", txtmoaref.Text)
objsuite.Parameters.AddWithValue("@pishpardakht", txtpishpardakht.Text)
objsuite.Parameters.AddWithValue("@pay_night", txtpay_night.Text)
objsuite.Parameters.AddWithValue("@takhfif", txttakhfif.Text)
objsuite.Parameters.AddWithValue("@darcad_takhfif", txtdarcad.Text)
objsuite.Parameters.AddWithValue("@pardakht", txtpishpardakht.Text)
objsuite.Parameters.AddWithValue("@nahve_pardakht", cbonahve_pardakht.Text)
objconnection.Open()
objsuite.ExecuteNonQuery()
objconnection.Close()

__H2__
یک شنبه 25 خرداد 1393, 23:03 عصر
سلام

طبق راهنماییتون breakpoint گذاشتم و دیدم مقدار HM_fcdate_v.Text تهی (null) است ولی نمی دونم چرا ؟؟؟؟؟؟ چون توی تکس باکش HM_fcdate_v.Text مقدار تاریخ را دارم ولی نمی دونم چرا به جای اینکه تاریخ رو برگردونه مثلا 93/2/23 مقدار تهی رو برمی گردونه ؟؟؟؟؟؟
این مشکل شما نمیتواند ارتباطی با تراکنش دیتابیس داشته باشد، اگر شک دارید و روی تراکنش بیچاره گیر کرده اید، تراکنش را از کدتان حذف کنید!!!
احتمال داد فرم شما شلوغ و شامل TextBox های متعدد باشد، و کنترلری که شما فکر میکنید آن را پر کرده اید همانی نباشد که در کدنویسی به آن ارجاع داده اید.
برای اطمینان کلاً HM_fcdate_v را از واسط کاربری حذف کنید و یک TextBox جدید با نام جدید (مثلاً HM_fcdate_v123) روی فرمتان قرار دهید و کد را اصلاح و مجدد اجرا کنید.

از نظر کدنویسی هم زیباتر است که تابع Replace را به داخل ShamsiToMiladi منتقل کنید و دستورات مقابله و پیشگیری از پردازش مقادیر تهی را هم اضافه کنید و در نهایت هم دستور CType تان اضافه بنظر میرسد ولی این هم ارتباط مستقیمی به مشکلتان ندارد.

درصورت تمایل از کنترلر زیر هم میتوانید استفاده کنید که یک DatePicker شمسی است و برای استفاده تنها کافیست از خصیصه Value آن استفاده کنید که تاریخی میلادی را بازپس میدهد.
http://support.h02.ir/fwlink/?LinkId=1002976157

نسرین2000
دوشنبه 26 خرداد 1393, 13:39 عصر
این راه رو هم امتحان می کنم نتیجه را گزارش می کنم .

نسرین2000
سه شنبه 27 خرداد 1393, 07:42 صبح
نتیجه نداد . مشکل از جایی دیگه است ولی نمیدونم کجا ؟؟؟؟؟؟؟؟؟