وعليكم السلام ورحمة الله وبركاته
كل عام وأنتم بخير، بمناسبة عيد الفطر المبارك ،أسأل الله أن يتقبل طاعتكم، وصيامكم، وقيامكم، وأن يجعل عيدكم كله فرح وسرور.
إذا أردت إستخدام SqlDependency :
إليك الطريقة :-
أولا يجب أن تتأكد بأن قاعدة البيانات المستخدمة تم تفعيل خدمة الــ Service Broke بها،
وهذة الخدمة تسمح بعمليات المراسلة بين التطبيقات.
إذا لم تفعل هذة الخدمة ستظهر لك هذة الرسالة :
[
attachment=28873]
لتفعيل الخدمة :
[
attachment=28885]
إذا واجهتك هذة الرسالة ( بأن القاعدة مستخدمة من قبل مستخدمين آخرين ) :
[
attachment=28875]
طبق هذا الكود : لــ MS SQL Server 2012 فأعلى .......... ( وذلك لقطع كل الإتصالات النشطة بقاعدة البيانات )
ثم أعد محاولت تفعيل الخدمة.
[
attachment=28876]
كود :
USE [master];
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = db_id('MyDB')
EXEC(@kill);
طبق هذا الكود : لــ MS SQL Server 2000, 2005, 2008 .......... ( وذلك لقطع كل الإتصالات النشطة بقاعدة البيانات )
ثم أعد محاولت تفعيل الخدمة.
[
attachment=28877]
كود :
USE master;
DECLARE @kill varchar(8000); SET @kill = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses
WHERE dbid = db_id('MyDB')
EXEC(@kill);
الكود :
أولاً أظف مجال الأسماء التالي :
[
attachment=28878]
هنا جملت الإستعلام الخاصة بالكائن SqlDependency : أي شي خارج نطاق هذة الجملة لن يتم التنبيه عنه.
[
attachment=28879]
إذا إستخدمت جملت الإستعلام مثلاً بهذا الشكل :
لن يتم التنبيه إلى فقط عن السجلات التي تطابق هذة المعطيات :
itm_Type = 5 و itm_Price = 20
إذا ثمت تغيير على سجل يحتوي على ( itm_Type = 13 ) فلن يتم التنبيه عنه.
نص الإتصال وكان الـ SqlDependency
[
attachment=28880]
في حدث تحميل النافذة ، ليس بالظرورة أن تفعل نفس الموجود في هذة الكود / المهم الفكرة وصلت، بعد أن جلبت البيانات قمت بتشغيل الكائن SqlDependency ليراقب التغييرات
[
attachment=28881]
هنا الإجراء الخاص بتشغيل الكائن SqlDependency
إستخدم الكود بنفس الطريقة أي تعديل لن يعمل معك إلا إذا كنت فعلا تعرف ماذا تفعل
[
attachment=28882]
هنا الحدث الذي يتم إرسالة من قاعدة البيانات، يتم إلتقاطة في البرنامج عبر هذا الحدث.
لا تنسى إيقاف الكائن SqlDependency عند الخروج من النافذة :
كود VB.NET :
كود :
Private ReadOnly QueryDependency As String = "SELECT itm_ID, itm_Name, itm_Type, itm_Price, itm_Unit, itm_Timestamp FROM ProdItems"
Private ReadOnly connectionString As String = "Data Source=.;Initial Catalog=TestSql;Integrated Security=True"
Private sqlDependency As SqlDependency
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' جلب البيانات بطريقتك الخاصة
Me.ProdItemsTableAdapter.Fill(Me.TestSqlDataSet.ProdItems)
' SqlDependency تشغيل الـ
StartSqlDependency()
End Sub
Private Sub StartSqlDependency()
'قم بإنشاء اتصال
Dim Connection As SqlClient.SqlConnection = New SqlClient.SqlConnection(Me.connectionString)
' SELECT مع استعلام DataAdapter إنشاء
' أي شيء خارج نطاق هذا الإستعلام لن تصلك أي تنبيهات بخصوصة
' Where مثلا لو كان الإستعلام يحتوي على الجملة
' Name = "عبدالله"
' لن يراقب أي سجل لا يساوي الاسم عبدالله
Dim DataAdapter As New SqlClient.SqlDataAdapter(Me.QueryDependency, Connection)
' SqlDependency إنشاء كائن
Me.sqlDependency = New SqlClient.SqlDependency(DataAdapter.SelectCommand)
' OnChange قم بإضافة معالج لحدث
AddHandler Me.sqlDependency.OnChange, AddressOf Me.OnChange
' SqlDependency ابدأ تشغيل الكائن
SqlClient.SqlDependency.Start(Me.connectionString)
' مرة واحدة DataAdapter نحتاج إلى استخدام
' بإلقاء نظرة على البيانات المراد مراقبتها sqlDependency وذلك لإتاحة الفرصة للكائن
' في هذا السطر لا يهم أين يذهب بالبيانات ، المهم أنه ألقى نظرة ليستطيع معرفة أي تغيير
DataAdapter.Fill(New DataSet)
End Sub
' حدث الإخطار أو التنبيه
Private Sub OnChange(sender As Object, e As EventArgs)
' Sql Server هذا السطر فقط لإختبار وصول التنبيهات من الـ
' إذا حدث إي تغيير على جملت الإستعلام المحددة
Me.Label1.Text = "أخر تغيير للبيانات : " & Now.ToString
'-------------------
' هنا تستطيع تحميل البيانات من جديد أو عمل أي شيء
'-------------------
' مرة أخرى SqlDependency إعادة تشغيل الـ
StartSqlDependency()
End Sub
Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles Me.Closed
' قبل الخروج من النافذة OnChange إزالة معالج الحدث
RemoveHandler Me.sqlDependency.OnChange, AddressOf OnChange
' قبل الخروج من النافذة SqlDependency إيقاف تشغيل الـ
SqlDependency.Stop(connectionString)
End Sub