PDA

View Full Version : خروج از SP موقع خطا



Happy_davood
جمعه 29 دی 1385, 18:55 عصر
سلام
خوب من قصد دارم هنگام بروز خطا در یک دستور مثلاً Insert ، دستور RollBack رو اجرا کنم . برای این منظور عبارت زیر رو می نویسم :
IF(@@ERROR <> 0)
RollBack
منتهی ایراد اینجاست که با وقوع خطا کنترل برنامه از SP خارج میشه و داخل بلاک Catch در برنامه میشه و اصلاً عبارت شرطی بالا اجرا نمیشه . بنابرین Transaction هم نه Commit میشه و نه RollBack .

ممنونم از همگی

DonetKarvb
جمعه 29 دی 1385, 22:22 عصر
سلام
خوب من قصد دارم هنگام بروز خطا در یک دستور مثلاً Insert ، دستور RollBack رو اجرا کنم . برای این منظور عبارت زیر رو می نویسم :
IF(@@ERROR <> 0)
RollBack
منتهی ایراد اینجاست که با وقوع خطا کنترل برنامه از SP خارج میشه و داخل بلاک Catch در برنامه میشه و اصلاً عبارت شرطی بالا اجرا نمیشه . بنابرین Transaction هم نه Commit میشه و نه RollBack .

ممنونم از همگی

شما میتونید از ساختار Try-Catch در خود SP استفاده کنید.

AminSobati
جمعه 29 دی 1385, 22:45 عصر
دوست عزیزم،
این امکان نداره که Tran نه Commit بشه نه Rollback! بر اساس چه چیزی تصور میکنید این اتفاق داره میافته؟
وقتی یک دستور، مثلا Insert در SP وجود داره که باعث بروز خطا میشه، SP به کارش ادامه میده و در هنگام خروج از SP هستش که Client (مثلا ADO) خطا رو گزارش میکنه.
اگر جزئیات بیشتری در مورد شیوه کارتون بفرمایید خوبه..

SabaSabouhi
یک شنبه 01 بهمن 1385, 11:47 صبح
با سلام
یک پیش‌نهاد دیگه دارم. شما عمل Rollback یا Commit رو به برنامه واگذار کنید. و در برنامه Transaction رو ایجاد و کنترل کنید.
اگر اجراى SP شما با مشکل مواجه شد در ساختار Try داخل برنامه مى‌توانید روى Transactin موجود کنترل انجام دهید. خود من بعضى وفت‌ها این کار رو انجام مى‌دم.

صبا صبوحى

zerobit-ltd
یک شنبه 01 بهمن 1385, 12:10 عصر
IF(@@ERROR <> 0)
رو باید دقیقا بلافاصله بعد از دستور insert بنویسی.
چون @@error بعد از اجرای هر دستور مقدارش عوض میشه.

AminSobati
یک شنبه 01 بهمن 1385, 12:30 عصر
با سلام
یک پیش‌نهاد دیگه دارم. شما عمل Rollback یا Commit رو به برنامه واگذار کنید. و در برنامه Transaction رو ایجاد و کنترل کنید.
اگر اجراى SP شما با مشکل مواجه شد در ساختار Try داخل برنامه مى‌توانید روى Transactin موجود کنترل انجام دهید. خود من بعضى وفت‌ها این کار رو انجام مى‌دم.

صبا صبوحى

استفاده از این روش کمی آگاهی برنامه نویس رو میطلبه که با توجه به موقعیت پیش آمده بیان میکنم:
حتی المقدور از این روش اجتناب کنید اما در مواقع لزوم، ما بین باز کردن Tran و خاتمه اش توسط Client به هیچ عنوان از کاربر درخواست واکنش، مثل ورود یک مقدار یا تایید یک پیغام و از این قبیل انجام ندین. چون در این زمان، دستورات شما که در Tran هستند ممکنه رکوردهای زیادی رو Lock کرده باشند و چنانچه کاربر تاخیر داشته باشه در ارائه جواب (یا حتی شاید میز کارش رو ترک کنه!)، در تمام مدت این رکوردها Lock هستند و باعث تاخیر در عملیات سایر کاربرها میشن. در صورتی که Tran شما Client Side هستش، تنها دستورات و عملیات خودتون رو در اون انجام بدین و کاری رو به User محول نکنید.
همچنین روشهای زیادی وجود داره که میشه Tranهای Client Side رو به Server منتقل کرد، مثل استفاده از XML.

Happy_davood
پنج شنبه 05 بهمن 1385, 21:43 عصر
ممنون از همه دوستان
خوب من ایراد کار رو پیدا کردم و در خطاهای عادی مثل Insert تکراری یک کلید @@ERROR هیچ مشکلی نداره . در حقیقت روش تست من اشتباه بوده . من موقع تست این روش یک Insert می کردم به جدولی که اصلاً وجود نداره . در این صورت اجرای SP تموم میشه و @@ERROR رو هم نمیشه چک کرد .
یعنی روش چک کردن @@ERROR ذاتاً درسته .