الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس في ADO.NET من الصفر إلى الإحتراف .

مثبّترائج
بدأه yaseralshikh في 29 ديسمبر 2006 · 196 رد · 170,211 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#101

بسم الله الرحمن الرحيم

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..

=============

لقد تأخرت عنكم كثيراً ، لذلك أريد أن أعتذر للجميع ، وها نحن هنا من جديد ..

=============

الخاصية UpDate :

تجعل هذه الخاصية الكائن DataAdapter ينسخ التغييرات بشكل عكسي من الكائن DataSet إلى مصدر قاعدة البيانات ، وذلك من خلال تنفيذ الأوامر InsertCommand ، UpDateCommand ، DeleteCommand وذلك لكل أسطر DataSet ألتي قد أدخلت أو عدلت أو حذفت . و سوف نقوم بشرح كل واحد من هذه الأوامر على حده ونبين كيف يعمل ، علماً أنه يمكننا استخدام باني الأوامر CommandBuilder ليقوم هو ببناء الأوامر اللازمة والتي سبق ذكرها نيابة عنا ، وهو أيضاً سوف نقوم بشرحه بالتفصيل .

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

instance_adapter.Update(ds, "Information")

أو الكود التالي ..

instance_adapter.Update(ds.Tables("Information"))

أو الكود التالي في حالة معرفتنا بالرقم ألفهرسي للجدول المخزن في الـ DataSet ..

instance_adapter.Update(ds.Tables(0))

ملاحظة هامة :

إذا استخدمت الخاصية TableMappings لتغيير الاسم لجدول أو لأعمدة جدول ما عند تحميل البيانات ، فكن متأكداً من استخدام نفس التحويلات عند القيام بعملية التحديث .

- الأمر InsertCommand :

يعد أمر الإضافة InsertCommand أحد خصائص الكائن DataAdapte و عمله الأساسي هو إضافة سجل جديد إلى سجلات الجدول ، والطريقة التي يعمل بها مشابهة تماماً لكائن الأمر الذي قد تحدثنا عنه في الوضع المتصل ، والمثال التالي موضح بالشرح ، حيث أنه في البداية سوف نقوم بتجهيز الكائنات للعمل ، ثم نملأ الـ DataSet بالبيانات ، و نقوم بتحديث بياناته ، ثم نقوم بنسخ التغييرات التي طرأت على الـ DataSet بشكل عكسي من الكائن DataSet إلى مصدر قاعدة البيانات ، من خلا الكائن DataAdapter وكائن الأمر InsertCommand التابع له ، وفي الأخير نستخدم الخاصية UpDate لتولي مسؤلية عملية النسخ ، فلنلقي نظرة متفحصة على الكود ..

1 Dim selectCommandText As String = "SELECT * FROM Information;"
2 Dim selectConnection As OleDbConnection = New OleDbConnection _
3	 ("Provider=Microsoft.Jet.OLEDB.4.0;" _
4	 & "Data Source=|DataDirectory|\Note.mdb;" _
5	 & "User Id=admin;" _
6	 & "Jet OLEDB:Database Password=ado.net;")

7 Dim instance_adapter As New OleDbDataAdapter(selectCommandText, selectConnection)
8 Dim ds As New DataSet

9 instance_adapter.Fill(ds, "Information")

10 Dim MyDR As DataRow = ds.Tables("Information").NewRow
11 MyDR.Item("Name") = "Yaser Mohamed"
12 MyDR.Item("Age") = "32"
13 MyDR.Item("Phone") = "0123456789"
14 MyDR.Item("Email") = "Yaser1395@hotmail.com"
15 ds.Tables("Information").Rows.Add(MyDR)

16 Dim InsertCommand As New OleDbCommand
17 InsertCommand.Connection = selectConnection
18 InsertCommand.CommandText = "INSERT INTO Information ([Name],[age],[phone],[email]) VALUES (?,?,?,?)"
19 InsertCommand.CommandType = CommandType.Text
20 InsertCommand = InsertCommand
21 InsertCommand.Parameters.AddWithValue("?", "Yaser Mohamed")
22 InsertCommand.Parameters.AddWithValue("?", "32")
23 InsertCommand.Parameters.AddWithValue("?", "0123456789")
24 InsertCommand.Parameters.AddWithValue("?", "Yaser1395@hotmail.com")

25 instance_adapter.InsertCommand = InsertCommand

26 Me.BindingContext(ds, "Information").EndCurrentEdit()
27 instance_adapter.Update(ds, "Information")

28 MsgBox("Update Successfully...", MsgBoxStyle.Information)

شرح الكود السابق متزامن مع أرقام الأسطر :

1- التصريح عن متغير للإستعلام عن الجدول المخزن في مصدر البيانات ( Data Sources ) .

2- التصريح عن متغير لكائن الإتصال بقدعدة البيانات .

7- التصريح عن متغير للكائن DataAdapter ( وهو الوسيط بين الكائن DataSet و مصدر البيانات ) و تجهيزه .

8- التصريح عن متغير الكائن DataSet .

9- استيراد البيانات من مصدر البيانات ، وتعبئتها في جدول محدد ضمن الكائن DataSet .

10- الكود اللازم لإضافة سجل جديد إلى سجلات الجدول المخزن في الكائن DataSet ، حيث يبدأ بالتصريح عن متغير كائن صف ، وتجهيزه من خلال ربطه بالجدول الموجود في الكائن DataSet ، ثم استدعاء الخاصية صف جديد .

11- بعد ذلك نقوم بإسناد البيانات المحدثه إلى الحقول الخاصة بالجدول ويتكرر ذلك في كل من الاسطر رقم ( 11 إلى 14 ) .

15- نقوم بإضافة كائن الصف إلى صفوف الجدول الموجود في الكائن DataSet، وبذلك نكون قد حدثنا الجدول المخزن في الكائن DataSet .

16- ولكي نقوم بتصدير البيانات الجديده من الكائن DataSet إلى مصدر البيانات ، نحتاج إلى اعداد وتجهيز كائن الأمر الخاص بإضافة صف جديد ، وذلك من خلال إنشاء كائن أمر وإعداده كما كنا نعمل في الوضع المتصل ، وذلك نجده في كل من الاسطر رقم ( 16 إلى 24 ) .

25- بعد ذلك نقوم بإسناد كائن الأمر إلى الخاصية الخاصة بأمر الإضافة في الكائن DataAdapter .

26- وللقيام بعملية التحديث النهائية لمصدر البيانات نحتاج إلى إيقاف عملية التحديث على الجدول المطلوب ضمن الكائن DataSet ، وذلك حفاظاً على تزامن البيانات .

27- هنا نقوم بعملية التحديث بعد تحديد اسم الجدول الذي نرغب في تحديثه .

28- مربع رسالة تخبرنا بنجاح العملية .

ويكمن كتابة الكود السابق بشكل أخر وسوف يؤدي نفس النتيجة ، فلنتأمل الكود التالي ..

1 Dim selectCommandText As String = "SELECT * FROM Information;"
2 Dim selectConnection As OleDbConnection = New OleDbConnection _
3	 ("Provider=Microsoft.Jet.OLEDB.4.0;" _
4	 & "Data Source=|DataDirectory|\Note.mdb;" _
5	 & "User Id=admin;" _
6	 & "Jet OLEDB:Database Password=ado.net;")

7 Dim instance_adapter As New OleDbDataAdapter(selectCommandText, selectConnection)
8 Dim ds As New DataSet

9 instance_adapter.Fill(ds, "Information")

10 Dim MyDR As DataRow = ds.Tables("Information").NewRow
11 MyDR.Item("Name") = "Yaser Mohamed"
12 MyDR.Item("Age") = "32"
13 MyDR.Item("Phone") = "0123456789"
14 MyDR.Item("Email") = "Yaser1395@hotmail.com"
15 ds.Tables("Information").Rows.Add(MyDR)

16 instance_adapter.InsertCommand = New OleDbCommand("INSERT INTO Information ([Name],[age],[phone],[email]) VALUES (?,?,?,?)" , selectConnection)

17 instance_adapter.InsertCommand.Parameters.Clear()
18 instance_adapter.InsertCommand.Parameters.AddWithValue("?", "Yaser Mohamed")
19 instance_adapter.InsertCommand.Parameters.AddWithValue("?", "32")
20 instance_adapter.InsertCommand.Parameters.AddWithValue("?", "0123456789")
21 instance_adapter.InsertCommand.Parameters.AddWithValue("?", "Yaser1395@hotmail.com")

22 Me.BindingContext(ds, "Information").EndCurrentEdit()
33 instance_adapter.Update(ds, "Information")

24 MsgBox("Update Successfully...", MsgBoxStyle.Information)

شرح الكود السابق مطابق للشرح الذي يسبقه ما عدا بعض الاختلافات التي سوف نوضحها هنا ، وهي متزامنة مع أرقام الأسطر :

16- ولكي نقوم بتصدير البيانات الجديده من الكائن DataSet إلى مصدر البيانات نحتاج إلى اعداد وتجهيز كائن الأمر InsertCommand التابع للكائن DataAdapter والخاص بإضافة صف جديد وذلك من خلال إسناد كائن أمر جديد وإعداده بجملة SQL اللازمة لعملية الإضافة ، و كائن الاتصال اللازم أيضاً .

17- بعد ذلك نحتاج إلى إضافة البارامترات التي تم تعشيشها في جملة SQL السابقة الذكر ، مع قيمها المحدثة ، وذلك نجده في كل من الأسطر رقم ( 17 إلى 21 ) .

- الأمر DeleteCommand :

يعد أمر الحذف DeleteCommand أحد خصائص الكائن DataAdapte و عمله الأساسي هو حذف سجل من سجلات الجدول ، والطريقة التي يعمل بها مشابهة تماماً لكائن الأمر الذي قد تحدثنا عنه في الوضع المتصل ، حيث سنحتاج إلى وجود فقرة Where في جملة SQL والتي تشير إلى بارامتر ( معامل ) يساعدنا في تحديد السجل المطلوب حذفه ، والمثال التالي موضح بالشرح ، حيث أنه في البداية سوف نقوم بتجهيز الكائنات للعمل ، ثم نملأ الـ DataSet بالبيانات ، و نقوم بحذف السجل الحالي من الجدول المخزن في الكائن DataSet ( تعتبر عمليه الحذف هذه تحديث للسجلات الموجودة في الجدول المخزن في الكائن DataSet ) ، ثم نقوم بنسخ التغييرات التي طرأت على الـ DataSet بشكل عكسي من الكائن DataSet إلى مصدر قاعدة البيانات ، وذلك من خلا الكائن DataAdapter وكائن الأمر DeleteCommand التابع له ، وفي الأخير نستخدم الخاصية UpDate لتولي مسؤلية عملية النسخ ، فلنلقي نظرة متفحصة على الكود ..

1 Dim selectCommandText As String = "SELECT * FROM Information order by name"
2 Dim selectConnection As OleDbConnection = New OleDbConnection _
3	 ("Provider=Microsoft.Jet.OLEDB.4.0;" _
4	 & "Data Source=|DataDirectory|\Note.mdb;" _
5	 & "User Id=admin;" _
6	 & "Jet OLEDB:Database Password=ado.net;")

7 Dim instance_adapter As New OleDbDataAdapter(selectCommandText, selectConnection)
8 Dim ds As New DataSet
9 instance_adapter.Fill(ds, "Information")

10 Dim MYPosition As String = Me.BindingContext(ds, "Information").Position
11 Dim IdValue As String = ds.Tables("Information").Rows(MYPosition).Item("ID")

12 Me.BindingContext(ds, "Information").RemoveAt(MyPosition)

13 instance_adapter.DeleteCommand = New OleDbCommand("DELETE FROM Information WHERE  Information.ID=?;", selectConnection)

14 instance_adapter.DeleteCommand.Parameters.Clear()
15 instance_adapter.DeleteCommand.Parameters.AddWithValue("?",IdValue)

16 Me.BindingContext(ds, "Information").EndCurrentEdit()
17 instance_adapter.Update(ds, "Information")

18 MsgBox("DELETED Successfully...", MsgBoxStyle.Information)

شرح الكود السابق ينطبق عليه بعض الشروحات التي سبق ذكرها ، لذا سنكتفي بشرج ما جد من الكود ، وهو متزامن مع أرقام الأسطر :

10- نقوم بتخزين الرقم الذي يعبّر عن موضع السجل الحالي في الجدول المخزن داخل الكائن DataSet ، وذلك من أجل عملية الحذف من داخل الـ DataSet .

11- نقوم بتخزين قيمة رقم الحقل المسمى "ID" الخاص بالسجل الحالي للجدول المخزن داخل الكائن DataSet ، وذلك من أجل عملية الحذف من مصدر قاعدة البيانات .

12- نقوم هنا باستخدام الأمر RemoveAt لحذف السجل الحالي ( والذي قمنا بتخزين قيمته في المتغير MYPosition ) من الجدول المخزن في الكائن DataSet والذي قمنا بتحديد اسمه ، عندئذ يتم حذف السجل من داخل الـ DataSet فقط .

13- ولكي نقوم بتصدير البيانات المحدثة من الكائن DataSet إلى مصدر البيانات نحتاج إلى إعداد وتجهيز كائن الأمر DeleteCommand التابع للكائن DataAdapter والخاص بحذف سجل ، وذلك من خلال إسناد كائن أمر جديد وإعداده بجملة SQL اللازمة لعملية الحذف ، و كائن الاتصال اللازم أيضاً .

14- بعد ذلك نحتاج إلى إضافة البارامتر الذي تم تعشيشه في جملة SQL السابقة الذكر ، مع قيمته والتي قمنا بتخزينها سابقاً في المتغير MyFieldValue ، وذلك نجده في كل من السطرين رقم ( 14 ، 15 ) .

- الأمر UpdateCommand:

يعد أمر التحديث UpdateCommand أحد خصائص الكائن DataAdapte و عمله الأساسي هو تحديث سجل محدد من سجلات الجدول ، والطريقة التي يعمل بها مشابهة تماماً لكائن الأمر الذي قد تحدثنا عنه في الوضع المتصل ، حيث سنحتاج إلى وجود فقرة Where في جملة SQL والتي تشير إلى بارامتر ( معامل ) يساعدنا في تحديد السجل المطلوب تحديثه ، والمثال التالي موضح بالشرح ، حيث أنه في البداية سوف نقوم بتجهيز الكائنات للعمل ، ثم نملأ الـ DataSet بالبيانات ، و نقوم بعد ذلك بتحديث بيانات السجل الحالي للجدول المخزن في الكائن DataSet ، ثم نقوم بنسخ التغييرات التي طرأت على الـ DataSet بشكل عكسي من الكائن DataSet إلى مصدر قاعدة البيانات ، وذلك من خلا الكائن DataAdapter وكائن الأمر UpdateCommand التابع له ، وفي الأخير نستخدم الخاصية UpDate لتولي مسؤلية عملية النسخ ، فلنلقي نظرة متفحصة على الكود ..

1 Dim selectCommandText As String = "SELECT * FROM Information"
2 Dim selectConnection As OleDbConnection = New OleDbConnection _
3	 ("Provider=Microsoft.Jet.OLEDB.4.0;" _
4	 & "Data Source=|DataDirectory|\Note.mdb;" _
5	 & "User Id=admin;" _
6	 & "Jet OLEDB:Database Password=ado.net;")

7 Dim instance_adapter As New OleDbDataAdapter(selectCommandText, selectConnection)
8 Dim ds As New DataSet

9 instance_adapter.Fill(ds, "Information")

10 Dim MyPosition As Integer = Me.BindingContext(ds, "Information").Position
11 Dim IdValue As String = ds.Tables(0).Rows(MyPosition).Item("ID")

12 ds.Tables(0).Rows(MyPosition).Item("Name") = "Yaser AL-Shikh"
13 ds.Tables(0).Rows(MyPosition).Item("Age") = "32"
14 ds.Tables(0).Rows(MyPosition).Item("Phone") = "123456789"
15 ds.Tables(0).Rows(MyPosition).Item("Email") = "Yaser1395@hotmail.com"

16  instance_adapter.UpdateCommand = New OleDbCommand("UPDATE Information set Name=?, Age=?, Phone=?, Email=? WHERE Id =?", selectConnection)

