منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : اقتناص حدث تحديث او حذف او اضافة ملف
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله

قاعدة بيانات SqlServer متصل بها خمسة اجهزة وقام احد الاجهزة باضافة او تحديث او حذف ملف
كيف يمكنني معرفة هذا الحدث حتى اقوم بتحديث البيانات
وعليكم السلام ورحمة الله وبركاته

إن لم تكن قد زودت برنامجك بجدول لتسجيل فيه التحديثات التي تمت على كل جدول من جداول قاعدة بياناتك
فلن تعرف بسهولة .. وهذا يحتاج وقع أكواد تترقب كل عملية مع كل حدث على برنامجك..

فالأسهل من ذلك .. عندما تريد تنفيذ عملية أن تعتمد على اتصال جديد يجلب لك بيانات حديثة تنفذ عليها عملياتك..
شكرا على المرور ولكن في قاعدة البيانات اجراءات تراقب هذه العمليات وتستطيع ان تقتنصها
واريد هذه الطريقة

عن طريق شئ يسمى sql dependency يعرفه من تعاملو مع قاعدة البيانات هذه
وعليكم السلام ورحمة الله وبركاته


كل عام وأنتم بخير، بمناسبة عيد الفطر المبارك ،أسأل الله أن يتقبل طاعتكم، وصيامكم، وقيامكم، وأن يجعل عيدكم كله فرح وسرور.




إذا أردت إستخدام  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
عيدكم مبارك وتقبل الله منا ومنكم
هذا هو بالضبط جزاك الله كل خير
(21-04-23, 05:28 AM)عبدالله الدوسري كتب : [ -> ]وعليكم السلام ورحمة الله وبركاته


كل عام وأنتم بخير، بمناسبة عيد الفطر المبارك ،أسأل الله أن يتقبل طاعتكم، وصيامكم، وقيامكم، وأن يجعل عيدكم كله فرح وسرور.




إذا أردت إستخدام  SqlDependency :
إليك الطريقة :-

أولا يجب أن تتأكد بأن قاعدة البيانات المستخدمة تم تفعيل خدمة الــ Service Broke بها،
وهذة الخدمة تسمح بعمليات المراسلة بين التطبيقات.



إذا لم تفعل هذة الخدمة ستظهر لك هذة الرسالة :





لتفعيل الخدمة :




إذا واجهتك هذة الرسالة ( بأن القاعدة مستخدمة من قبل مستخدمين آخرين ) :



طبق هذا الكود : لــ MS SQL Server 2012 فأعلى .......... ( وذلك لقطع كل الإتصالات النشطة بقاعدة البيانات )
ثم أعد محاولت تفعيل الخدمة.

كود :
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  .......... ( وذلك لقطع كل الإتصالات النشطة بقاعدة البيانات )
ثم أعد محاولت تفعيل الخدمة.

كود :
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);










الكود :

أولاً أظف مجال الأسماء التالي :


هنا جملت الإستعلام الخاصة بالكائن SqlDependency : أي شي خارج نطاق هذة الجملة لن يتم التنبيه عنه.


إذا إستخدمت جملت الإستعلام مثلاً بهذا الشكل :

لن يتم التنبيه إلى فقط عن السجلات التي تطابق هذة المعطيات :
itm_Type = 5    و   itm_Price = 20
إذا ثمت تغيير على سجل يحتوي على (  itm_Type = 13 ) فلن يتم التنبيه عنه.


نص الإتصال وكان الـ SqlDependency 




في حدث تحميل النافذة ، ليس بالظرورة أن تفعل نفس الموجود في هذة الكود / المهم الفكرة وصلت، بعد أن جلبت البيانات قمت بتشغيل الكائن SqlDependency ليراقب التغييرات



هنا الإجراء الخاص بتشغيل الكائن SqlDependency 
إستخدم الكود بنفس الطريقة أي تعديل لن يعمل معك إلا إذا كنت فعلا تعرف ماذا تفعل




هنا الحدث الذي يتم إرسالة من قاعدة البيانات، يتم إلتقاطة في البرنامج عبر هذا الحدث.






لا تنسى إيقاف الكائن 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
سؤال خارج سؤال اخ 
فيما يستخدم SqlDependency اقصد بماذا استفيد منه ؟ ممكن توضيح ولو بمثال بيسط ...... وبارك الله فيك 
اضافة للموضوع لم تنفع جملة قتل العمليات التي بالسيرفر للنسخة 2019

لهذا اظهرت العمليات بهذه الجملة

كود :
SELECT *
       FROM sys.dm_exec_sessions
       WHERE is_user_process = 1;


بعدها قمت بقتل هذه العمليات عن طرق الامر التالي:

كود :
Kill 34;

حيث 34 هو رقم العملية Seassion_ID


إقتباس :
فيما يستخدم SqlDependency اقصد بماذا استفيد منه ؟ ممكن توضيح ولو بمثال بيسط ...... وبارك الله فيك 



هو تماما ما ذكرته في اول المنشور