PDA

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



gholami146
دوشنبه 09 بهمن 1391, 00:51 صبح
سلام
من برنامه ای دارم مینویسم که در اون چند کاربر به بانک sql وارد می شوند و بطور همزمان از اطلاعات استفاده می کنن
میخوام ببینم ایا راهی هست تا من متوجه بشم ایا اطلاعات موجود در بانک توسط دیگر کاربران تغییر کرده یا نه
که اگر جواب اره بود من کانکشنم رو اپ دیت کنم
من برای اتصال به بانک از unidac استفاده می کنم

سعید صابری
دوشنبه 09 بهمن 1391, 21:58 عصر
SQL Server Notification Services برای همچنین کاری است.

fahimi
دوشنبه 09 بهمن 1391, 22:55 عصر
با سلام
من در این خصوص در اینترنت جستجو زیادی کردم ولی نتیجه ای نداشت. مثال های زیادی جهت سی شارپ پیدا کردم ولی متاسفانه مثالی برای دلفی پیدا نکردم -پشنهاد دوستان محترم استفاده از کامپوننت SDAC بود که قابلیت های ServiceBroker ,ChangeNotification رادر این زمینه دارد ولی من نتوانستم پیاده سازی کنم (انتظار این است هر گونه تغییر در تیبل در دبی گرید کلاینت نیز تغییر کند )

SQL Server Notification Services برای همچنین کاری است.

DelphiProgrammer
سه شنبه 10 بهمن 1391, 14:52 عصر
سلام علیکم.
نمیدونم از چه دیتابیسی استفاده میکنید ولی اون CursorLocation که از propertyهای ADODataSet هست دو مدل داره. که یکیش مربوط به سرور هست.
یک راه حل ساده برای یک دیتابیسی که این ویژگی رو نداره میتونه یک راه حل ابتکاری باشه. من یکبار این کار رو کردم. من طبق فرض خودم مساله رو حل میکنم.
فرض میکنم یک برنامه سرور وجود داره و اونه که تغییرات رو اعمال میکنه روی سرور و هیچ کلاینتی خودش مستقیما داده رو دستکاری نمیکنه و میاد درخواست تغییر داده رو میده به اون برنامه سرور و اونه که براش انجام میده.
در این حالت من میام روی کلاینت یک TIdTCPServer میزارم. قرار نیست اتصال گرا باشه کارمون. هر کلاینت خودش یک جورایی سرور میشه! :D البته میگم این شیوه رو من خودم در نمودم. شاید در چارچوب بعضی از معماری های نرم افزار هم نگنجه. ولی مساله رو حل میکنه. وقتی یک تغییر بر روی یک Table اعمال میشه یک جور Notification رو برای هر کلاینت (وقتی کلاینت کار خودش رو شروع میکنه به سرور اعلام میکنه که من با این IP اومدم توی کار و بعد از اینکه خواست به کارش پایان بده هم میگه خداحافظ من رفتم :D ) فعال میفرسته. یعنی یک ارتباط TCP با اون کلاینت برقرار میکنه (با سروری که روی کلاینت قرار دادیم) و اطلاعات اینکه چه اتفاقی افتاده رو بهش میدیم و بعد هم کانکشن رو میبنیدم. (سربار زیادی نمیزاره.) بعضی ها میان روی کلاینت هم TIdTCPClient میزارن و بعد یک تایمر میزارن و هی از سرور فلک زده میپرسن چی شد؟ تغییری انجام شده یا نه! که من این وضعیت رو نمیپسندم (سلیقه بنده اینطوری هست). در ضمن اطلاعاتی که من به کلاینت میدم داده جدول نیست! بهش میگم آقا این جدول تغییر کرده. حالا اگر فرمی داشته باشه که اون اطلاعات اون جدول توش به نمایش گذاشته شده باشه خودش دوباره تقاضای رفرش کردن رو میده. من میام مستقیم وصلش میکنم به دیتا بیس اینجا. (فقط جهت نمایش!!!)
نتیجه اینکه اگر بخواید به این شیوه هر تغییری که روی یک جدول رخ میده رو بقیه ببینن درجا باید یک برنامه سروری داشته باشید که تقاضا به اون ارسال بشه و خود کلاینت نیاد مستقیما به دیتا بیس وصل بشه جهت دستکاری داده. البته میتونه جهت خوندن داده ها مستقیم وصل بشه و کلاینت هم باید خودش یکجوری سرور بشه که سروره وقتی یک داده ای رو تغییر داد به بقیه بگه آقا من تغییر دادم اینجا رو!
در آخر شاید بعضی بگن وای چه کثافتکاری ای! منم میگم اصلا کثافت کاری نیست. و بسیار هم میشه همین کار رو تر و تمیز انجام داد. :دی

firststep
سه شنبه 10 بهمن 1391, 15:49 عصر
ببین عزیزم راه حل های زیادی موجوده

بهترین وبا قاعده ترین همونی هستش که اقای صابری فرمودند
توی همین سایت SQL NOTIFICATION V رو جستجو کن در تالار های دلفی
این هم می تونه کمک کنه
لینک (http://barnamenevis.org/showthread.php?119032-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Notification-%D9%85%D8%B1%D8%A8%D9%88%D8%B7-%D8%A8%D9%87-SQL-2005-%D8%AF%D8%B1-%D8%AF%D9%84%D9%81%DB%8C%D8%9F&highlight=Server+Notification)

اما برای راه کاریه اقای DelphiProgrammer
بهتره که از TRIGER های خوده SQL SERVER استفاده کنی

موفق سربلند باشید


راستی کامپوننت های هم هستن که این کار رو اتوماتیک انجام بدن از سرچتون متوجه می شید............
صلوات

DelphiProgrammer
سه شنبه 10 بهمن 1391, 16:08 عصر
البته صحبت firststep درست هست. ولی ممکن هست ایشون مثلا دیتابیسشون Access باشه که همچین قابلیتی رو تا جایی که بنده اطلاع دارم ندارد. اونی که من اون بلا رو بر سرش آوردم Access بود.

سعید صابری
سه شنبه 10 بهمن 1391, 17:14 عصر
البته صحبت firststep درست هست. ولی ممکن هست ایشون مثلا دیتابیسشون Access باشه که همچین قابلیتی رو تا جایی که بنده اطلاع دارم ندارد. اونی که من اون بلا رو بر سرش آوردم Access بود.
تا جایی که من یادمه معمولا به اکسس بیشتر به یک دیتابیس تک کاربره نگاه می کنند تا شبکه.در تک کاربره فکر کنم نیازی نباشه به چنین سرویسی.