سلام
در این تاپیک قصد معرفی خلاصه ای از نحوه استفاده از کلاس SqlDependency را داریم.
به کمک این کلاس میتوان از تغییرات محتوای جداول دیتابیس مطلع شد.
فرض کنید روی جدول مهمی از دیتابیس کشی (Cache) را پیاده سازی کرده اید که باید به محض تغییر جدول (از هرجایی در شبکه) کش باطل شود.
یا
جدولی بابت پیام ها دارید و میخواهید به محض ثبت سطر جدید، برنامه شما مطلع شود وبه کاربرش اطلاع دهد و...
و...
شاید یک راه حل ساده این باشد که زمان انقضایی برای کش (Cache+ExpireTime+Lazy) و یا تایمری داشته باشید که با سرکشی مجدد، هر تغییری را ردگیری کند.
و یا شاید راه حل دیگر استفاده از SqlDependency باشد.
یک راه عادی استفاده از SqlDependency دادن یک دستور SQL-Select است که به محض تغییر خروجی آن ، برنامه شما مطلع خواهد شد.
اجازه دهید اول به پیش نیازها بپردازیم. اول پیشنهاد میکنم دوستان صفحه زیر را مرور سریعی داشته باشند، این فهرستی از نکات ریز و باید و نبایدهای استفاده از این سرویس است:
https://msdn.microsoft.com/en-us/library/ms181122.aspx
به عنوان نمونه ذکر شده که:
دستور SELECT شما نباید شامل ستاره(*) باشد.
دستور SELECT شما نباید شامل فیلدهای حجیم مانند ntext و (varchar(MAX و... باشد.
دستور SELECT شما نباید شامل TOP و DISTINCT و UNION باشد.
و...
مطمئن شوید SQL Server را در حالت اعتبارسنجی Mixed قرار داده اید:
/Forum/Home/Topic/36-SQL-Server-and-Windows-Authentication-mode
شما باید سرویس Broker را روی دیتابیس مورد نظرتان فعال کنید.
برای این کار اجرای دستوری مانند این لازم است: (یکبار فعال شود کافیست)
USE master;
GO
ALTER DATABASE your-database-name SET ENABLE_BROKER;
GO
بعد هم دقت کنید حتما یک User,Pass برای ارتباط با دیتابیس بسازید و مطمئن شوید کاربر مورد نظر مجوزهای لازم را دارد:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO your-login-username ;
GO
GRANT RECEIVE ON QueryNotificationErrorsQueue TO your-login-username ;
GO
GRANT REFERENCES ON CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] TO your-login-username ;
GO
ودرنهایت هم دقت کنید که نام جداولتان در دستور SQL شامل نام schema هم باشد.