# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  تشخیص آنی رکورد جدید در جدول

## Neeloofar

سلام

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

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

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

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

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

----------


## ali_kolahdoozan

چرا از socket programing استفاده نمی کنید؟

----------


## Neeloofar

> چرا از socket programing استفاده نمی کنید؟


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

----------


## vahidiran

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

----------


## ali_kolahdoozan

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

----------


## Neeloofar

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


ربطی به طراحی جدول و دیتابیس نداره.



> حالا اگه بگید برای چیه نیار به دانستن انی دارید شاید یه راهی به نظرمون برسه


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




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


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

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

----------


## DonetKarvb

> سلام
> 
>  برای اینکه بتونم منظورم خوب مطرح کنم یک مثال میزنم.
> 
>  یک جدول در SQL داریم که میخوایم به محض اینکه رکوردی جدید توسط کاربر اول (در شبکه) در اون ثبت شد، کاربر دوم مطلع بشه. میشه هم گفت مسنجر.
>   راه حل منطقی چیه؟
> 
>  خودم یک راه به ذهنم میرسه که برنامه‌ی هر کاربر توسط یک تایمر به صورت مداوم (هر 5 ثانیه) وجود رکورد جدید رو چک کنه. ولی در این روش ترافیک شبکه بالا میره و برنامه تقریبا مشغول هست. و ممکنه در هر بار چک کردن، برنامه برای باز کردن جدول یک ایست کوتاه داشته باشه.
> 
> ...


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





> چرا از socket programing استفاده نمی کنید؟


خیلی سخته و به  نظر من در اینصورت باید بی خیالش بشه.



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


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



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


چرا اینقدر با دانشگاه لجی. یک کم پیشرفت کن برو ببین دنیا چه میکنه.  :متعجب:  من که اینجوری شدم با دیدن SQL 2005 .

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

----------


## whitehat

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


استفاده از روش  Polling همانطور که خودتان اشاره کردید ترافیک شبکه و اتلاف پهنای باند می شود. در عمل برنامه نویسی سوکت سریعترین راه حل است (البته اگر می خواهید به چیزی شبیه به چت برسید)، اما باید شما تمامی کار ها (مانند مدیریت پورتها و مولتی تردینگ) را بوسیله برنامه نویسی انجام دهید.اما اگر می خواهید از SQL Server و امکانات آن استفاده کنید می توانید از Service Broker استفاده کنید که در نسخه 2000 و 2005 موجود است (Service Broker به شما این امکان را می دهد که بر اساس شرایطی Event خاصی را فعال کنید).در صورتی که از 2005 استفاده می کنید همانطور که دوستمان اشاره داشتند می توانید از Query Notification استفاده کنید.

----------


## Neeloofar

> ُُبا سلام .
> اگر از SQL Server 2005 استفاده کنید یک امکانی داره به نام QueryNotification که به سادگی اینکار رو انجام میده. شاید شما حتی به چشم هم قادر به دیدن تغییر نباشید. تغییرات در کمتر از 100 ام ثانیه نمایش داده خواهند شد.
> 
> آقا/ خانم نیلوفر من در اولین فرصت برای شما یک مثال خواهم گذاشت فقط شما بگویید که آیا میخواهید از همین ورژن SQL Server استفاده کنید یا خیر.





> آقا/ خانم نیلوفر


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

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

----------


## ali_kolahdoozan

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

----------


## vahidiran

برای تمامی دستورات که پیغام رو می فرستند علاوه بر اینکه در بانک ذخیره شه چک کنه صاحبشو پیدا کنه و پیغام رو هم به او بفرسته
همان طور که دوستمون اشاره ای به ان کرد

----------


## Neeloofar

> برای تمامی دستورات که پیغام رو می فرستند علاوه بر اینکه در بانک ذخیره شه چک کنه صاحبشو پیدا کنه و پیغام رو هم به او بفرسته
> همان طور که دوستمون اشاره ای به ان کرد


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

----------


## mostafa_leman

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

----------


## DonetKarvb

> آیا میشه sql server رو به یک فیلد خاص از یک Table حساس کرد که یک پیغام به ما بده ؟ من یک برنامه نوشتم که تو اون یک سری سفارش ثبت میشه . اما تنها راهی که برای به ذهنم رسید تا به کاربر اعلام کنم که سفارش رو آماده کنند همین Timer بود .


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




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


** منظورم از آقا/ خانم این بود که میتواند نیلوفر نام خانوادگی باشد( که مرد هم میشه) و یا اسم 

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



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


غیر از این هست. ببین و حالشو ببر.

----------


## DonetKarvb

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

----------


## Neeloofar

> با سلام
> دوستان این یک برنامه است و دقیقا" همینکار رو میکنه که شما میخواید
> یک کوئری نوشته شه که به اطلاعات مشتریانی که از کشور 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

> من اجرا کردم، ولی چون از کانکشن استرینگ شما ایراد میگرفت:
> 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

> کانکشن استرینگ رو به این صورت در بیاورید:
>  "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

اینو یه تستش بکن
USE master ;
GO

ALTER DATABASE Northwind SET ENABLE_BROKER ;
GO

----------


## Neeloofar

سلام

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

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

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

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


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

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

----------


## titbasoft

> می توانید از Service Broker استفاده کنید که در نسخه 2000 و 2005 موجود است


توی 2K هم سرویس بروکر داریم؟

----------


## Neeloofar

سلام

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

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

----------


## Neeloofar

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

----------


## DonetKarvb

کسی دیگه ای این برنامه رو چک نکرده؟ 8 بار دانلود داشتیم حدا اقل دو نفر دانلود کردند که ایا اون یکی دوستمون هم مشکل داشتند؟

----------


## Payam Moradi

> ظاهرا این فناوری برای خیلی ها جا نیافتاده (از جمله خودم) چون تو اینترنت هم میگردم همش 4 تا دونه مثال اونم تکراری گیرم می آید که توضیح درست و کاملی ندارند.
> MSDN (آنلین و آفلین) هم کم لطفی کرده.
> مثل اینکه فعلا باید با همون تایمر یکجورایی کارم رو راه بندازم.


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

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

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

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

----------


## Neeloofar

خیلی ممنون.
درسته این همون چیزی بود که میخواستم. :لبخند:  
نه یک خورده C#‎ سرم میشه. لزومی به تبدیل نیست.

خیلی متشکر!




> کسی دیگه ای این برنامه رو چک نکرده؟ 8 بار دانلود داشتیم حدا اقل دو نفر دانلود کردند که ایا اون یکی دوستمون هم مشکل داشتند؟


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

----------


## DonetKarvb

> درسته پایگاه داده باید یک سری تنظیمات رو تغییر بدی و یک سری سرویس تعریف کنی.
> مثال دوستمون هم DonetKarvb تقریبا درسته ولی نگفته که باید سرویس های notification برای یک پایگاه داده تعریف بشه. احتمالا بانکی که ایشون روی سیستمشون دارند این سرویس ها رو داره.


من در پستی جدا به ایشون گفته بودم که این بخش رو فعال کنند و ایشون هم فعال کردند .




> اینو یه تستش بکن
> USE master ;
> GO
> 
> ALTER DATABASE Northwind SET ENABLE_BROKER ;
> GO

----------


## whitehat

> توی 2K هم سرویس بروکر داریم؟


با عرض پوزش  :خجالت:  ، این سرویس در SQL 2005 وجود دارد و قابل استفاده است (ضمن اینکه در جایی خواندم که این سرویس در 2000 موجود بوده اما فقط خود سیستم از آن استفاده می کند). اما برای یک همچنین کاری در 2000 می توانید از همان Notification Services استفاده نمائید.

----------


## Payam Moradi

اونایی که با C#‎ مشکل دارند، خیلی ساده کردم و با VB.Net نوشتم. :چشمک: 
.

----------


## Payam Moradi

این سورس آقای *DonetKarvb* با دیتابیس Northwind منتها با اجرای فایل northwind.sql ابتدا دیتابیس را ایجاد کنید.
آقای *DonetKarvb* زحمت پیدا کردن فرق دیتابیسی که northwind.sql میسازه با دیتابیس Northwind که در SQL نصب هست با خودتون.
کد شما موردی نداره و فقط دیتابیس باید یک تغییراتی بکنه.
ضمنا یک تغییر کوچیک هم در کد دادم. بهتره از یک SP استفاده کنید.  :چشمک:

----------


## DonetKarvb

> ضمنا یک تغییر کوچیک هم در کد دادم. بهتره از یک SP استفاده کنید.


استفاد از SP یکی از علایق بنده هست. ولی خوب میتونم بپرسم اینجا فرقشون چیه؟ شاید یکی نخواد از SP استفاده کنه......

----------


## Payam Moradi

> استفاد از SP یکی از علایق بنده هست. ولی خوب میتونم بپرسم اینجا فرقشون چیه؟ شاید یکی نخواد از SP استفاده کنه......


دلیل منطقی نداره! در این مورد من نتیجه ی مطلوب نگرفتم. شما هم تست کنید. :چشمک:

----------


## Neeloofar

سلام

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

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

----------


## TuneUp

آیا توی وب هم میشه همچین کار روی کرد؟

----------


## Payam Moradi

> آیا توی وب هم میشه همچین کار روی کرد؟


من امکان تست ندارم. ولی حتما میشه.

----------


## shahram197070

با سلام 
دوستان عزیز و پیشکسوت 
امکان داره عملیات فوق را با sql server 2000 پیاده کرد .

----------


## محسن بابائی

اگر بشه با sqlserver2000 پیاده سازی بشه خیلی عالی می شه. چون اکثرا هم با همین ورژن دارند کار می کنند.

----------


## DonetKarvb

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

----------


## asilverisis

سلام
من کدها رو دانلود کردم ، درست کار می کنن ولی وقتی همون کدها رو برای دیتابیس خودم تغییر میدم رویداد  MyChangeEvent مثل یک حلقه بی نهایت مدام اجرا می شه بدون اینکه هیچ تغییری در دیتابیس داده بشه.

باتشکر.

----------


## MH2538

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

----------


## asilverisis

سلام
اگه امکانش هست در مورد ارسال Notification بیشتر توضیح بدین.
من هم به نظر خودم این راه بهتریه چون باعث کم شدن ترافیک شبکه هم میشه.
ممنون

----------


## hooooman

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


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

----------


## asilverisis

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

این هم کدی که من استفاده می کنم (پست 16)
https://barnamenevis.org/showth...725#post386725

----------


## asilverisis

سلام
کسی راه حلی برای این کار نداره؟
بدون load کردن اطلاعات نمی شه متوجه تغییرات شد؟؟
لطفا...
با تشکر

----------


## omidmehraban

با سلام و احترام
من برای فعال کردن Service Broker این Query را اجرا می کنم:
USE master ;
GO

ALTER DATABASE Northwind SET ENABLE_BROKER ;
GOرو دستگاه خودم جواب داد ولی بروی دستگاه دیگری که اجراش می کنم،هیچ وقت خاتمه پیدا نمی کنه.یعنی وقتی دکمه Execute را می زنم اجرای دستور شروع میشه و پایین صفحه هم کنتور می ندازه میره به امان خدا.یک بار تا 6 یا 7 دقیقه صبر کردم ولی کاسه صبرم لبریز شد و این topic را فرستادم.
این دستور را برای تشخیص آنی رکورد جدید در جدول استفاده می کنم

----------


## hamed_bostan

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



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

https://barnamenevis.org/showthread.php?t=77847

----------


## ice007

با سلام 

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

----------


## armin656

برای رسیده به این هدف دوست عزیز راهی های زیادی هست دو ستان راهنمایی های خوبی کردن همون سوکت خوبه و جواب هم می ده
اما شما سعی کنید مثل سیستم عامل عمل کنید یعنی یه اطاقی بسازید که هر کسی از استاد سوال داشت دستشو بالا بگیره و بپرسه نه این که استاد از تک تک دانشجویان سوال کنه که ایا سوالی دارند یا نه!!!!!!!!!!!!!!!!!!!!!!!!!
فکر کنم متوجه منظورم شدید منظورم   <<< وقفه >>> بود 
در اسکیوال سرور می تونید برای هر جدول یک یا چند تریگر بنویسید که بعد فلان تغییرات یه کاری رو انجام بده همین برای شما کافیه
یعنی یک تریگر بنویسید که بعر از اظافه شده یک نامه به جدول برای کاربر مربوطه یک وقفه ارسال بشه که متوجه بشه یک نامه جدید امده
به نظرم بهترین روش اینه در 2000 اما در 2005 که دیگه خیلی تغییرات داریم و قدرت بیشتر شده

----------


## arman_Delta2002

سلام من هم با این که کد 

USE master ;
GO
 
ALTER DATABASE Northwind SET ENABLE_BROKER ;
GO




واسه بانک اطلاعاتیم زدم و یک StoredProcedure تعریف کردم و فقط در سورس prj_QueryNotification.rar‏ نام دیتا بیس و به نام دیتا بیس خودم تقییر دادم ولی کار نکرد ؟! 
(نام استرینگ کامند هم نام بود با StoredProcedure مثال )
روی اس کیو ال 2014 دارم تست میکنم مثال کار مکینه ولی برنامه تغییر داده شده من بار اول رکورد ها رو میاره ولی ایونت رو تشخیص نمیده !
یک مثال تصویری از notification برای یک پایگاه داده تعریف سرویس و تنظیم اون  بزارین لطفا
با این دستور هم صحت فعال بودن بروکر رو تست کردم 

SELECT NAME, IS_BROKER_ENABLED FROM SYS.DATABASES



چالب اینجاست تابع فرا خانی میشه ولی داده ها توی queues گیر میکنه و ایونت اجرا نمیشه 
11-14-2014 01-11-46 ق-ظ.jpg

----------