17 instance_adapter.UpdateCommand.Parameters.Clear()
18 instance_adapter.UpdateCommand.Parameters.AddWithValue("?", "Yaser AL-Shikh")
19 instance_adapter.UpdateCommand.Parameters.AddWithValue("?", "25")
20 instance_adapter.UpdateCommand.Parameters.AddWithValue("?", "123456789")
21 instance_adapter.UpdateCommand.Parameters.AddWithValue("?", "Yaser1395@hotmail.com")
22 instance_adapter.UpdateCommand.Parameters.AddWithValue("?", IdValue)

23 Me.BindingContext(ds, "Information").EndCurrentEdit()
24 instance_adapter.Update(ds.Tables("Information"))

25 MsgBox("Update Successfully...", MsgBoxStyle.Information)

شرح الكود السابق ينطبق عليه بعض الشروحات التي سبق ذكرها ، لذا سنكتفي بشرج ما جد من الكود ، وهو متزامن مع أرقام الأسطر :

12- نقوم هنا بتحديث حقول السجل الحالي ( Name , Age ,Phone , Email ) في الجدول المخزن داخل الكائن DataSet ، وذلك نجده في كل من السطور رقم ( 12 ، 15 )

16- ولكي نقوم بتصدير البيانات المحدثة من الكائن DataSet إلى مصدر البيانات نحتاج إلى إعداد وتجهيز كائن الأمر UpdateCommandالتابع للكائن DataAdapter والخاص بتحديث سجل ، وذلك من خلال إسناد كائن أمر جديد وإعداده بجملة SQL اللازمة لعملية التحديث ، و كائن الاتصال اللازم أيضاً .

17- بعد ذلك نحتاج إلى إضافة البارامترات التي تم تعشيشها في جملة SQL السابقة الذكر ، مع قيمها الخاصة بها ، وكذلك البارامتر الخاص بتحديد السجل المراد تحديثه والذي قمنا بتخزين قيمته سابقاً في المتغير IdValue ، وكل ذلك نجده في السطور رقم ( 17 إلى 22 ) .

وقبل أن نختم الحديث عن عملية التحديث باستخدام الخاصية Update أريد أن أبين أنه عند قيام هذا الأمر بالعمل فإنه يقوم باختبار حالة الصف ، ويقوم بتنفيذ الأمر المطلوب سواء كان إضافة أو تحديث أو حذف ، وذلك بشكل متكرر لكل صف من الصفوف ، حيث أن تحديث الصفوف لا يتم دفعة واحده ، إنما يتم تحديث كل صف بشكل منفرد .

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

1. القيم التي أدخلت في DataRow للكائن DataSet تَنتقلُ إلى قِيَم البارامترات التي تم وضعها في جُمل SQL الخاصة بالتحديث ( الإضافة أو التعديل أو الحذف ) سواء تم بناء هذه الجمل من قبل CommandBuilder أو التي وضعت من قبل المبرمج بشكل يدوي .

2. يبدأ الحدث OnRowUpdating في الإقلاع .

3. يتم تنفيذ أمر التحديث الذي تم كتابته في جملة SQL ( سواء كان هذا التحديث للإضافة أو التعديل أو الحذف ) .

4. إذا الأمر أعد لإرْجاع السجلِ الأول ، فإن النتيجة الأولى التي تعود يكون موقعها في الـ DataRow . *

5. إذا كان هناك بارامترات ناتجه، فإنهم يوضُوعون في الـ DataRow. *

6. يبدأ الحدث OnRowUpdated في الإقلاع .

7. يتم استدعاء الخاصية AcceptChanges من الكائن DataSet .

* رقمي ( 4 ، 5 ) لست على دراية تامة بها ولكني نقلتها بعد أن قمت بترجمتها من MSDN لعله يوجد من يستفيد منها أو يوضحها لنا ، ونصها الأساسي هو :

4- If the command is set to FirstReturnedRecord, the first returned result is placed in the DataRow.

5- If there are output parameters, they are placed in the DataRow.

ملاحظة هامة : يمكن التوسع في هذا الأمر ، ولكنا سنكتفي بهذا الحد من المعلومات ، ومن الجدير بالذكر أننا لم نستخدم بعد عناصر التحكم المترابطة ، وكذلك باني الأوامر الكائن CommandBuilder والكائنات الأخرى ، والتي تختصر لنا الكود بنسبة مرضية جداً ، بالإضافة إلى المرونة وقوة التحكم ، من أجل ذلك نجد هنا أن الكود طويل ( أرجو أن نصبر قليلاً فهو في حقيقة الأمر اقل بكثير مما هو عليه) ، علماً أن الكود المذكور من أجل الشرح والفهم لما يدور خلف الكواليس فقط ، وسوف نعيد كتابة الاكواد السابقة بشكل مختصر ، وذلك عندما نتقدم في الدرس قليلاً ..

** هنا ينتهي حديثنا اليوم ، ونأخذ قسطاً من الراحة ، لكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس وذلك في المشاركات القادمة ..

ملاحظة : موضوعنا القادم سوف يكون الكائن CommandBuilder ، وسوف نتعلم كيف يختصر لنا هذا الكائن الكثير من الأكواد السابقه ، كما سنشاهد كيف يقوم هذا الكائن ببناء الأوامر الخصة بالتحديث .. إلى أن نلتقي مرة أخرى أترككم في حفظ الله ورعايته .. ياسر الشيخ

((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))

2

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#102

السلام عليكم

جزاء الله خيرا

وننتظر المزيد

شكرا

شكرا

#103

اخيرا يا اخ ياسر عودا احمد لقد انتظرناك كثيرا

ولكن كالمعتاد اتحفتنا بدرس رائع ماشاء الله وبارك الله فيك يا اخى وجعله فى ميزان حسناتك.

وفى انتظار الجديد منك ان شاء الله

#104

يزاك الله الف خير اخوي ياسر على الشرح

اشهد انك كفيت ووفيت

لكن بما اني مبتدأه شوي تهت ومب عارفه شو اسوي

انا عندي جداول مرتبطه ببعض بالعلاقات في Ms Access 2003

وهذا الكود الي استخدمته اول شي

Dim connection1 As OleDbConnection

Dim command1 As OleDbCommand

Dim sql1 As String

Dim connectionString1 As String

connectionString1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\HP\My Documents\ZonesCorp\App_Data\ZonesCorp.mdb"

connection1 = New OleDbConnection(connectionString1)

Try

connection1.Open()

sql1 = "insert into employee_details (emp_name,mother_name,passport_no) values('" & txtApplicantName.Text & "','" & txtMobile.Text & "'," & txtEmail.Text & ")"

' sql1 = "insert into factory_details (factory_name,telephone,fax) values('" & txtFactoryName.Text & "','" & txtTel.Text & "'," & txtFax.Text & ")"

command1 = New OleDbCommand(sql1, connection1)

Response.Write("The data was insert succesfully")

command1.ExecuteNonQuery()

Catch ex As Exception

Response.Write("Error was accured" & ex.ToString)

Response.Write(sql1)

connection1.Close()

End Try

Dim connection As OleDbConnection

Dim command As OleDbCommand

Dim sql As String

Dim connectionString As String

connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\HP\My Documents\ZonesCorp\App_Data\ZonesCorp.mdb"

connection = New OleDbConnection(connectionString)

Try

connection.Open()

sql = "insert into factory_details (factory_name,telephone,fax) values('" & txtFactoryName.Text & "','" & txtTel.Text & "'," & txtFax.Text & ")"

command = New OleDbCommand(sql, connection)

Response.Write("The data was insert succesfully")

command.ExecuteNonQuery()

Catch ex As Exception

Response.Write("Error was accured" & ex.ToString)

Response.Write(sql)

connection.Close()

End Try

لكن مب عارفه كيف اكمله

شو الطريقه الي لازم اتبعها ومناسبه لانه عندي علاقات بين الجداول

ع العلم الطريقه شغاله لما افك العلاقه بين الجداول

وجربت طريقه transaction

ونفس الشي تشتغل لما افك العلاقه بين الجداول

ويظهر لي خطأ

You cannot add or change a record because a related record is required in table 'factory_details'

اعتقد بسبب البريمري كي

لانه هو الوحيد الي مطلوب

علما انه عند فك العلاقات الكود يشتغل وتدخل البيانات في الجدولين مع

البريمري كي تلقائيا بدون ما ادخله

وهذا الكود السمتخدم

Dim connection1 As OleDbConnection

Dim myCommand As OleDbCommand

Dim sql1 As String

Dim connectionString1 As String

Dim myTrans As OleDbTransaction

connectionString1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\HP\My Documents\ZonesCorp\App_Data\ZonesCorp.mdb"

connection1 = New OleDbConnection(connectionString1)

Try

connection1.Open()

myTrans = connection1.BeginTransaction()

sql1 = "insert into employee_details (emp_name,mother_name,passport_no) values('" & txtApplicantName.Text & "','" & txtMobile.Text & "'," & txtEmail.Text & ")"

myCommand = New OleDbCommand(sql1, connection1, myTrans)

myCommand.ExecuteNonQuery()

'Issue another INSERT

myCommand.CommandText = "insert into factory_details (factory_name,telephone,fax) values('" & txtFactoryName.Text & "','" & txtTel.Text & "'," & txtFax.Text & ")"

Response.Write("The data was insert succesfully")

myCommand.ExecuteNonQuery()

myTrans.Commit()

MsgBox(" OK ", MsgBoxStyle.Information)

Catch ex As Exception

Response.Write("Error was accured" & ex.ToString)

Response.Write(sql1)

myTrans.Rollback()

Throw

' Finally

myCommand.Dispose()

connection1.Close()

End Try

ياليت ياخوي تشوفلي وين الخطأ

تم تعديل هذه المشاركة بواسطة Miss-Hearts في 18 أبريل 2007 في 02:01

#105

السلام عليكم ورحمة الله وبركاته

الاخت Miss-Hearts ياريت شئ من الايضاح ما هى الجداول المستخدمة فى الـ DataBase والحقول فى كل جدول وكيف عملتى العلاقات بين الجداول وما الهدف من البرنامج (ما هى العمليات التى تريدين تنفيذها بالبرنامج).

وذلك حتى نستطيع المساعدة. والله الموفق

#106

الأخت Miss-Hearts بارك الله فيك ..

أنصحك بالدرس الذي في توقيعي والذي يحمل عنوان " درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005 ." فهو مشروح بنسبة 70% تقريبا ، وأي غموض سوف تجدين له شرح مفصل في هذا الدرس الذي أنت فيه الأن ، وبما أنك مبتدئة عليك بفهم الاساسيات ، كي تكون بدايتك قوية ، ونصيحة أخرى عند كتابتك للكود في المنتدى استخدمي الرموز التي تجعله يظهر بشكل صحيح ..

وإذا كنت تريدين أستجابة سريعة نسبياً فعليك إرفاق مشروع صغير توضحين به المشكله التي تريدين لها حل ..

والله الموفق ،،،

1

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#107

مشكور اخوي ناصر وهذا موضوع مشكلتي

/index.php?showtopic=124166

اتمنى تشوفها لي

الاخ ياسر جزاك الله خير في الشراح كفيت

لكن مثل ما قلت لك بداتي وتهت في الموضوع واريد نصيحتكم شو ممكن اسوي

انا قريت موضوعك الثاني لكن حسيت به معقد ومب عارفه كيف اطبقه في مشروعي

انا مشروعي عباره عن ادخال بيانات جديده فقط

وبالنسبه للكود والله حاولت احطه في مربع الكود لكن ماعرفت كيف

واسفه اخوي ع الازعاج

#108

بسم الله الرحمن الرحيم

حمدا لله على عودتك

ومبروك تثبيت الموضوع :lol:

اللهم لا سهل الا ماجعلته سهلا، وانت تجعل الصعب ان شئت سهلا

83_45a7168be2ddb.jpg

#109

بسم الله الرحمن الرحيم

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..

=============

الكائن CommandBuilder :

من المعلوم أن الكائن DataAdapter يستخدم كائنات الأوامر ( SelectCommand ، InsertCommand ، UpdateCommand ، DeleteCommand ) لاختيار أو إضافة أو تحديث أو حذف السجلات في قاعدة البيانات ، وحيث أنه يجب على هذه الكائنات استخدام الكائن OleDbParamter ( أو SqlParamter ) لتحديد القيم التي يجب استخدامها لمعالجة قاعدة البيانات ، فإنه ولحسن الحظ لا يتوجب علينا إنشاء تلك الكائنات ( الإضافة أو التحديث أو الحذف وكذلك البارامترات ) بأنفسنا ، وذلك عندما نستخدم الكائن CommandBuilder ( والذي يسمى باني الأوامر ) و القيام بربطه بالكائن DataAdapter ، حيث سوف يتولى هو بإعداد الأوامر اللازمة و البارامترات المناسبة .

وطرقة تجهيزه للعمل بسيطة جداً ، وهي كما في الكود التالي ..

Dim MyComB As New OleDbCommandBuilder
MyComB.DataAdapter = instance_adapter

ويمكن اختصارها بالشكل التالي ..

Dim MyComB As New OleDbCommandBuilder(instance_adapter)

- ويبين الكود التالي كيف يمكن استخدام CommandBuilder لصنع كائن أمر DataAdapter لإضافة سجل جديد ..

وسوف نستخدم نفس الكود السابق شرحه مع بعض التعديلات الجديدة ، وهي ربط الكائن CommandBuilder بالكائن DataAdapter ، وفي السطر الأخير نعرض MsgBox نعرض فيها جملة SQL التي قام CommandBuilder ببنائها وكذلك عدد البارامترات التي استخدمها ..

Dim selectCommandText As String = "SELECT * FROM Information;"
Dim selectConnection As OleDbConnection = New OleDbConnection _
	("Provider=Microsoft.Jet.OLEDB.4.0;" _
	& "Data Source=|DataDirectory|\Note.mdb;" _
	& "User Id=admin;" _
	& "Jet OLEDB:Database Password=ado.net;")
Dim instance_adapter As New OleDbDataAdapter(selectCommandText, selectConnection)
Dim ds As New DataSet
instance_adapter.Fill(ds, "Information")

Dim MyDR As DataRow = ds.Tables("Information").NewRow
MyDR.Item("Name") = "Osamh Mohamed"
MyDR.Item("Age") = "18"
MyDR.Item("Phone") = "0123456789"
MyDR.Item("Email") = "Osamh@hotmail.com"
ds.Tables("Information").Rows.Add(MyDR)

Dim MyComB As New OleDbCommandBuilder(instance_adapter)

Me.BindingContext(ds, "Information").EndCurrentEdit()
instance_adapter.Update(ds, "Information")

MsgBox("Update Successfully...", MsgBoxStyle.Information)
MessageBox.Show(String.Format("The SQL InsertCommand Is :{0}{1}{2}{3}{4}The Count Of Paramters Is: {5}", vbNewLine, vbNewLine, MyComB.GetInsertCommand().CommandText, vbNewLine, vbNewLine, MyComB.GetInsertCommand().Parameters.Count))

بعد تنفيذ الكود السابق سوف نشاهد أن الكائن CommandBuilder كون لنا جملة SQL الخاصة بإضافة سجل جديد بشكل احترافي ، وأن عدد البارامترات التي استخدمها 4 ..

INSERT INTO Information (Name, Age, Phone, Email) VALUES (?, ?, ?, ?)

- ويبين الكود التالي كيف يمكن استخدام CommandBuilder لصنع كائن أمر DataAdapter لحذف سجل ..

وسوف نستخدم نفس الكود السابق شرحه مع بعض التعديلات الجديدة ، وهي ربط الكائن CommandBuilder بالكائن DataAdapter ، وفي السطر الأخير نعرض MsgBox نعرض فيها جملة SQL التي قام CommandBuilder ببنائها وكذلك عدد البارامترات التي استخدمها ..

Dim selectCommandText As String = "SELECT * FROM Information order by name"
Dim selectConnection As OleDbConnection = New OleDbConnection _
	("Provider=Microsoft.Jet.OLEDB.4.0;" _
	& "Data Source=|DataDirectory|\Note.mdb;" _
	& "User Id=admin;" _
	& "Jet OLEDB:Database Password=ado.net;")
Dim instance_adapter As New OleDbDataAdapter(selectCommandText, selectConnection)
Dim ds As New DataSet
instance_adapter.Fill(ds, "Information")

Dim MYPosition As String = Me.BindingContext(ds, "Information").Position

Me.BindingContext(ds, "Information").RemoveAt(MYPosition)

Dim MyComB As New OleDbCommandBuilder(instance_adapter)

Me.BindingContext(ds, "Information").EndCurrentEdit()
instance_adapter.Update(ds, "Information")

MsgBox("DELETED Successfully...", MsgBoxStyle.Information)
MessageBox.Show(String.Format("The SQL DeleteCommand Is :{0}{1}{2}{3}{4}The Count Of Paramters Is: {5}", vbNewLine, vbNewLine, MyComB.GetDeleteCommand().CommandText, vbNewLine, vbNewLine, MyComB.GetDeleteCommand().Parameters.Count))

بعد تنفيذ الكود السابق سوف نشاهد أن الكائن CommandBuilder كون لنا جملة SQL الخاصة بالحذف بشكل احترافي ، وأن عدد البارامترات التي استخدمها 9 ..

DELETE FROM Information WHERE ((ID = ?) AND ((? = 1 AND Name IS NULL) OR (Name = ?)) AND ((? = 1 AND Age IS NULL) OR (Age = ?)) AND ((? = 1 AND Phone IS NULL) OR (Phone = ?)) AND ((? = 1 AND Email IS NULL) OR (Email = ?)))

- ويبين الكود التالي كيف يمكن استخدام CommandBuilder لصنع كائن أمر DataAdapter لتحديث بيانات سجل ..

وسوف نستخدم نفس الكود السابق شرحه مع بعض التعديلات الجديدة ، وهي ربط الكائن CommandBuilder بالكائن DataAdapter ، وفي السطر الأخير نعرض MsgBox نعرض فيها جملة SQL التي قام CommandBuilder ببنائها وكذلك عدد البارامترات التي استخدمها ..

Dim selectCommandText As String = "SELECT * FROM Information order by name"
Dim selectConnection As OleDbConnection = New OleDbConnection _
	("Provider=Microsoft.Jet.OLEDB.4.0;" _
	& "Data Source=|DataDirectory|\Note.mdb;" _
	& "User Id=admin;" _
	& "Jet OLEDB:Database Password=ado.net;")
Dim instance_adapter As New OleDbDataAdapter(selectCommandText, selectConnection)
Dim ds As New DataSet

instance_adapter.Fill(ds, "Information")

ds.Tables(0).Rows(3).Item("Name") = "Yaser AL-Shikh"
ds.Tables(0).Rows(3).Item("Age") = "32"
ds.Tables(0).Rows(3).Item("Phone") = "0123456789"
ds.Tables(0).Rows(3).Item("Email") = "yaser1395@hotmail.com"

Dim MyComB As New OleDbCommandBuilder(instance_adapter)

Me.BindingContext(ds, "Information").EndCurrentEdit()
instance_adapter.Update(ds, "Information")

MsgBox("Update Successfully...", MsgBoxStyle.Information)
MessageBox.Show(String.Format("The SQL UpdateCommand Is :{0}{1}{2}{3}{4}The Count Of Paramters Is: {5}", vbNewLine, vbNewLine, MyComB.GetUpdateCommand().CommandText, vbNewLine, vbNewLine, MyComB.GetUpdateCommand().Parameters.Count))

بعد تنفيذ الكود السابق سوف نشاهد أن الكائن CommandBuilder كون لنا جملة SQL الخاصة بتحديث بيانات سجل بشكل احترافي ، وأن عدد البارامترات التي استخدمها 13 ..

UPDATE Information SET Name = ?, Age = ?, Phone = ?, Email = ? WHERE ((ID = ?) AND ((? = 1 AND Name IS NULL) OR (Name = ?)) AND ((? = 1 AND Age IS NULL) OR (Age = ?)) AND ((? = 1 AND Phone IS NULL) OR (Phone = ?)) AND ((? = 1 AND Email IS NULL) OR (Email = ?)))

وقبل أن نختم الحديث عن CommandBuilder أريد أن أوضح شيء مهم جداً ، وهو أنه قد يحدث عند تعبئتك للكائن DataSet بالجدول من خلال استخدام جملة SQL ( Select ) ، تكون هذه الجملة قد احتوت على استخدام الأقواس ( ] [ ) أو على فراغات في تسمية الجدول أو الحقول ، أو أن ألجملة تحتوي على كلمات محجوزة للغة SQL في تسمية الحقول مثل MEMO و DATE ، في هذه الحالة يجب علينا إضافة القوسين ( [ ] ) لجمل SQL ( InsertCommand ، UpdateCommand ، DeleteCommand )التي ينشئها باني الأوامر ، ويتم ذلك من خلال الخاصيتان QuotePrefix و QuoteSuffix ، وطرقة عملها سهل جداً ، والكود التالي يوضح الطريقة الصحيحة للتحديث من خلال باني الأوامر في مثل هذه الحالات ..

Dim MyComB As New OleDbCommandBuilder(instance_adapter)

MyComB.QuotePrefix = "["
MyComB.QuoteSuffix = "]"

instance_adapter.InsertCommand = MyComB.GetInsertCommand
instance_adapter.UpdateCommand = MyComB.GetUpdateCommand
instance_adapter.DeleteCommand = MyComB.GetDeleteCommand

Me.BindingContext(ds, "Information").EndCurrentEdit()
instance_adapter.Update(ds, "Information")

** هنا ينتهي حديثنا اليوم ، ونأخذ قسطاً من الراحة ، لكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس وذلك في المشاركات القادمة ..

ملاحظة : موضوعنا القادم سوف يكون " ربط عناصر التحكم Binding Controls " ، وسوف نتعلم كيف يمكننا إنعاش هذه العناصر وجعلها تنبض بالحياة .. إلى أن نلتقي مرة أخرى أترككم في حفظ الله ورعايته .. ياسر الشيخ

((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))

1

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#110

ما شاء الله اخ ياسر درس جميل ورائع كالعادة .

وفقك الله واعانك وجعل ما تعمله فى ميزان حسناتك.

#112

يقول النبي صلى الله عليه وسلم (لا يشكر الله من لا يشكر الناس)

جُزيت الجنة أستاذنا العزيز ياسر.

بصراحة ، من خلال الدرس قبل الأخير (خاصية الـ UpDate) بدأت أتنفس الصعداء، بدأت أطبق والحمد لله أولاً وآخراً وظاهراً وباطناً.

أستاذي العزيز ياسر، في الدرس المذكور أعلاه عند كتابة الأكواد (الكود رقم 26) قلت:

(وللقيام بعملية التحديث النهائية لمصدر البيانات نحتاج إلى إيقاف عملية التحديث على الجدول المطلوب ضمن الكائن DataSet ، وذلك حفاظاً على تزامن البيانات ) فبصراحة لم أفهم معنى تزامن البيانات!!!!!!!!!!!

أرجع للدرس الأول خصائص الـDATASET

الخاصية : HasChanges

فهمت أنها تشوف إذا كانت هناك تغيرات على الداتا سيت تعطيك القيمة True ، عدا ذلك False

السؤال : متى تستدعى هذه الخاصية ؟ في الفوم لود بعد تعبئة الداتا سيت؟ في زر الحفظ قبل كتابة كود إضافة السجل الجديد والتحديث؟ ((المعذرة لم أفهمها جيداً))

سؤال آخر:

قمت بكتابة الكود التالي لقراءة أول سجل في مربع الاسم:

TxtNameS.Text = (MyDS.Tables("students").Rows(0).Item("studentName"))

والكود ناجح

أردت أن أفعّل زر التالي ، فكتبت :

Dim MyPosition As Integer = Me.BindingContext(MyDS, "students").Position
		Me.BindingContext(MyDS, "students").Position = MyPosition + 1

لم ينجح الكود !

اعذرني يا أستاذ ياسر، فبعض الأشياء أبنيها على الفهم، وبعض الأشياء أبنيها على جرّب

وأخيراً: أتمنى شرح عبارة Me.BindingContext

alshameri2007y@hotmail.com

#113

حدث خطأ في كتابتي للتعقيب (عذراً)

تم تعديل هذه المشاركة بواسطة ibn alatheer في 24 أبريل 2007 في 11:26

alshameri2007y@hotmail.com

#114
ibn alatheer كتب:
الأستاذ العزيز ياسر:

تعقيب على سؤالي عن الخاصية : HasChanges

استدعيتها بعد أن أضفت سجل جديد على الداتا سيت وقبل أن أنقل التعديل وأحدث قاعدة البيانات الأصلية كتبت

if myds.haschanges= true
msgboxd "thank"
else
msgbox "sorry

"

والسؤال : متى سأستخدمها ، وهل تستخدم بكثرة وتعتبر ذات أهمية؟

alshameri2007y@hotmail.com

#115

أخي الغالي إبن الأثير ، قبل أن أجيبك أريد أن ألفت إنتباه عناية السادة المبرمجين إلى عبارة أكتبها دائما في كل دروسي وهي ..

** هنا ينتهي حديثنا اليوم ، ونأخذ قسطاً من الراحة ، لكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس وذلك في المشاركات القادمة ..

ولكن للأسف أعتب على أخواني لأني لا أجد من يعلق على الدرس ويقدم لي النصائح ، أو من يتساءل عن بعض النقاط فيه كي نلقي عليها بعض الضو ونعطيها المزيد من الإضاح ، أو من ينتقده نقداً بناءاً مما يساعدنا في تصحيح أخطاؤه ...

والأن إليك الجواب :

*من المعلوم أن الجدول الذي تم تخزينه في الكائن DataSet ما هو إلا صورة طبق الأصل من الجدول الموجود في مصدر قاعدة البيانات ، وحينما نقوم بتحديث قيم بيانات الجدول الموجود في الكائن DataSet ، يجب تحديث نفس البيانت للجدول الأصلي في مصدر قاعدة البيانات وبنفس القيم ذاتها ، وهذا ما أعتقد أنه يسمى المحافاظه على تزامن البيانات ، وبعبارة أخرى نريد أن نرسل نفس التحديث الذي تم للبيانات في الكائن DataSet إلى مصدر قاعدة البيانت ، حيت أنه من المحتمل أن يتم التعديل على البيانات في الكائن DataSet في نفس الوقت الذي نريد فيه نقل التحديث إلى مصدر قاعدة البيانات فيحصل أننا نكون قد نقلنا يبانات مختلفة عن البيانات الموجوده في الكائن DataSet ، لذلك كان يتوجب علينا إيقاف عملية التحديث على الجدول المطلوب ضمن الكائن DataSet وذلك بشكل مؤقت حتى ننتهي من نقل البيانت إلى مصدر قاعدة البيانات .

وكي تكون الصورة واضحة أكثر لنفرض أنه لدينا كائن Dataset وبه جدول وفي هذا الجدول عمود يخزن الاسماء ، وأول اسم في هذه الأسماء " ياسر " فقمنا بتحديثه بحيث يصبح " سمير " ، هذا التحديث جرى فقط على الجدول الذي في الكائن DataSet ويجب علينا تحديث نفس الجدول في ملف مصدر قاعدة البيانات وفي نفس العمود وفي نفس القيمة من " ياسر " إلى " سمير " ، هذا هو تزامن البيانات المطلوب ، ولكي يتم نحتاج إلى إقاف عملية التحديث للكائن DataSet حتى لا تتغير القيمة التي نريد إرسالها إلى ملف مصدر قاعدة البيانات بشكل أو بأخر ، كما نعلم هنأك برامج تعمل على أنظمة شبكات ويوجد أكثر من مستخدم ، حينها من الظروري إنشاء تقييدات من أجل المحافظة على تزامن البيانات .

(( قد أكون محقاً فيما قلت سابقا ، أو على خطأ ، لكن هذا هو تصوري للأمر ، فمن كانت له رؤية صائبة غير ذلك فل يصحح لنا مشكوراً ))

* استخدام الخاصية HasChanges يكون بناءً على ما يريده المبرمج ، فيمكننا استخدامها عند تحديث البيانات كما وضحنا في الدرس ، أو عند الخروج من البرنامج ، وذلك للتحقق من وجود بيانات لم تحفظ بعد فيتم حفظها قبل الخروج ، وهي من الخصائص المهمة بالطبع ولكن استخدامها يعود على المبرمج كما أسلفت .

* عالم الإبحار والتنقل بين البيانات وكذلك البحث عن البيانات ممتع جداً في ADO.NET ولا سيما 2005 وكل ذلك سنتناوله في الدروس القادمة ومن عدة جوانب ، ولكن الكود المذكور في بداية كل هده الدروس ما هو إلا مدخل أو بداية حيث أننا نفترض أننا بدأنا من الصفر وإن شاء الله إلى الإحتراف ، ودعني أوضح أكثر ..

الكود الذي قلت أنه لم ينجح هو في حقيقة الأمر نجح وقام الـ DataSet بالإنتقال إلى السجل التالي ، ولكن بما أننا لم نستخدم عناصر التحكم المترابطه ( التي سف تكون درسنا التالي بمعونة الله ) لم تشاهد أي تغير على مربع النص والسبب الأخر هو أن الكود الذي استخدمته أنت ما هو إلا لعرض قيمة أول سجل ، ولكي تشاهد التغير على مربع النص تحتاج لتعديل بسيط بحيث يعرض قيمة السجل الحالي وليس أول سجل فقط ، إليك الكود التالي ..

Dim MyPosition As Integer = Me.BindingContext(MyDS, "students").Position
Me.BindingContext(MyDS, "students").Position = MyPosition + 1
MyPosition = Me.BindingContext(MyDS, "students").Position
TxtNameS.Text = MyDS.Tables("students").Rows(MyPosition).Item("studentName")

ملاحظة : الخاصية Position تعطينا ترتيب السجل الحالي داخل الجدول وذلك على شكل قيمة رقمية تبدأ من الصفر للسجل الأول .

* الخاصية BindingContext إحدى خواص النموذج ( Form ) وهي تستخدم مصدر البيانات في النموذج كممرر ، وهذا المصدر في موضوعنا هنا هو ( MyDS, "students" ) ، ومن خلالها نستطيع أن نرتبط بمصدر البيانات في النموذج ، حيث أن ذلك يسل لنا الوصول إلى المعلومات الخاصه بالبيانات التي تنعامل معها في الكائن DataSet والتحكم بها . هذا هو تصورى لهذه الخاصية بكل بساطه ، وللمزيد من المعلومات أحيلك للروابط التالية :

( /index.php?showtopic=76617 ) .

أو ( http://msdn2.microsoft.com/en-us/library/s...ingcontext.aspx )

أو ( http://msdn2.microsoft.com/en-us/library/s...xt_members.aspx )

والله الموفق ..

1

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#116

ربنا يوفقك أخي على كل حرف كتبته ..

شرحك ولا أجمل ..

سلس ومفهوم 100 % ..

بالتوفيق أخي

#117

الله عليك

وربنا يبارك فيك يا أخر ياسر

والله أفادتنى كتيررررررررررررررررررررر

Oracle Developer

#118

مشكور اخوي ع الشرح كفييت ووفيت

يزاك الله خير وان شاء الله في ميزان حسناتك

الصراحه استفدت وااايد

وحبيت اشكرك على المجهود

#119

بسم الله الرحمن الرحيم

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..

=============

ربط عناصر التحكم Binding Controls :-

مقدمة : تقوم فكرة ربط عناصر التحكم على ربط البيانات المتوفرة في DataTable أو DataSet بأحد عناصر التحكم الموجودة في واجهة المستخدم الرسومية على سبيل المثال :

CheckBox ، ComboBox ، DateTimePicker ، Label ، LinkLabel ، ListBox ،

ListView ، MonthCalendar ، PictureBox ، ProgressBar ، RadioButton ،

RichTextBox ، StatusBar ، TextBox ، TreeView ، DataGridView ...

هذا فقط على سبيل المثال لا الحصر ، وبعد أن يتم ربط عناصر التحكم بمصدر البيانات ، فإنه يتم إنعاشها فتصبح تنبض بالحياة ، حيث أن أي تغييرات تتم على مصدر البيانات ستنعكس تلقائياً عليها وكذلك العكس حيث أن أي تغيير يتم على قيم هذه العناصر فإنه ينعكس على مصدر البيانات وفي هذه الحالة لو استدعينا الخاصية HasChanges التابعة للكائن DataSet فإنها سوف تعيد القيمة True . إضافة إلى أن الربط فيما بين عناصر التحكم ومصادر البيانات يسهل علينا عملية البحث و الإبحار والتنقل بين البيانات لان عناصر التحكم في هذا الحالة سوف تعرض القيم الحالية للبيانات المتوفرة في مصادر البيانات .

طرق ربط البيانات بعناصر التحكم :-

هناك طريقتان لربط البيانات بعناصر التحكم ، أولاهما Binding at design time أي الربط في وقت التصميم ويتم باستخدام الأدوات والمعالجات ، والأخرى Binding at run time أي الربط في وقت التشغيل ويتم باستخدام الكود وهو ما سنقوم بدراسته هنا .

أنواع ربط البيانات بعناصر التحكم :-

هناك نوعان من الربط ويعتمدان على نوع عنصر التحكم الذي نريد أن نربطه بمصدر البيانات ..

* النوع الأول ويسمى الربط البسيط ( Simple-bind control ) :-

وهو يختص بعناصر التحكم التي تستقبل ( single value ) أي قيمة حقل واحد من مصدر البيانات على سبيل المثال TextBox ، Lable ، DateTimePicker ، PictureBox ، MonthCalendar

وللقيام بعملية الربط سوف نستخدم الكائن Binding ، ونقوم بتجهيزه للعمل وذلك عن طريق تزويده ببعض المتغيرات ( البارامترات ) وهي كالتالي :

1- PropertyName :

( The name of the control property to bind )

وهو يشير إلى الخاصية الخاصة بأداة التحكم والتي سوف تستورد القيمة النصية القادمة من قاعدة البيانات وتعرضها في النموذج ، ومن خلالها أيضا نقوم بتصدير القيمة المخزنة فيها إلى قاعدة البيانات وذلك عند عملية التحديث . وهي تختلف من أداة تحكم إلى أداة أخرى ، فهي يمكن أن تأخذ إحدى القيم التالية ((Text ، Tag ، Value ، Checked ، Image ، SelectedValue )) .

2- DataSource :

( An Object that represents the data source )

وهو يشير إلى مصدر البيانات ، ونقصد بمصدر البيانات هنا الكائن الذي يحتوي على جدول أو جداول قاعدة البيانات ، ونستطيع أن نحدد على سبيل المثال أي كائن من الكائنات التالية كمصدر بيانات (( DataSet ، DataTable ، DataView ، DataViewManager ، BindingSource ))

3- DataMember :

(The property or list to bind to )

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

4- formattingEnabled :

( true to format the displayed data; otherwise, false )

وهو متغير اختياري ، له قيمتان إما صائب True يسمح بقراءة القيمة المخزنة وتهيئها وتحويلها من صيغة إلى صيغة أخرى أو خاطئ False وهو عكس السابق ، وهو مهم جدا لبعض الأدوات أعلم منها PictureBox حيث يجب أن نجعله True من أجل تحويل القيمة المخزنة في قاعدة البيانات من byte إلى Bitmap كي تتمكن هذه الأداة من عرض الصور ( اجتهاد فردي مني ، والله أعلم ) .

وبعد تجهيز الكائن Binding نقوم بإضافته للخاصية DataBindings التابعة لأداة التحكم . وبذلك نكون قد انتهينا من عملية الربط وأصبحت أداة التحكم متصلة بمصدر البيانات بشكل مباشر . ولعل المثال التالي يساعد في توضيح ما سبق :

لنفرض أن لدينا كائن DataSet كمصدر بيانات وفيه جدول يحمل اسم Information ويوجد بهذا الجدول عمود يحمل اسم Name ، ونريد أن نربط الخاصية Text التابعة لأداة التحكم TextBox بقيم حقول العمود Name ، كي يتم ذلك فلنلقي نظرة على الكود التالي ..

Dim bindName As Binding
bindName = New Binding("Text", MyDataSet.Tables("information"), "Name")
TextBox.DataBindings.Add(bindName)

يمكننا كتابة الكود السابق بالشكل التالي ..

Dim bindName As Binding
bindName = New Binding("Text", MyDataSet, "information.Name")
TextBox.DataBindings.Add(bindName)

ويكن اختصار الكود السابق بالشكل التالي ..

Dim bindName As New Binding("Text", MyDataSet, "information.Name")
TextBox.DataBindings.Add(bindName)

ويكن اختصار الكود السابق بالشكل التالي ..

TextBox.DataBindings.Add(New Binding("Text", MyDataSet, "information.Name"))

بعد ذلك سوف نجد أن أداة التحكم تعرض لنا قيمه أول حقل من حقول العمود Name ، وعند القيام بالتنقل بين حقول العمود Name والإبحار وكذلك البحث ، سنجد أن القيمة النصية المخزنة في أداة التحكم TextBox تتغير بتغير مواضع تلك الحقول .

وهذه بعض الصور لعمليات الربط البسيط لبعض أدوات التحكم :

TextBox.DataBindings.Add(New Binding("Text", MyDataSet, "information.Name"))
TextBox.DataBindings.Add(New Binding("Tag", MyDataSet, "information.Name"))
Lable.DataBindings.Add(New Binding("Text", MyDataSet, "information.ID_Student"))
CheckBox.DataBindings.Add(New Binding("Checked", MyDataSet, "information.Good"))
CheckBox.DataBindings.Add(New Binding("Tag", MyDataSet.Tables("information"), "Good")
DateTimePicker1.DataBindings.Add(New Binding("Text", MyDataSet, "information.date"))
DateTimePicker1.DataBindings.Add(New Binding("Value", MyDataSet, "information.date"))
PictureBox.DataBindings.Add(New Binding("Image", MyDataSet, "imageData", True))

* النوع الثاني ويسمى الربط المركب ( Complex-bind control ) :

وهو يختص بعناصر التحكم التي تستقبل ( multiple values ) أي عدة قيم ( DataColumn ) من مصدر البيانات مثل ComboBox ، ListBox أو مصدر بيانات كامل ( DataTable ) مثال DataGridView . وللقيام بعملية الربط هناك أكثر من أسلوب وبعضها مختصر ورائع ، وسوف نتدرج في الشرح إلى أن نصل للأسلوب الأفضل والأسهل . ومن الجدير بالذكر أننا في الربط المركب نستطيع أن نربط أدوات التحكم إما لعرض البيانات فقط أو للعرض والتحديث ، وسنتناول الطريقتين في السطور القادمة .

يجب في البداية تجهيز بعض خصائص أداة التحكم ، وهي تختلف من أداة تحكم إلى أداة تحكم أخرى ، وهي كما يلي :

1- الخاصية DataSource :

ونقوم بتمرير مصدر البيانات لهذه الخاصية ، ونقصد بمصدر البيانات هنا الكائن الذي يحتوي على جدول قاعدة البيانات والذي نريد أن نعرض بياناته على هذه الأداة ، ونستطيع أن نحدد على سبيل المثال أي كائن من الكائنات التالية كمصدر بيانات لهذه الخاصية (( DataSet ، DataTable ، DataView ، DataViewManager ، BindingSource ))

2- DisplayMember :

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

3- ValueMember ( اختياري ) :

وتظهر أهمية هذه الخاصية في حالة كنا نريد أن نعرض للمستخدم قيمة أحد الأعمدة ( وذلك باستخدام الخاصية " DisplayMember " التي تحدثنا عنها منذ قليل ) ونخزن في قاعدة البيانات قيمة عمود أخر ، حيث أننا سوف نقوم بتمرير قيمة نصية لهذه الخاصية تحمل اسم العمود الأخر .

4- DataBindings ( اختياري ):

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

أمثلة تطبيقية على الربط المركب لأدوات التحكم ( Complex-bind control ) :

1- بفرض أننا نريد أن نربط أداة تحكم من نوع ListBox بقيم العمود الذي يحمل اسم " Name " وهو أسماء الطلاب ، علما أن هذا العمود أحد أعمدة الجدول Students وهذا الجدول مخزن في الكائن DataSet ، وللقيام بعملية الربط فلنتفحص الكود التالي ..

ListBox1.DataSource = MyDataSet
ListBox1.DisplayMember = "Students.name"

ويمكن كتابة الكود السابق بشكل آخر ..

ListBox1.DataSource = MyDataSet.Tables("Students")
ListBox1.DisplayMember = "name"

2- بفرض أننا نريد أن نملأ أداة التحكم من نوع ComboBox بالقيم ( Male , Female ) وذلك بالطريقة التقليدية ، ولكنا أيضا نريد أن نجهز الأداة نفسها كي تكون قادرة على حفظ القيمة التي يختارها المستخدم من القائمة المنسدلة لها في العمود الذي يحمل اسم " CustomerSex " علما أن هذا العمود أحد أعمدة الجدول Customers وهذا الجدول مخزن في الكائن DataSet ، وللقيام بعملية الربط و التجهيز للحفظ فلنتفحص الكود التالي ..

ComboBox1.Items.Add("Male")
ComboBox1.Items.Add("Female")
ComboBox1.DataBindings.Add(New Binding("Text", MyDataSet.Tables("Customers"), "CustomerSex"))

3- بفرض أننا نريد أن نربط أداة تحكم من نوع ComboBox بقيم العمود الذي يحمل اسم " City " وهو أسماء المدن ، علما أن هذا العمود أحد أعمدة الجدول Information وهذا الجدول مخزن في الكائن DataSet ، ونريد أيضا أن نجهز نفس الأداة كي تكون قادرة على حفظ القيمة التي يختارها المستخدم من القائمة المنسدلة لها في العمود الذي يحمل اسم " CustomerCity " علما أن هذا العمود أحد أعمدة الجدول CustomerAddresses وهذا الجدول مخزن في الكائن DataSet أيضاً ، وللقيام بعملية الربط و التجهيز للحفظ فلنتفحص الكود التالي ..

ComboBox1.DataSource = MyDataSet.Tables("Information")
ComboBox1.DisplayMember = "City"
ComboBox1.DataBindings.Add(New Binding("text", MyDataSet.Tables("CustomerAddresses"), " CustomerCity"))

4- بفرض أننا نريد أن نربط أداة تحكم من نوع ComboBox بقيم العمود الذي يحمل اسم " City " وهو أسماء المدن وذلك من أجل عرض أسماء المدن للمستخدم ، و نريد من الأداة نفسها أن تحتفظ بقيم العمود الذي يحمل اسم " ID_City " وهو يدل على أرقام المدن وذلك من أجل عملية الحفظ فيما بعد ، علما أن هذين العمودين من أعمدة الجدول Information وهذا الجدول مخزن في الكائن DataSet ، ونريد أيضا أن نجهز نفس الأداة كي تكون قادرة على حفظ القيمة التي تحتفظ بها وليس التي تعرض للمستخدم والتي يختارها المستخدم من القائمة المنسدلة لها ، في العمود الذي يحمل اسم " CustomerCity " علما أن هذا العمود أحد أعمدة الجدول CustomerAddresses وهذا الجدول مخزن في الكائن DataSet أيضاً ، وللقيام بعملية الربط و التجهيز للحفظ فلنتفحص الكود التالي ..

ComboBox1.DataSource = MyDataSet.Tables("Information")
ComboBox1.DisplayMember = "City"
ComboBox1.ValueMember = "ID_City"
ComboBox1.DataBindings.Add(New Binding("selectedValue", MyDataSet.Tables("CustomerAddresses"), " CustomerCity"))

5- بفرض أننا نريد أن نربط مصدر بيانات كامل مثل الجدول CustomerAddresses ( هذا الجدول مخزن في الكائن DataSet ) في أداة التحكم DataGridView وذلك من أجل عرض البيانات وحتى التعديل عليها وحفظها فيما بعد ، فإن الأمر بغاية السهولة ، وللقيام بعملية الربط و التجهيز للحفظ فلنتفحص الكود التالي ..

DataGridView1.DataSource = MyDataSet
DataGridView1.DataMember = "CustomerAddresses"

ويمكن اختصار الكود كي يصبح بالشكل التالي ..

DataGridView1.DataSource = MyDataSet.Tables("CustomerAddresses")

** هنا ينتهي حديثنا اليوم ، ونأخذ قسطاً من الراحة ، لكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس وذلك في المشاركات القادمة ..

ملاحظة : موضوعنا القادم سوف يكون " الكائن BindingSource " ، وسوف نتعلم كيف يمكننا إدارة العمل على الكائن Dataset من إضافه وحذف وغيره ، وكذلك الإبحار في قاعدة البيانات وعمل فلتر الترشيح للبيانات .. إلى أن نلتقي مرة أخرى أترككم في حفظ الله ورعايته .. ياسر الشيخ

((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))

تم تعديل هذه المشاركة بواسطة yaseralshikh في 16 مايو 2007 في 23:02

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#120

جزاك الله خير ووفقك وأثابك

#121

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اخي ياسر

شرحك جميل جدا

فعلا من الصفر للاحتراف

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

وفقك الله وجزاك الف خير

#122

السلام عليكم ورحمه الله وبركاته ،

بعد غياب طويل لظروف الدراسه اعود الى المنتدى مجددا والى دروسك اخي الفاضل ياسر بشكل خاص :rolleyes:

لقد قرأت كل الدروس ( من هذا الموضوع المتضخم ما شاء الله :blink: ) ووقفت عند اخر درسش وهو موضوع الربط Binding خصوصا الربط المعقد وهناك لدي حاليا سؤال،

لدي قاعدة بيانات اود حفظ اي قيمه من اداة قائمة ComboBox تم اختيارها ، وقد اضفت العناصر الى القائمة من خلال مصمم النماذج ، بعدها كتبت الكوةد التالي في الرطب ( كما ذكرت انت الطريقة في الشرح ) :

		cmbWard.DataBindings.Add("Text", dsAdd, "MainTable.Ward")

وعندما اقوم بحفظ البيانات يتم حفظ كل البيانات الى الحقول المحدده عدا القيمه المختاره في الاداة cmbWard !

فأين الخطأ ؟ :wacko: :wacko:

#123

السلام عليكم..

عندي مشروع حاليا اتمنى منكم مساعدتي ..

المشكلة الاولى لدي انني عندما قمت بربط اعدة البيانات (في sql) بالفيجوال تم الربط بدون مشاكل ولكن قرأت هنا في هذه الصفحات

أن يتوجب علي نقل قاعدة البيانات الى المجلد pin تبع المشرو والقاعدة عندي كلما أردت نسخها تظهر لي رسالة انها مستخدمة

من قبل برنامج آخر لا يمكن نسخها وتغير رمز ال sql إلى رمز file script .. انا حاولت نسخها من ملف data الموجود داخل mssql ويظهر لي لكل قاعدة بيانات

ملفين database file أي منها أقوم بنسحة وكيف ..

وهل من الضروري ان تكون قاعدة البيانات موجودة داخل المجلد pin في ال sql قبل البدء في المشروع ????

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

موفقين لكل خير,,,,

#124

بسم الله الرحمن الرحيم

أخي الغالي النبهاني ..

لم استوعب قولك " وقد اضفت العناصر الى القائمة من خلال مصمم النماذج " بشكل دقيق ، كما أنك لم تحدد المشكله بدقه ولم تذكر فيما إذا صادفك إي استثناء أو أي شيء غير عادي ، المهم ربما لو ارفقت لنا مثال ربما تتقارب المفاهيم ، ونصل إلى الخلل فنصححه ونوضحه قدر الإمكان ..

الأخت مبرمجة 4 ..

لا يتوجب عليك نقل قاعدة البيانات الى المجلد pin ، ولكنه الأفضل عند الرغبة في الاتصال بقاعدة البيانات من نفس مسار البرنامج بغض النظر عن موقع البرنامج ، كما أن هذا الحديث كنا نقصد به قاعدة البيانات المعدة ببرنامج Microsoft Office Access ، وليس برنامج SQL Server .

تم تعديل هذه المشاركة بواسطة yaseralshikh في 31 مايو 2007 في 18:46

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#125

اخي ياسر شكرا لك ، ولقد حللت المشكلة من خلال انشاء جدول كامل خاص بالعناصر التي اريد ظهورها في الاداة ومن ثم تخزين القيمه المتخاره بقيمه العمود ID ،

تحياتي

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…