1395/07/23 1:22 ردگیری و اطلاع از تغییر اطلاعات دیتابیس به کمک SqlDependency
حاجی شریفی
مؤسس سایت
 
سلام
در این تاپیک قصد معرفی خلاصه ای از نحوه استفاده از کلاس 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 هم باشد.
1395/07/23 1:26 برنامه نویسی یک کد عادی برای SqlDependency
حاجی شریفی
مؤسس سایت
 
حالا به بررسی کد میپردازیم.
در مورد استفاده از کلاس SqlDependency باید بدانید که این کلاس فقط یک تغییر (اولین) را اطلاع رسانی میکند، اگر میخواهید مدام تغییرات را ردگیری کنید باید بعد هر رویداد مجدد از SqlDependency استفاده کنید تا برای تغییر بعدی کدتان را ثبت کنید.

برای امتحان می توانید کدی شبیه این را امتحان کنید:
using System.Data.SqlClient;

//APP Start
SqlDependency.Start(CONNECTIONSTRING);

//...

using (var con = new System.Data.SqlClient.SqlConnection(CONNECTIONSTRING))
using (var com = new System.Data.SqlClient.SqlCommand(SQLSELECT, con))
{
  var dependency = new SqlDependency(com);
  dependency.OnChange += this.OnChangeHandler;

  con.Open();
  com.ExecuteNonQuery();
}

//...

private void OnChangeHandler(object sender, SqlNotificationEventArgs e)
{
  //Any code...
}

//...

//APP End
SqlDependency.Stop(CONNECTIONSTRING);


دو فرمان SqlDependency.Start و SqlDependency.Stop باید برای هر ConnectionString فقط یک بار در شروع و پایان برنامه اجرا شوند، بقیه فرامین هم گمانم به حدکافی واضح هستند.

برای کد کامل و قابل اجرا، میتوانید نمونه برنامه نهایی را از پست بعدی دانلود کنید.
1395/07/23 2:36
حاجی شریفی
مؤسس سایت
 
اجرا برنامه نمونه نهایی تاپیک.
برای دوستانی که اطلاعات کافی دارند بطور خلاصه میتوان گفت:
جهت اجرا برنامه نمونه فقط باید دیتابیس هماهنگ کدها را ایجاد کنید و از صحت ConnectionString در فایل app.config اطمینان پیدا کنید.
بعد می توانید برنامه را اجرا کنید و با SSMS سطر های جدول "Users" (جدولی که خودمان ساخته ام) را ویرایش کنید (درج وحذف و تغییر و...) و برنامه تغییرات را نشان خواهد داد.

توضیح تصویری و مفصل دو-سه خط فوق چنین است.

برنامه S QL S erver M anagement S tudio را اجرا کنید و فرامین منویی File > Open > File را اجرا کنید یا Ctrl+O را با کیبورد بزنید و فایل CreateDatabase.sql را از بسته دانلودی (در انتهای همین پست) انتخاب و باز کنید.
بسیار دقت کنید که بخشی از دستورات SQL فایل مذکور را با ماوس انتخاب نکنید وگرنه بقیه کدها اجرا نخواهند شد و به خطا خواهید خورد.
سپس دکمه Execute را کلیک کنید.


فایل SQL فوق هم دیتابیس وهم جدول و فعال سازی Broker و ساخت User,Pass و... را انجام میدهد.
اگر همه چیز خوب پیش برود باید پیام موفقیت را ببینید.


گره Databases را Refresh کنید تا دیتابیس جدید ساخته شده را ببینید.


کار ساخت دیتابیس تمام است.
برای آمادگی جهت تغییر اطلاعات (و آزمایش صحت کارکرد برنامه) وارد دیتابیس جدید SqlServerDependency شوید و روی تنها جدول Users راست کلیک و فرمان Edit Top 200 Rows بدهید.
این فرم را باز و آماده نگاه دارید تا برنامه را بواسطه آن آزمایش کنیم.


صحت ConnectionString را در فایل app.config بازبینی کنید و درصورت نیاز تغییرش دهید.
حالا برنامه را اجرا کنید و داده ها از طریق برنامه SSMS تغییر دهید، تغییرات مانیتور خواهد شد.


دانلود پروژه:
http://33x.ir/s-sqldep
1395/07/23 17:11
afshin160

 
با سلام خدمت استاد بزرگ وارم.
واقعا از زحمات شما و آموزش های شما سپاسگذارم .
جا داره از لطف جنابعالی در آموزشهای شما به خودم خیلی خیلی تشکر کنم که هرچه از برنامه نویسی بلدم از وجود پر برکت شماست.
1395/07/24 3:4
حاجی شریفی
مؤسس سایت
 
سلام آقا افشین عزیز
قطعا شما لطف دارید.