تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
اقتناص حدث تحديث او حذف او اضافة ملف
#1
السلام عليكم ورحمة الله

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

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

فالأسهل من ذلك .. عندما تريد تنفيذ عملية أن تعتمد على اتصال جديد يجلب لك بيانات حديثة تنفذ عليها عملياتك..
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
#3
شكرا على المرور ولكن في قاعدة البيانات اجراءات تراقب هذه العمليات وتستطيع ان تقتنصها
واريد هذه الطريقة

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


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




إذا أردت إستخدام  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
الرد }}}
تم الشكر بواسطة: foo , Taha Okla , ابو محمد محمد محمد
#5
عيدكم مبارك وتقبل الله منا ومنكم
هذا هو بالضبط جزاك الله كل خير
الرد }}}
#6
(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 اقصد بماذا استفيد منه ؟ ممكن توضيح ولو بمثال بيسط ...... وبارك الله فيك 
الرد }}}
تم الشكر بواسطة:
#7
اضافة للموضوع لم تنفع جملة قتل العمليات التي بالسيرفر للنسخة 2019

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

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


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

كود :
Kill 34;

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


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



هو تماما ما ذكرته في اول المنشور
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مساعدة في تحديث سيد أحمد 2 559 18-05-25, 03:11 AM
آخر رد: مصمم هاوي
  تعديل كود تحديث البيانات مصمم هاوي 1 784 26-04-25, 06:07 PM
آخر رد: مصمم هاوي
  اضافة لون للالوان في التاكست بكس أحمد فتح الرحمن 4 447 08-01-25, 04:05 PM
آخر رد: أحمد فتح الرحمن
  اضافة ايام للتاريخ العيدروس 2 371 07-01-25, 02:06 AM
آخر رد: العيدروس
  [سؤال] اضافة ملف Pdf الى الريسورس واستخراجه الى مسار معين .. ackore 6 585 15-11-24, 02:51 AM
آخر رد: justforit
  [VB.NET] اضافة ملاحظة صوتية abo ragab 2 456 15-10-24, 10:14 PM
آخر رد: abo ragab
  كيف يمكن اضافة عناصر للكومبوبوكس اثناء تشغيل البرنامج عن طريق المستخدم haithammoftah 3 2,159 30-09-24, 12:52 AM
آخر رد: asmarsou
  اضافة صورة مخزنة في قاعدة البيانات sql الى الكريستال ريبورت صالح عبدالله 3 461 24-09-24, 09:52 AM
آخر رد: صالح عبدالله
  اضافة اسطر فارعة في الداتا جريد فيو ismaeel 1 557 25-08-24, 02:43 AM
آخر رد: Taha Okla
  [VB.NET] السلام عليكم لدي جدول فرعي وارد تحديث الجدول الرئيسي raedre22 2 368 06-07-24, 12:50 PM
آخر رد: raedre22

التنقل السريع :


يقوم بقرائة الموضوع: