PDA

View Full Version : به روز رسانی مداوم رکوردست



kitcat_m18
شنبه 01 آذر 1393, 16:27 عصر
سلام
من یه سوالی دارم که دنبال بهترین روش برای پیاده سازیشم
من می خوام یه برنامه تحت شبکه بنویسم با پایگاه داده SQl Server 2008
این برنامه چند کاربر داره که همزمان در حال کار با اطلاعات یک جدول هستند

اولین چیزی که می خوام پیاده سازی کنم اینه که اگه کاربری روی یک رکورد در پایگاه داده قرار گرفت و قصد ویرایش اون رکورد را داشت بقیه کاربرا نتونن اون رکورد رو انتخاب کنن (یه پیغام خطا صادر بشه که بگه کاربر دیگری در حال ویرایش اون رکورده)

دومین چیزی که می خوام اینه که یه ارتباط به اون جدول داشته باشم که دائما به روز باشه
یعنی چی؟
یعنی اینکه فرض کنین من یه رکوردست رو Open کردم
بعد از من یه کاربر دیگه اقدام به به روز رسانی اطلاعات جدول می کنه
حالا رکورد ست من که قبلش اون کاربر باز شده می خوام این تغییر در جدول رو بفهمه و خودشو خود به خود به روز کنه (منظورم Sync کردن رکوردست با دیتابیسه)

به نظر دوستان بهترین روش برای پیاده سازی این دو قسمت چیه؟

یکی از دوستان گفت میشه با تریگر و آلرت قسمت دوم رو پیاده سازی کرد ، اما اینکه چطوری رکوردست این آلرت ها رو در حال گوش کردن باشه بلد نیستم

ahmad abdoli
شنبه 01 آذر 1393, 18:06 عصر
سلام

واسه سوال اولت می تونی یه فیلد به جدولت اضاف کنی مثلا به اسم active از نوع boolean

بعد واسه ویرایش چک می کنی اگه این فیلد true بود اجازه ویرایش داشته باشه

بعد اگه یه کاربر رفت به حالت وبرایش این فیلد false بشه.

vbhamed
یک شنبه 02 آذر 1393, 07:16 صبح
سلام
اونوقت اگه يهو وسط كار كه فيلد active رو true كرديم برق رفت چي ؟! يا اينكه كامپيوتر ريست شد، اينطوري بقيه كاربران ديگه نمي‌تونن اون ركورد رو ويرايش كنند چون همش فكر مي‌كنند كسي در حال ويرايشه

m.4.r.m
یک شنبه 02 آذر 1393, 20:48 عصر
این اتفاق به ندرت می تونه رخ بده چون تو نرم افزار های حسابداری وقتی می خوان رکوردی رو ادیت کنن می گن فلانی فلان فاکتور رو ادیت کن. و در یک آن چند کاربر یک فیلد رو باز نمی کنن .
میتونی داخل یه تایمر هر 5 ثانیه یکبار اطلاعات رو رفرش کنه استفاده کنی

vbhamed
یک شنبه 02 آذر 1393, 20:54 عصر
سلام
اما اين اصلا دليل قابل قبولي نيست
برنامه بايد طوري نوشته بشه كه كاربر اصلا امكان اشتباه كردن رو نداشته باشه نه اينكه كاربر رو مجبور كنيم دقت كنه تا اشتباه نكنه

kitcat_m18
پنج شنبه 13 آذر 1393, 07:42 صبح
سلام
آقا حامد پیشنهاد شما برای این کار چیه؟
من به شخصه از یه جدول و یه تایمر استفاده کردم
و دو تا روال هم دارم
یکی برای چک کردن قفل بودن سند و یکی برای آپدیت کردن قفل سند(فیلد زمان در جدول قفل)
این تایمر هر 20 ثانیه یه بار میاد چک می کنه که آیا کاربر در حال استفاده کردن از سند هست یا خیر
اگه باشه رکورد مربط به اون سند رو زمانش رو آپدیت می کنه
انطوری اگه برقم بره و کاربر نتونه خارج بشه چون تو کوئری چک کردن قفل بودن سند تا 20 ثانیه قبل رو چک می کنه مشکلی پیش نمیاد
نمی دونم تونستم منظورمو برسونم یا نه

Naghibi
پنج شنبه 13 آذر 1393, 08:23 صبح
سلام
برای
Sync کردن رکوردست با دیتابیس من پیشنهاد می کنم اگه دیتابیس تون SQL هست از سرویس SQL Dependency استفاده کنین. با این روش هر تغییری که توی جدول مورد نظرتون اتفاق بیفته یه Notification تو برنامه براتون میاد. یه سرچ بزنین کلی نمونه براش پیدا می کنین.

vbhamed
جمعه 14 آذر 1393, 00:20 صبح
سلام
آقا حامد پیشنهاد شما برای این کار چیه؟
من به شخصه از یه جدول و یه تایمر استفاده کردم
و دو تا روال هم دارم
یکی برای چک کردن قفل بودن سند و یکی برای آپدیت کردن قفل سند(فیلد زمان در جدول قفل)
این تایمر هر 20 ثانیه یه بار میاد چک می کنه که آیا کاربر در حال استفاده کردن از سند هست یا خیر
اگه باشه رکورد مربط به اون سند رو زمانش رو آپدیت می کنه
انطوری اگه برقم بره و کاربر نتونه خارج بشه چون تو کوئری چک کردن قفل بودن سند تا 20 ثانیه قبل رو چک می کنه مشکلی پیش نمیاد
نمی دونم تونستم منظورمو برسونم یا نه

سلام
چند راه وجود داره
يكي همين راهي كه خودتون استفاده كردين
اگر از Sql server استفاده مي‌كنيد خودش هم امكاناتي داره مثل تريگرها و ...
از Winsock هم ميشه استفاده كرد به اين شكل كه هر برنامه اي خواست ركوردي رو ويرايش كنه يك درخواست به ساير كامپيوترها مي‌فرسته تا ببينه كسي در حال استفاده هست يا نه و اگر كامپيوتري در حال استفاده نبود يا جوابي به درخواست نداد يعني ركورد آزاده

البته روش بهتر روش تركيبي است چون فرض كنيد درون فيلدهاي يك جدول فيلدي براي اينكار اختصاص بدين و تايمر 20 ثانيه اي هم گذاشتيد، اينطوري از لحظه درخواست تا حداكثر 20 ثانيه بعد بايد صبر كنيد تا مطمئن باشيد كه كامپيوتر طرف در حال استفاده هست يا خير ولي اگر هر كامپيوتري كه ركوردي رو ويرايش مي‌كنه مشخصاتي از خودش رو در اين فيلد بنويسه مثلا نام كامپيوتر و ...، كامپيوتر دوم كه مي‌خواد همون ركورد رو ويرايش كنه ابتدا مقدار اون فيلد رو چك مي‌كنه و اگر اون فيلد خالي نبود يك درخواست با winsock به كامپيوتري كه نامش در اون فيلد نوشته شده ميده تا كسب تكليف كنه و اگر اون كامپيوتر جوابي نداد يعني يا خاموشه يا شبكه‌ش قطع هست يا ... و خلاصه اينكه مي‌تونيد ركورد رو ويرايش كنيد و اگر هم جواب داد يا اجازه ويرايش رو ميده يا نه

خوبي اين روش اينه كه فقط به همون كامپيوتري كه آخرين بار در حال ويرايش بوده درخواست مي‌‌فرستيد و اگر تعداد كلاينتها زياد باشه ترافيك اضافي هم روي شبكه ايجاد نميشه و زمان انتظار براي پاسخ هم كمتر ميشه

البته حتما هم نياز نيست در همه جداول فيلد اضافي در نظر بگيريد كه سربار ديتا داشته باشيد، مي‌تونيد تو كل ديتابيس يك جدول "عمليات جاري" داشته باشيد شامل فيلدهاي نام جدول، شماره Id ركورد، نام كامپيوتر، نام عمليات

يك كامپيوتر، هر جدولي و هر ركوردي رو خواست ويرايش كنه ابتدا در جدول "عمليات جاري" يك ركورد اضافه مي‌كنه كه فيلدهاي اون رو پر مي‌كنه، كامپيوتر دوم هم قبل از ويرايش ركورد ابتدا جدول "عمليات جاري" رو چك مي‌كنه ببينه آيا كامپيوتري هست كه در حال ويرايش اون جدول و ركورد خاص باشه يا نه و وقتي كار ويرايش تموم شد بايد ركورد ثبت شده در اين جدول پاك بشه

البته چون تعداد درج و حذف ركورد در جدول "عمليات جاري" زياده بهتر اينه كه به جاي حذف يك ركورد، مقدار فيلدهاش خالي بشه و هر موقع كامپيوتري خواست عملياتي انجام بده و ركوردي به اين جدول اضافه كنه ابتدا چك كنه آيا سطري با فيلدهاي خالي در اين جدول وجود داره يا نه و اگر وجود داشت از همون ركورد استفاده كنه و در غير اينصورت ركورد جديد درج كنه، اينطوري بر اثر حذف و اضافه زياد ركورد، اندازه ديتابيس بيخودي بزرگ نميشه

اين كار مشابه اين هست كه شما يك دفترچه داشته باشيد و در برگهاش چيزي بنويسيد و بعدش برگ رو بكنيد بندازيد دور يا اينكه با مداد بنويسيد و وقتي نخواستيد با پاك كن پاكش كنيد و دوباره چيز جديدي بنويسيد، اينطوري كاغذهاتون خيلي دير تموم ميشه و در عمل ممكنه اصلا تموم نشه

kitcat_m18
جمعه 08 اسفند 1393, 15:06 عصر
سلام حامد جان
ببخشید دیر به این تاپیک جواب دادم
والا در رابطه با نظراتت کاملا باهات موافقم
در مورد اون قسمت هم که یه سره رکورد ها رو پاک نکینم باید بگم که با پیشهاد شما کد بیشتری باید زد اما با این روش کد کمتری میشه استفاده کرد
حالا بحثی درش نیست و نظر شما منطقی و محترمه و بعضی چیزا سلیقه ای هست
Naghibi عزیز پیشنهاد شما رو هم بررسی می کنم

ممنون از همه :بوس: