PDA

View Full Version : تشخیص آنی رکورد جدید در جدول



Neeloofar
یک شنبه 22 بهمن 1385, 14:59 عصر
سلام

برای اینکه بتونم منظورم خوب مطرح کنم یک مثال میزنم.

یک جدول در SQL داریم که میخوایم به محض اینکه رکوردی جدید توسط کاربر اول (در شبکه) در اون ثبت شد، کاربر دوم مطلع بشه. میشه هم گفت مسنجر.
راه حل منطقی چیه؟

خودم یک راه به ذهنم میرسه که برنامه‌ی هر کاربر توسط یک تایمر به صورت مداوم (هر 5 ثانیه) وجود رکورد جدید رو چک کنه. ولی در این روش ترافیک شبکه بالا میره و برنامه تقریبا مشغول هست. و ممکنه در هر بار چک کردن، برنامه برای باز کردن جدول یک ایست کوتاه داشته باشه.

چه راهکارهای دیگه ای شما پیشنهاد میکنید.

پیشاپیش از همکاریتون متشکرم.

ali_kolahdoozan
یک شنبه 22 بهمن 1385, 15:43 عصر
چرا از socket programing استفاده نمی کنید؟

Neeloofar
یک شنبه 22 بهمن 1385, 18:28 عصر
چرا از socket programing استفاده نمی کنید؟

نمیدونم منظور شما هموم WinSock هست؟ یعنی تبادل با پروتکلهای شبکه.
من که اسم مسنجر رو بردم فقط مثال بود. کاری که میخوام باید مستقیم دیتابیس رو بخونه و از طریق دیتابیس اطلاعات منتقل بشه نه با روش دیگه.
یعنی با socket programing میشه تشخیص داد که رکوردی به جدول اضافه شده؟؟؟
میشه بیشتر توضیح بدید.

vahidiran
یک شنبه 22 بهمن 1385, 19:08 عصر
به نظر من طراحی پایگاه یه جورایی مشکل داره
فکر کنم از ارتباط بین جداول خوب استفاده نکردید البته این نظر منه
حالا اگه بگید برای چیه نیار به دانستن انی دارید شاید یه راهی به نظرمون برسه

ali_kolahdoozan
یک شنبه 22 بهمن 1385, 19:40 عصر
اینطوری شما باید هر چند دقیقه رکوردها رو چک کنید . زیاد جالب به نظر نمیرسه / اگر مشگلتون برای دانشگاه و پروژه و 000 است با همون تایمر حلش کنید بره / اما در عمل این تایمر زیاد جالب نیست / یک کار بهتر بکنید هر وقت رکورد جدید اضافه شد با همون دستورات socket یک پیام برای بقیه کلاینتها بفرستید .

Neeloofar
یک شنبه 22 بهمن 1385, 22:31 عصر
به نظر من طراحی پایگاه یه جورایی مشکل داره
فکر کنم از ارتباط بین جداول خوب استفاده نکردید البته این نظر منه
ربطی به طراحی جدول و دیتابیس نداره.

حالا اگه بگید برای چیه نیار به دانستن انی دارید شاید یه راهی به نظرمون برسه
نمیخواستم زیاد وارد جزئیات بشم. ولی خب یک سیستم کارتابل مکانیزست که کاربران مایلند در صورتی که یک یادداشت یا نامه در کارتابلشان (توسط کاربر دیگه در شبکه) وارد شد سریعا مطلع بشن. میخوام که علاوه بر ثبت سوابق در دیتابیس همزمان با ارسال یادداشت جدید (که منجر به اضافه شدن یک رکورد در جدول میشه) به کاربر مخاطب اطلاع داده شود. (توسط بوق کیس و یک فرم Popup)
به خاطر حساسیت کار، حداکثر زمان اطلاع رسانی رو فقط میتونم تا 15 ثانیه افزایش بدم.
البته میشه کلید رفرش هم گذاشت ولی کاربر فراموش میکنه یا از پشت میز بلند میشه.


اینطوری شما باید هر چند دقیقه رکوردها رو چک کنید . زیاد جالب به نظر نمیرسه / اگر مشگلتون برای دانشگاه و پروژه و 000 است با همون تایمر حلش کنید بره / اما در عمل این تایمر زیاد جالب نیست / یک کار بهتر بکنید هر وقت رکورد جدید اضافه شد با همون دستورات socket یک پیام برای بقیه کلاینتها بفرستید .
هر چند دقیقه:متعجب:زیاده. شرح رو بالا گفتم. پروژه دانشگاهی و اینا نیست. یک غلطی کردیم باید پاش وایستیم.:افسرده:
راستش کابرد کامل سوکت رو نمیدونم چطوریه؟ مطمئنا به دیتابیس نمونه متصل بشه.
ولی یک فکرایی به نظرم رسید.
منتظرم بقیه کاربران نظرشون رو بگن.:لبخندساده:

