اقتناص حدث تحديث او حذف او اضافة ملف - ابو محمد محمد محمد - 20-04-23
السلام عليكم ورحمة الله
قاعدة بيانات SqlServer متصل بها خمسة اجهزة وقام احد الاجهزة باضافة او تحديث او حذف ملف
كيف يمكنني معرفة هذا الحدث حتى اقوم بتحديث البيانات
RE: اقتناص حدث تحديث او حذف او اضافة ملف - Taha Okla - 20-04-23
وعليكم السلام ورحمة الله وبركاته
إن لم تكن قد زودت برنامجك بجدول لتسجيل فيه التحديثات التي تمت على كل جدول من جداول قاعدة بياناتك
فلن تعرف بسهولة .. وهذا يحتاج وقع أكواد تترقب كل عملية مع كل حدث على برنامجك..
فالأسهل من ذلك .. عندما تريد تنفيذ عملية أن تعتمد على اتصال جديد يجلب لك بيانات حديثة تنفذ عليها عملياتك..
RE: اقتناص حدث تحديث او حذف او اضافة ملف - ابو محمد محمد محمد - 20-04-23
شكرا على المرور ولكن في قاعدة البيانات اجراءات تراقب هذه العمليات وتستطيع ان تقتنصها
واريد هذه الطريقة
عن طريق شئ يسمى sql dependency يعرفه من تعاملو مع قاعدة البيانات هذه
RE: اقتناص حدث تحديث او حذف او اضافة ملف - عبدالله الدوسري - 21-04-23
وعليكم السلام ورحمة الله وبركاته
كل عام وأنتم بخير، بمناسبة عيد الفطر المبارك ،أسأل الله أن يتقبل طاعتكم، وصيامكم، وقيامكم، وأن يجعل عيدكم كله فرح وسرور.
إذا أردت إستخدام 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
RE: اقتناص حدث تحديث او حذف او اضافة ملف - ابو محمد محمد محمد - 21-04-23
عيدكم مبارك وتقبل الله منا ومنكم
هذا هو بالضبط جزاك الله كل خير
RE: اقتناص حدث تحديث او حذف او اضافة ملف - ahmed_king2023 - 21-04-23
(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 اقصد بماذا استفيد منه ؟ ممكن توضيح ولو بمثال بيسط ...... وبارك الله فيك
RE: اقتناص حدث تحديث او حذف او اضافة ملف - ابو محمد محمد محمد - 21-04-23
اضافة للموضوع لم تنفع جملة قتل العمليات التي بالسيرفر للنسخة 2019
لهذا اظهرت العمليات بهذه الجملة
كود :
SELECT *
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;
بعدها قمت بقتل هذه العمليات عن طرق الامر التالي:
حيث 34 هو رقم العملية Seassion_ID
إقتباس :
فيما يستخدم SqlDependency اقصد بماذا استفيد منه ؟ ممكن توضيح ولو بمثال بيسط ...... وبارك الله فيك
هو تماما ما ذكرته في اول المنشور
|