PDA

View Full Version : سوال: کنترل خطا در همزمانی ورود اطلاعات در برنامه تحت شبکه



حجتی نیا
چهارشنبه 06 مرداد 1389, 17:41 عصر
1)برنامم تحت شبکه است و زمانی که در یه فرم،همزمان اگه بخواین اطلاعات وارد کنند خطا میده.. خطاش مربوط به وجود دو کلید مشابه است
چطوری باید این خطا رو کنترل کنم؟

2)در برنامم هر کاربر با یوزر خودش وارد میشه حالا در برنامه تحت شبکه چجوری میشه بررسی کرد که یه کاربر فقط از یه کامپیوتر بتونه وارد بشه؟

ricky22
چهارشنبه 06 مرداد 1389, 20:10 عصر
عجیبه که خود Sql مدیریت نمی کنه!
اما راه حل پیشنهادی بنده :


برای هر خطا رو Catch کنید و در Block Catch یک بار دیگه امتحان کنید اگر این تکرار شد داده را نگه داشته و دوباره پس از مدت زمان دیگری سعی کنید.
اما باز هم من فکر می کنم خودش باید مدیریت کنه.


2)در برنامم هر کاربر با یوزر خودش وارد میشه حالا در برنامه تحت شبکه چجوری میشه بررسی کرد که یه کاربر فقط از یه کامپیوتر بتونه وارد بشه؟
سریال سخت افزار کامپیوتر ها به همراه Userی که حق ورود را دارند ذخیره و قبل از ورود چک کن.
اما من منتظر راههای بهتر توسط دوستان هستم.

حجتی نیا
چهارشنبه 06 مرداد 1389, 23:36 عصر
عجیبه که خود Sql مدیریت نمی کنه!
اما راه حل پیشنهادی بنده :

برای هر خطا رو Catch کنید و در Block Catch یک بار دیگه امتحان کنید اگر این تکرار شد داده را نگه داشته و دوباره پس از مدت زمان دیگری سعی کنید.
اما باز هم من فکر می کنم خودش باید مدیریت کنه.
بنظر خودم وقتی داره ارور میده یعنی داره مدیریت میکنه اما منظورم اینه (تا جایی که من اطلاعات دارم)که واسه هرcatch باید یه عنوان خطا نوشته بشه و من این عنوان رو نمیدونم..بطور مثال :

catch (????)
اگه دستورات رو تو try بزارم و براش فقط یه catch بنویسم کار تمومه؟؟

FastCode
پنج شنبه 07 مرداد 1389, 00:08 صبح
کار موقعی تمومه که شما به جای catch از Identity Column و Ident_Current و SCOPE_IDENTITY استفاده کنی.

حجتی نیا
پنج شنبه 07 مرداد 1389, 00:31 صبح
کار موقعی تمومه که شما به جای catch از Identity Column و Ident_Current و SCOPE_IDENTITY استفاده کنی.
اینا که گفتی یعنی چی؟:متفکر:
یکمی بیشترتوضیح میدین، من تازه وارد مباحث شبکه شدم و اطلاعاتم کمه...

FastCode
پنج شنبه 07 مرداد 1389, 17:10 عصر
http://en.wikipedia.org/wiki/Identity_column
http://msdn.microsoft.com/en-us/library/ms175098.aspx
http://msdn.microsoft.com/en-us/library/ms190315.aspx

حجتی نیا
پنج شنبه 07 مرداد 1389, 17:28 عصر
http://en.wikipedia.org/wiki/Identity_column
http://msdn.microsoft.com/en-us/library/ms175098.aspx
http://msdn.microsoft.com/en-us/library/ms190315.aspx

چیزی ازش نفهمیدم:متفکر:.. یکمی اگه راجع بهش توضیح بدین که به چه دردی میخوره، بعدش خودم میرم دنبالش واسه بیشترکردن اطلاعاتم.... لطفا

علیرضا حسن زاده
پنج شنبه 07 مرداد 1389, 18:15 عصر
اگه فیلد کلید رو به صورت Auto Increament (اگه درست نوشته باشم) تعریف کنی یا حداقل یه فیلد کلید با این خاصیت داشته باشی مشکل حل میشه و در موقع Insert داده کلید توسط SQL ایجاد میشه

حجتی نیا
پنج شنبه 07 مرداد 1389, 18:48 عصر
اگه فیلد کلید رو به صورت Auto Increament (اگه درست نوشته باشم) تعریف کنی یا حداقل یه فیلد کلید با این خاصیت داشته باشی مشکل حل میشه و در موقع Insert داده کلید توسط SQL ایجاد میشه
فیلد کلید رو تو برنامه هربار مثلا با 100 جمع میکنم وثبت میشه (نمیخوام فیلد کلید یکی یکی بالا بره)

FastCode
جمعه 08 مرداد 1389, 09:12 صبح
فیلد کلید رو تو برنامه هربار مثلا با 100 جمع میکنم وثبت میشه (نمیخوام فیلد کلید یکی یکی بالا بره)

اشتباه میکنید.
اولا" که همه جای دنیا یکی یکی بالا میره.این کار در سورت کردن و جست و جو کردن و خیلی کارای دیگه روی سرعت تاثیر میزاره.
شما میتونید از Identity Increment استفاده کنید.
توی گوگل هم راجع بهش مطلب هست.

ricky22
جمعه 08 مرداد 1389, 09:33 صبح
اشتباه میکنید.
اولا" که همه جای دنیا یکی یکی بالا میره.این کار در سورت کردن و جست و جو کردن و خیلی کارای دیگه روی سرعت تاثیر میزاره.
شما میتونید از Identity Increment استفاده کنید.
توی گوگل هم راجع بهش مطلب هست.
می تونه از GUID استفاده کنه اگه نمی خواد یکی یکی بره بالا.

حجتی نیا
جمعه 08 مرداد 1389, 10:44 صبح
اشتباه میکنید.
اولا" که همه جای دنیا یکی یکی بالا میرهحتما یه دلیلی داره که اینکارو کردم ... ما که تابع دنیا نیستیم

شما میتونید از Identity Increment استفاده کنید.
فرض براینکه یکی یکی بالا بره،چطوری میشه ازش استفاده کرد
الان برنامم داره از دیتابیس داره اسفاده میکنه،میشه این تغییرات را روش اعمال کرد؟؟


می تونه از GUID استفاده کنه اگه نمی خواد یکی یکی بره بالا. نیاز به اطلاعات بیشتر دارم،لطفا..

ricky22
جمعه 08 مرداد 1389, 11:17 صبح
نیاز به اطلاعات بیشتر دارم،لطفا..
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=335
GUID امکان نداره یکی باشه

حجتی نیا
جمعه 08 مرداد 1389, 11:29 صبح
فک کنم از سوالم چیزه دیگه برداشت شده :
برنامم تو شبکه است و مثلا یه فرم مشابه در هردو سیستم بازه و رو یه کلید که اطلاعات رو وارد دیتابیس میکنه بطور همزمان کلیک میکنم .. در ابن موقع ارور میده که مثلا کلید مشابه تولید شده و فقط یکی از اونا تو دیتابیس ثبت میشه و اون یکی ثبت نمیشه درحالیکه من میخوام اگه این اتفاق افتاد اطلاعات دومی هم تو دیتابیس ثبت بشه ولی با یه شماره جدید
سوال : با کد میشه کاری کرد (در مواقع ثبت همزمان) که اگه یه سیستم داره اطلاعات رو داره ثبت میکنه،سیستم دوم چندلحظه مکث کنه و بعد عمل ثبت رو انجام بده ؟؟

FastCode
جمعه 08 مرداد 1389, 21:42 عصر
begin tran
declare @@LastIndex int;
('select LastIndex = IDENT_CURRENT('Table
Insert into Table(x y z)
COMMIT TRANمیتونی یه تابع تعریف کنی که @@LastIndex رو برگردونه و برای insert کردن توی جداول detail(در صورت وجود) ازش استفاده کنی.

seven7777777
شنبه 09 مرداد 1389, 00:31 صبح
خوب دوست من شما هم می تونی با همون Auto Increament کاری کنی که کلیدت 100 تا 100 تا بره بالا ، هم می تونی موقع ثبت اطلاعات شماره ردیف بعدی رو تعیین کنی نه وقتی فرم ثبت مورد جدید باز میشه ، هم می تونی وقتی خطا داد و خطا مربوط به کلید تکراری بود ، تو همون کد نویسی کدتو 100 تا ببری بالاتر و دوباره عمل ثبت رو انجام بدی و ...

راستی اگه دلیلت برای 100 تا 100 تا بالا رفتن رو بگی قطعا راه حل هایی به مراتب بهتر و منطقی تر داده میشه !!!

علیرضا حسن زاده
چهارشنبه 13 مرداد 1389, 11:34 صبح
فیلد کلید رو تو برنامه هربار مثلا با 100 جمع میکنم وثبت میشه (نمیخوام فیلد کلید یکی یکی بالا بره)
خوب اگه فرمول خاصی برای ایجاد این فیلد دارید می تونید از یه تریگر برای Insert استفاده کنی و توی اون در زمان Insert اطلاعات (قبل از اینکه اطلاعات وارد دیتابیس بشه) مقدار کلید رو محاسبه کنی

راستی اگه دلیلت برای 100 تا 100 تا بالا رفتن رو بگی قطعا راه حل هایی به مراتب بهتر و منطقی تر داده میشه !!!
در این مورد هم فکر کن

ایمان اختیاری
پنج شنبه 14 مرداد 1389, 13:16 عصر
از دوستانی که جواب دادن تشکر می کنم اما موردی که هنوز روش بحث نشده جلوگیری از همزمانی ثبت اطلاعاته که کسی بهش اشاره نکرد .. برای منم چنین چیزی پیش اومده و راهکاری که براش در نظر گرفتم این بود که اول اون مقداری که نمی خوام تکراری وارد بشه توی یه جدول temp ذخیره بشه ..و سپس یک تابع دیگه به ترتیب اونو برداره با جدول مقصد چک کنه اگه وجود نداشت خب ثبتش کنه اگه وجود داشت یک پیام صادر کنه یا کار دیگه .. البته نمی دونم این روش چقدر بهینه اس و دوست دارم دوستان راجع به اش نظر بدن .. شاید مشکل دوستمون هم این جوری حل شد .