از همه به خاطر توجهشون متشکرم.:لبخندساده:

DonetKarvb
دوشنبه 23 بهمن 1385, 00:02 صبح
سلام

برای اینکه بتونم منظورم خوب مطرح کنم یک مثال میزنم.

یک جدول در SQL داریم که میخوایم به محض اینکه رکوردی جدید توسط کاربر اول (در شبکه) در اون ثبت شد، کاربر دوم مطلع بشه. میشه هم گفت مسنجر.
راه حل منطقی چیه؟

خودم یک راه به ذهنم میرسه که برنامه‌ی هر کاربر توسط یک تایمر به صورت مداوم (هر 5 ثانیه) وجود رکورد جدید رو چک کنه. ولی در این روش ترافیک شبکه بالا میره و برنامه تقریبا مشغول هست. و ممکنه در هر بار چک کردن، برنامه برای باز کردن جدول یک ایست کوتاه داشته باشه.

چه راهکارهای دیگه ای شما پیشنهاد میکنید.

پیشاپیش از همکاریتون متشکرم.
ُُبا سلام .
اگر از SQL Server 2005 استفاده کنید یک امکانی داره به نام QueryNotification که به سادگی اینکار رو انجام میده. شاید شما حتی به چشم هم قادر به دیدن تغییر نباشید. تغییرات در کمتر از 100 ام ثانیه نمایش داده خواهند شد.



چرا از socket programing استفاده نمی کنید؟
خیلی سخته و به نظر من در اینصورت باید بی خیالش بشه.

به نظر من طراحی پایگاه یه جورایی مشکل داره
فکر کنم از ارتباط بین جداول خوب استفاده نکردید البته این نظر منه
حالا اگه بگید برای چیه نیار به دانستن انی دارید شاید یه راهی به نظرمون برسه
جل الخالق.
اینجا یک فروم است اگر چیزی رو نمیدونید لطفا" دوستان رو گمراه نکنید. تشکر

اینطوری شما باید هر چند دقیقه رکوردها رو چک کنید . زیاد جالب به نظر نمیرسه / اگر مشگلتون برای دانشگاه و پروژه و 000 است با همون تایمر حلش کنید بره / اما در عمل این تایمر زیاد جالب نیست / یک کار بهتر بکنید هر وقت رکورد جدید اضافه شد با همون دستورات socket یک پیام برای بقیه کلاینتها بفرستید .
چرا اینقدر با دانشگاه لجی. یک کم پیشرفت کن برو ببین دنیا چه میکنه. :متعجب: من که اینجوری شدم با دیدن SQL 2005 .

آقا/ خانم نیلوفر من در اولین فرصت برای شما یک مثال خواهم گذاشت فقط شما بگویید که آیا میخواهید از همین ورژن SQL Server استفاده کنید یا خیر.

whitehat
دوشنبه 23 بهمن 1385, 00:35 صبح
خودم یک راه به ذهنم میرسه که برنامه‌ی هر کاربر توسط یک تایمر به صورت مداوم (هر 5 ثانیه) وجود رکورد جدید رو چک کنه. ولی در این روش ترافیک شبکه بالا میره و برنامه تقریبا مشغول هست. و ممکنه در هر بار چک کردن، برنامه برای باز کردن جدول یک ایست کوتاه داشته باشه.استفاده از روش Polling همانطور که خودتان اشاره کردید ترافیک شبکه و اتلاف پهنای باند می شود. در عمل برنامه نویسی سوکت سریعترین راه حل است (البته اگر می خواهید به چیزی شبیه به چت برسید)، اما باید شما تمامی کار ها (مانند مدیریت پورتها و مولتی تردینگ) را بوسیله برنامه نویسی انجام دهید.اما اگر می خواهید از SQL Server و امکانات آن استفاده کنید می توانید از Service Broker استفاده کنید که در نسخه 2000 و 2005 موجود است (Service Broker به شما این امکان را می دهد که بر اساس شرایطی Event خاصی را فعال کنید).در صورتی که از 2005 استفاده می کنید همانطور که دوستمان اشاره داشتند می توانید از Query Notification استفاده کنید.

Neeloofar
دوشنبه 23 بهمن 1385, 00:48 صبح
ُُبا سلام .
اگر از SQL Server 2005 استفاده کنید یک امکانی داره به نام QueryNotification که به سادگی اینکار رو انجام میده. شاید شما حتی به چشم هم قادر به دیدن تغییر نباشید. تغییرات در کمتر از 100 ام ثانیه نمایش داده خواهند شد.

آقا/ خانم نیلوفر من در اولین فرصت برای شما یک مثال خواهم گذاشت فقط شما بگویید که آیا میخواهید از همین ورژن SQL Server استفاده کنید یا خیر.


آقا/ خانم نیلوفر:متعجب::متفکر:

بله SQL 2005. ( وبا VB.NET کار میکنم)
بیصبرانه منتظر هستم.
جسارتا متذکر ب شم من میخوام توسط یک Win App به کاربر وجود رکورد جدید رو هشدار بدم و نه از طریق کنسول SQL.
.
.

ali_kolahdoozan
دوشنبه 23 بهمن 1385, 07:52 صبح
وقتی تغییرات رخ میدهد . باید همه کلاینتها متوجه بشن . خب درسته که 2005 این سرویس رو داره اما به هر حال باید هر چند لحظه چک بشه . مگر اینکه راه شما چیزی غیر از این باشه که باید دید

vahidiran
دوشنبه 23 بهمن 1385, 08:00 صبح
برای تمامی دستورات که پیغام رو می فرستند علاوه بر اینکه در بانک ذخیره شه چک کنه صاحبشو پیدا کنه و پیغام رو هم به او بفرسته
همان طور که دوستمون اشاره ای به ان کرد

Neeloofar
دوشنبه 23 بهمن 1385, 08:25 صبح
برای تمامی دستورات که پیغام رو می فرستند علاوه بر اینکه در بانک ذخیره شه چک کنه صاحبشو پیدا کنه و پیغام رو هم به او بفرسته
همان طور که دوستمون اشاره ای به ان کرد

مشکلی از این بابت نیست.
در رکورد یک فیلد به نام UserID هست که وقتی رکرود جدید اضافه میشه، مقصد پیام توسط UserID مشخص میشه.
یعنی تمامی کلاینتها این جدول رو چک میکنند و اگر رکوردی با UserID خودشون پیدا کردند اونوقت کاربر رو مطلع میکنند.
فقط مشکل تشخیص رکورد هست که منتظر پاسخ دوستمون DonetKarvb هستم.
البته من در MSDN در مورد QueryNotification سرچ کردم و چندتا نمونه پیدا کردم. ولی خیلی خطا داره. نمیدونم اشکال کار کجاست.

mostafa_leman
دوشنبه 23 بهمن 1385, 09:16 صبح
آیا میشه sql server رو به یک فیلد خاص از یک Table حساس کرد که یک پیغام به ما بده ؟ من یک برنامه نوشتم که تو اون یک سری سفارش ثبت میشه . اما تنها راهی که برای به ذهنم رسید تا به کاربر اعلام کنم که سفارش رو آماده کنند همین Timer بود .

DonetKarvb
دوشنبه 23 بهمن 1385, 21:31 عصر
آیا میشه sql server رو به یک فیلد خاص از یک Table حساس کرد که یک پیغام به ما بده ؟ من یک برنامه نوشتم که تو اون یک سری سفارش ثبت میشه . اما تنها راهی که برای به ذهنم رسید تا به کاربر اعلام کنم که سفارش رو آماده کنند همین Timer بود .
این برنامه به کوئری حساس است. شما میتونید کوئری رو جوری تنظیم کنید که فقط روی اون فیلد تمرکز کنه.


:متعجب::متفکر:

بله SQL 2005. ( وبا VB.NET کار میکنم)
بیصبرانه منتظر هستم.
جسارتا متذکر ب شم من میخوام توسط یک Win App به کاربر وجود رکورد جدید رو هشدار بدم و نه از طریق کنسول SQL.
.
.
** منظورم از آقا/ خانم این بود که میتواند نیلوفر نام خانوادگی باشد( که مرد هم میشه) و یا اسم

بله این پروژه ای رو که برای شما فرستادم دقیقا" با VB.Net 2005 و ADO.Net 2.0 و SQL Server 2005 تحت ویندوزWinAPP نوشته شده است.

وقتی تغییرات رخ میدهد . باید همه کلاینتها متوجه بشن . خب درسته که 2005 این سرویس رو داره اما به هر حال باید هر چند لحظه چک بشه . مگر اینکه راه شما چیزی غیر از این باشه که باید دید
غیر از این هست. ببین و حالشو ببر.

DonetKarvb
دوشنبه 23 بهمن 1385, 21:40 عصر
با سلام
دوستان این یک برنامه است و دقیقا" همینکار رو میکنه که شما میخواید
یک کوئری نوشته شه که به اطلاعات مشتریانی که از کشور UK هستد حساس میباشد. شما بعد از اجرای برنامه به سراغ دیتابیس NorthWind و جدول Customers رفته و اطلاعات یکی از مشتریان که در این حیطه هستند را ویرایش کنید. البته به Insert ,Delete,Update حساس هست.
این برنامه رو خودم ننوشتم و از اینترنت گرفتم
تقدیم به دوستان عزیز:

Neeloofar
دوشنبه 23 بهمن 1385, 23:51 عصر
با سلام
دوستان این یک برنامه است و دقیقا" همینکار رو میکنه که شما میخواید
یک کوئری نوشته شه که به اطلاعات مشتریانی که از کشور UK هستد حساس میباشد. شما بعد از اجرای برنامه به سراغ دیتابیس NorthWind و جدول Customers رفته و اطلاعات یکی از مشتریان که در این حیطه هستند را ویرایش کنید. البته به Insert ,Delete,Update حساس هست.

من اجرا کردم، ولی چون از کانکشن استرینگ شما ایراد میگرفت:

An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

برای همین اینطوری کردم:



"server=MY-SERVER\SQLEXPRESS;Integrated Security=SSPI;Database=Northwind;Pooling=False; failover partner=.\sql2005_2"


در مورد تغییرات هم هیچ عکس العملی نشون نمیده. چه با دستور Insert ,Delete,Update و از طریق خود سلولها و غیره.

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

DonetKarvb
سه شنبه 24 بهمن 1385, 00:01 صبح
من اجرا کردم، ولی چون از کانکشن استرینگ شما ایراد میگرفت:

An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)برای همین اینطوری کردم:



"server=MY-SERVER\SQLEXPRESS;Integrated Security=SSPI;Database=Northwind;Pooling=False; failover partner=.\sql2005_2"
در مورد تغییرات هم هیچ عکس العملی نشون نمیده. چه با دستور Insert ,Delete,Update و از طریق خود سلولها و غیره.

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

کانکشن استرینگ رو به این صورت در بیاورید:

"server=MY-SERVER\SQLEXPRESS;Integrated Security=SSPI;Database=Northwind;"
در بخش Option های دیتابیس SQl Service Broker رو حتما" فعال کنید.
تغییراتی رو که انجام میدهید باید روی مشتریانی باشد که در کشور UK زندگی میکنند.
البته اگر کوئری را به این صورت تغییر دهید :
Select * From Customers
با هر تغییر در جدول customers شما شاهد تغییرات خواهید بود.

Neeloofar
سه شنبه 24 بهمن 1385, 00:42 صبح
کانکشن استرینگ رو به این صورت در بیاورید:

"server=MY-SERVER\SQLEXPRESS;Integrated Security=SSPI;Database=Northwind;"
در بخش Option های دیتابیس SQl Service Broker رو حتما" فعال کنید.
تغییراتی رو که انجام میدهید باید روی مشتریانی باشد که در کشور UK زندگی میکنند.
البته اگر کوئری را به این صورت تغییر دهید :
Select * From Customers
با هر تغییر در جدول customers شما شاهد تغییرات خواهید بود.

من تمام موارد فوق رو رعایت کردم غیر از این :



در بخش Option های دیتابیس SQl Service Broker رو حتما" فعال کنید.


هر چی گشتم چنین گزینه ای در Properties دیتابیس و سرور پیدا نکردم.
باید سرویس خاصی رو نصب کنم. یا موقع نصب SQL گزینه ای رو تیک نزدم؟

DonetKarvb
سه شنبه 24 بهمن 1385, 09:34 صبح
اینو یه تستش بکن

USE master ;
GO

ALTER DATABASE Northwind SET ENABLE_BROKER ;
GO

Neeloofar
سه شنبه 24 بهمن 1385, 09:47 صبح
سلام

فرمان بالا درست اجرا شد.

ولی باز هم بی خیال نسبت به تغییرات عمل میکنه.

من یک New Query باز میکنم و این دستور رو توش میدم:



UPDATE Customers
SET City = 'er'
WHERE (Country = 'uk') AND (CustomerID = 'AROUT')


و اجرا میکنم. با کلیک کردن مجدد Get Data تغییرات ملاحظه میشه (در گرید) ولی هنوز هم تعداد تغییرات رو 0 میزنه.
همه موارد فوق رو رعایت کردم نمیدونم کجای کار من اشکال داره؟

در ضمن فکر نکنم به دیتابیس ربطی داشته باشه. ولی من چون دیتابیس Northwind رو نداشتم فقط تونستم ورژن 2000 دیتابیس رو از سایت MS پیدا کنم و Attach کنم.

titbasoft
سه شنبه 24 بهمن 1385, 10:32 صبح
می توانید از Service Broker استفاده کنید که در نسخه 2000 و 2005 موجود است توی 2K هم سرویس بروکر داریم؟

Neeloofar
سه شنبه 24 بهمن 1385, 14:52 عصر
سلام

من برنامه روی یک دیتابیس دیگه آزمایش کردم.
این بار با اجرای فرم و فرمان GetData شروع میکنه به بالا رفتن تغییرات. و برنامه توی یک حلقه میافته. در صورتی که اصلا تغییراتی ندادم.

میشه لطف کنید و دیتابیسی که خود شما استفاده میکنید رو یک بک آپ یا یک کپی از اون تهیه و بفرستید. شاید تنظیمات دیتابیس فرق بکنه.
برای کم شدن حجم جداول اضافیش رو پاک کنید.

Neeloofar
چهارشنبه 25 بهمن 1385, 08:54 صبح
ظاهرا این فناوری برای خیلی ها جا نیافتاده (از جمله خودم) چون تو اینترنت هم میگردم همش 4 تا دونه مثال اونم تکراری گیرم می آید که توضیح درست و کاملی ندارند.
MSDN (آنلین و آفلین) هم کم لطفی کرده.
مثل اینکه فعلا باید با همون تایمر یکجورایی کارم رو راه بندازم.

DonetKarvb
چهارشنبه 25 بهمن 1385, 09:12 صبح
کسی دیگه ای این برنامه رو چک نکرده؟ 8 بار دانلود داشتیم حدا اقل دو نفر دانلود کردند که ایا اون یکی دوستمون هم مشکل داشتند؟

Payam Moradi
چهارشنبه 25 بهمن 1385, 09:20 صبح
ظاهرا این فناوری برای خیلی ها جا نیافتاده (از جمله خودم) چون تو اینترنت هم میگردم همش 4 تا دونه مثال اونم تکراری گیرم می آید که توضیح درست و کاملی ندارند.
MSDN (آنلین و آفلین) هم کم لطفی کرده.
مثل اینکه فعلا باید با همون تایمر یکجورایی کارم رو راه بندازم.

نیلوفر خانم. گر صبر کنی ...

درسته در اینترنت نمونه ها کمیاب هستند.
ولی این یکی درست کار میکنه و مشکل نداره.
درسته پایگاه داده باید یک سری تنظیمات رو تغییر بدی و یک سری سرویس تعریف کنی.
مثال دوستمون هم DonetKarvb تقریبا درسته ولی نگفته که باید سرویس های notification برای یک پایگاه داده تعریف بشه. احتمالا بانکی که ایشون روی سیستمشون دارند این سرویس ها رو داره.
در هر صورت این نمونه دارای یک فایل SQL هست که خودش یک بانک ایجاد میکنه و تنظیمات و سرویس های لازم در اون انجام میشه.
ابتدا Database.sql رو اجرا کنید.
سپس تغییرات Connection String رو در سورس برنامه برای سرور خود انجام بدید.
بعد هم خروجی EXE برنامه رو دو بار اجرا کنید و دو تا کاربر مختلف رو انتخاب کنید.
حالا در سیستم خودتون دو تا کاربر با هم چت میکنن. تغییرات بصورت آنی (همونطور که میخواید) به کاربر دیگه اطلاع داده میشه.

ضمنا سورس این برنامه با C# هست. من فرصتی برای تبدیل کد به وی بی ندارم.

موفق و مؤید باشید.:چشمک:

Neeloofar
چهارشنبه 25 بهمن 1385, 09:37 صبح
خیلی ممنون.
درسته این همون چیزی بود که میخواستم.:لبخندساده:
نه یک خورده C# سرم میشه. لزومی به تبدیل نیست.

خیلی متشکر!


کسی دیگه ای این برنامه رو چک نکرده؟ 8 بار دانلود داشتیم حدا اقل دو نفر دانلود کردند که ایا اون یکی دوستمون هم مشکل داشتند؟
احتمالا بیشتر هم دانلود شده. چون من هر وقت از اینجا چیزی دانلود میکنم، بازم با رفرش صفحه تعداد دانلود شده ثابت میمونه.
از شما DonetKarvb هم متشکرم.

DonetKarvb
چهارشنبه 25 بهمن 1385, 09:39 صبح
درسته پایگاه داده باید یک سری تنظیمات رو تغییر بدی و یک سری سرویس تعریف کنی.
مثال دوستمون هم DonetKarvb تقریبا درسته ولی نگفته که باید سرویس های notification برای یک پایگاه داده تعریف بشه. احتمالا بانکی که ایشون روی سیستمشون دارند این سرویس ها رو داره.
من در پستی جدا به ایشون گفته بودم که این بخش رو فعال کنند و ایشون هم فعال کردند .


اینو یه تستش بکن

USE master ;
GO

ALTER DATABASE Northwind SET ENABLE_BROKER ;
GO

whitehat
چهارشنبه 25 بهمن 1385, 11:09 صبح
توی 2K هم سرویس بروکر داریم؟
با عرض پوزش :خجالت: ، این سرویس در SQL 2005 وجود دارد و قابل استفاده است (ضمن اینکه در جایی خواندم که این سرویس در 2000 موجود بوده اما فقط خود سیستم از آن استفاده می کند). اما برای یک همچنین کاری در 2000 می توانید از همان Notification Services (http://www.microsoft.com/technet/prodtechnol/sql/2000/technologies/ntfcsvcs.mspx) استفاده نمائید.

Payam Moradi
چهارشنبه 25 بهمن 1385, 22:23 عصر
اونایی که با C# مشکل دارند، خیلی ساده کردم و با VB.Net نوشتم.:چشمک:
.

Payam Moradi
چهارشنبه 25 بهمن 1385, 23:03 عصر
این سورس آقای DonetKarvb با دیتابیس Northwind منتها با اجرای فایل northwind.sql ابتدا دیتابیس را ایجاد کنید.
آقای DonetKarvb زحمت پیدا کردن فرق دیتابیسی که northwind.sql میسازه با دیتابیس Northwind که در SQL نصب هست با خودتون.
کد شما موردی نداره و فقط دیتابیس باید یک تغییراتی بکنه.
ضمنا یک تغییر کوچیک هم در کد دادم. بهتره از یک SP استفاده کنید. :چشمک:

DonetKarvb
چهارشنبه 25 بهمن 1385, 23:08 عصر
ضمنا یک تغییر کوچیک هم در کد دادم. بهتره از یک SP استفاده کنید. :چشمک:
استفاد از SP یکی از علایق بنده هست. ولی خوب میتونم بپرسم اینجا فرقشون چیه؟ شاید یکی نخواد از SP استفاده کنه......

Payam Moradi
چهارشنبه 25 بهمن 1385, 23:19 عصر
استفاد از SP یکی از علایق بنده هست. ولی خوب میتونم بپرسم اینجا فرقشون چیه؟ شاید یکی نخواد از SP استفاده کنه......
دلیل منطقی نداره! در این مورد من نتیجه ی مطلوب نگرفتم. شما هم تست کنید.:چشمک:

Neeloofar
پنج شنبه 26 بهمن 1385, 08:58 صبح
سلام

نمونه کد جناب DonetKarvb با اصلاحاتی که آقای مرادی انجام دادند و دیتابیسی (northwind.sql) که ارسال کردند، درست شد. البته کد DonetKarvb کاملتره چون نحوه تغییرات رو هم نشون میده.
من هم با SP که کار میکنم جواب میده ولی با کوئری نمیدونم چرا جواب نمیده.

در مجموع یک پروژ کامل و بدون نقص شد.
از آقای مرادی و DonetKarvb سپاسگذارم.:لبخندساده:

TuneUp
شنبه 28 بهمن 1385, 21:59 عصر
آیا توی وب هم میشه همچین کار روی کرد؟

Payam Moradi
پنج شنبه 10 اسفند 1385, 00:16 صبح
آیا توی وب هم میشه همچین کار روی کرد؟
من امکان تست ندارم. ولی حتما میشه.

shahram197070
شنبه 18 فروردین 1386, 14:56 عصر
با سلام
دوستان عزیز و پیشکسوت
امکان داره عملیات فوق را با sql server 2000 پیاده کرد .

محسن بابائی
دوشنبه 20 فروردین 1386, 06:23 صبح
اگر بشه با sqlserver2000 پیاده سازی بشه خیلی عالی می شه. چون اکثرا هم با همین ورژن دارند کار می کنند.

DonetKarvb
دوشنبه 20 فروردین 1386, 11:08 صبح
ابتدای همین بحث توضیح داهد شده بود که نمیشه. به این دلیل که این سرویس فقط در SQL Server 2005 وجود دارد و از طرفی ADo.Net 2.0 هست که میتواند از این سرویس استفاده کند.
برای SQL 2000 راه هایی وجود دارد. مثل سوکت پروگرمینگ که کار دشوار و سختیه همچنین استفاده از notification Service که باید آنرا به صورت یک بسته جدا گرفت و نصب کرد. در مجموع عرض کنم که این کار در SQL 2000 به سختی قابل انجامه.

asilverisis
شنبه 27 مرداد 1386, 13:35 عصر
سلام
من کدها رو دانلود کردم ، درست کار می کنن ولی وقتی همون کدها رو برای دیتابیس خودم تغییر میدم رویداد MyChangeEvent مثل یک حلقه بی نهایت مدام اجرا می شه بدون اینکه هیچ تغییری در دیتابیس داده بشه.

باتشکر.

MH2538
یک شنبه 28 مرداد 1386, 08:53 صبح
سلام
دوستان من یک همچین پروژه ای رو قبلاً نوشتم.
شما از همون اول دارید راه رو استباه می رید. در اینکار نباید روی دیتابیش اتکا داشت چون همینجوریش هم تحت فشاره چه برسه به این که بخواد تصمیمات این تیپی هم بگیره.
راه حل استفاده از MultiTier‌است.
شما هر درج اطلاعات که می خواید انجام بدید به لایه میانی یا همون BusinessLayer میگید.اون لایه هم ، هم اطلاعات رو وارد بانک اطلاعاتی می کنه هم یک Notification به Clientهایی که باید خبر دار شن می فرسته.

asilverisis
دوشنبه 29 مرداد 1386, 03:03 صبح
سلام
اگه امکانش هست در مورد ارسال Notification بیشتر توضیح بدین.
من هم به نظر خودم این راه بهتریه چون باعث کم شدن ترافیک شبکه هم میشه.
ممنون

hooooman
دوشنبه 29 مرداد 1386, 11:07 صبح
ابتدای همین بحث توضیح داهد شده بود که نمیشه. به این دلیل که این سرویس فقط در SQL Server 2005 وجود دارد و از طرفی ADo.Net 2.0 هست که میتواند از این سرویس استفاده کند.
برای SQL 2000 راه هایی وجود دارد. مثل سوکت پروگرمینگ که کار دشوار و سختیه همچنین استفاده از notification Service که باید آنرا به صورت یک بسته جدا گرفت و نصب کرد. در مجموع عرض کنم که این کار در SQL 2000 به سختی قابل انجامه.

میشه توضیح مختصری بدین که حالا اگه این Notification رو نصب کردیم چطوری ازش استفاده باید کرد؟

asilverisis
چهارشنبه 07 شهریور 1386, 11:25 صبح
سلام
من از کدی که در همین تاپیک گذاشته شده بود استفاده کردم و کاملا جواب گرفتم ولی حالا من فرمی دارم که نیاز ندارم هیچگونه Load اطلاعات توی اون صورت بگیره، فقط باید از تغییرات دیتابیس مطلع بشه و پیغام بده و در صورت نیاز کاربر فرمی باز بشه که اطلاعات مورد نظر رو load کنه.
حالا من دقیقا از همون کد فقط قسمت load یا Fill رو حذف کردم ولی جواب نمی ده و MychangeEvent اجرا نمیشه.
مشکل دومی که با گذاشتن یک Msgbox متوجه شدم اینه که به ازای هر تغییر 2 بار رویداد MychangeEvent رخ میده و اجرا میشه.
با تشکر

این هم کدی که من استفاده می کنم (پست 16)
http://barnamenevis.org/forum/showthread.php?p=386725#post386725

asilverisis
شنبه 17 شهریور 1386, 19:20 عصر
سلام
کسی راه حلی برای این کار نداره؟
بدون load کردن اطلاعات نمی شه متوجه تغییرات شد؟؟
لطفا...
با تشکر

omidmehraban
شنبه 31 شهریور 1386, 03:15 صبح
با سلام و احترام
من برای فعال کردن Service Broker این Query را اجرا می کنم:


USE master ;
GO

ALTER DATABASE Northwind SET ENABLE_BROKER ;
GO
رو دستگاه خودم جواب داد ولی بروی دستگاه دیگری که اجراش می کنم،هیچ وقت خاتمه پیدا نمی کنه.یعنی وقتی دکمه Execute را می زنم اجرای دستور شروع میشه و پایین صفحه هم کنتور می ندازه میره به امان خدا.یک بار تا 6 یا 7 دقیقه صبر کردم ولی کاسه صبرم لبریز شد و این topic را فرستادم.
این دستور را برای تشخیص آنی رکورد جدید در جدول (http://barnamenevis.org/forum/showthread.php?t=61258&page=3) استفاده می کنم

hamed_bostan
شنبه 31 شهریور 1386, 10:17 صبح
سلام

خودم یک راه به ذهنم میرسه که برنامه‌ی هر کاربر توسط یک تایمر به صورت مداوم (هر 5 ثانیه) وجود رکورد جدید رو چک کنه. ولی در این روش ترافیک شبکه بالا میره و برنامه تقریبا مشغول هست. و ممکنه در هر بار چک کردن، برنامه برای باز کردن جدول یک ایست کوتاه داشته باشه.



از چه ورژنی از sqlserver استفاده می کنی؟؟؟ اگه از 2005 استفاده میکنی که قابلیت notification اگه درست گفته باشم توی اون هست ,و اگه از 2000 استفاده میکنی یه نگاه به شاهکار اقای راد بنداز البته این تو بخش asp هست اما ماهیت کار فرقی نداره:

http://barnamenevis.org/forum/showthread.php?t=77847

ice007
یک شنبه 13 آبان 1386, 10:08 صبح
با سلام

من یک برنامه نوشتم و از این کدها استفاده کردم ولی مشکلی که دارم اینه که در شبکه وقتی این برنامه را روی دو کامپیوتری که به یک اس کیو ال سرور وصل هستند امتحان کردم هر برنامه جداگانه واکنش نشان داد یعنی هر دو کامپیوتر با هم واکنش نشان ندادند یعنی تک تک واکنش نشان میدهند و با توجه به اینکه کامند رو در هر برنامه جداگانه تعریف می کنیم به نظرم باید همین اتفاق بیافته؟ راه حل چیه؟
با تشکر

armin656
یک شنبه 20 آبان 1386, 13:34 عصر
برای رسیده به این هدف دوست عزیز راهی های زیادی هست دو ستان راهنمایی های خوبی کردن همون سوکت خوبه و جواب هم می ده
اما شما سعی کنید مثل سیستم عامل عمل کنید یعنی یه اطاقی بسازید که هر کسی از استاد سوال داشت دستشو بالا بگیره و بپرسه نه این که استاد از تک تک دانشجویان سوال کنه که ایا سوالی دارند یا نه!!!!!!!!!!!!!!!!!!!!!!!!!
فکر کنم متوجه منظورم شدید منظورم <<< وقفه >>> بود
در اسکیوال سرور می تونید برای هر جدول یک یا چند تریگر بنویسید که بعد فلان تغییرات یه کاری رو انجام بده همین برای شما کافیه
یعنی یک تریگر بنویسید که بعر از اظافه شده یک نامه به جدول برای کاربر مربوطه یک وقفه ارسال بشه که متوجه بشه یک نامه جدید امده
به نظرم بهترین روش اینه در 2000 اما در 2005 که دیگه خیلی تغییرات داریم و قدرت بیشتر شده

arman_Delta2002
پنج شنبه 22 آبان 1393, 17:27 عصر
سلام من هم با این که کد

USE master ;
GO

ALTER DATABASE Northwind SET ENABLE_BROKER ;
GO




واسه بانک اطلاعاتیم زدم و یک StoredProcedure تعریف کردم و فقط در سورس prj_QueryNotification.rar‏ (http://barnamenevis.org/attachment.php?attachmentid=6914&d=1171483413) نام دیتا بیس و به نام دیتا بیس خودم تقییر دادم ولی کار نکرد ؟!
(نام استرینگ کامند هم نام بود با StoredProcedure مثال )
روی اس کیو ال 2014 دارم تست میکنم مثال کار مکینه ولی برنامه تغییر داده شده من بار اول رکورد ها رو میاره ولی ایونت رو تشخیص نمیده !
یک مثال تصویری از notification برای یک پایگاه داده تعریف سرویس و تنظیم اون بزارین لطفا
با این دستور هم صحت فعال بودن بروکر رو تست کردم

SELECT NAME, IS_BROKER_ENABLED FROM SYS.DATABASES



چالب اینجاست تابع فرا خانی میشه ولی داده ها توی queues گیر میکنه و ایونت اجرا نمیشه
125610