بسم الله الرحمن الرحيم
وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين ، أما بعد ..
اعتذر على الانقطاع ..
اشكر الجميع على المتابعة ..
اقدم اليوم شرح مختصر للإستفسارات التي طلبها أخي محمد ...
1- هذا الكود :
ds2.Tables("TheBankAndData").Rows.Countيعطينا عدد السطور ( السجلات ) في الجدول الذي أسميناه TheBankAndData .
2- هذا الكود :
ds2.Tables("TheBankAndData").Rows(0)("ask")يعطينا القيمة المخزنة في الصف ( الأول ) رقم صفر الموجوده في الحقل Ask من الجدول TheBankAndData ، كما ذكرت تماماً .
3- هذا الكود :
Dim maxIdCommand As OleDbCommand = New OleDbCommand("SELECT MAX(id) AS MaxID FROM thebank ", cn)
Dim maxId As Object = maxIdCommand.ExecuteScalar() + 1في السطر الأول قمنا بالتصريح عن متغير من نوع Command واسميناه maxIdCommand ، وجملة الاستعلام التي سوف يقوم بتنفيذها هذا الامر ما هي إلا استخراج أكبر قيمه في الحقل ( العمود ) ID والذي طلبنا من جملة الاستعلام تغيير اسمه مؤقتاً إلى MaxID وذلك بستخدام عبارة AS . والسبب في تغيير الاسم هنا هو نوع من الترف بمعنى انه غير مهم إلا انه للتوضيح ليس أكثر ..
وفي السطر الثاني قمنا بالتصريح عن متغيير من نوع Object وأسميناه maxId ، والهدف منه هو أن نخزن فيه القيمه التي سوف يعود بها الأمر maxIdCommand وهي هنا عباره عن رقم بالطبع وذلك بستخدام الخاصية ExecuteScalar التابعة للأمر maxIdCommand و التي تعيد لنا قيمة واحده ، ومن ثم نضيف عليه رقم 1 . والهدف من كل ذلك ، انه عندما نحفظ سجل جديد في الجدول الأب TheBank ينشئ بشكل أوتوماتيكي رقم جديد في الحقل ID ( لاننا عندما صممنا قاعدة البيانات بواسطة برنامج الأكسس طلبنا ذلك للحقل ID ) وهذا الرقم يزيد عن الرقم الذي يسبقه بواحد ، ولكي نربط السجل الجديد في الجدول الأب بالسجل الجديد في الجدول الإبن Data ، لا بد أن يحمل السجل الجديد في الجدول الإبن نفس الرقم المذكور أنفاً ( الرقم ألأُتوماتيكي ) ، ولكي نفعل ذلك جعلنا البرنامج يقرأ لنا أكبر رقم في الحقل ID الموجود في الجدول الاب ويضيف عليه 1 ومن ثم عند حفظ سجل جديد في الجدول الابن يقوم بتخزين الرقم المخزن في maxId في الحقل ID التابع للجدول الابن .
ومن المهم التنبيه إلى أن هذه الطريقه غير مجديه في حالة الرقم الذي ينشأ بشكل أوتوماتيكي ، فلقد سببت لي الكثير من الصداع بسبب الاخطاء التي قد تنتج عنها ، فلو حفظنا خمس سجلات جديده وحذفنا واحد منها سوف يصبح أكبر رقم في الحقل ID هو الرقم أربعة ، وفي حالة الرغبه في إظافة سجل جديد و طبقنا هذه الطريقة أنظر ما ذا سوف يحدث : الامر maxIdCommand سوف يرجع لنا بالعدد 4 والمتغير maxId سوف يعود لنا بالرقم 4+1 يعني 5 ، وعند إضافة سجل جديد للجدول الأب سوف يوجد رقم بشكل أوتوماتيكي للحقل ID وهو الرقم 6 ، وعند إضافة سجل جديد للجدول الإبن سوف يخزن القيمة المخزنه في maxId وهي الرقم 5 ، وبذلك لن يرتبط هاذين السجلين في الجدولين ببعظهما . لذلك قمت بالتغلب على هذه المشكلة في المشاركة رقم 30 أو يمكنكم تحميل الملف المرفق في المشاركة رقم 48 والإطلاع على الكود ودراسته .
4- هذا الكود :
InsertCommand.Parameters.AddWithValue("?", txtask.Text)قبل التحدث عن هذا الكود يجب أن نتطرق لما قبله كي نكون صوره واضحة ، لقدصرحنا عن متغير من نوع Command وأسميناه InsertCommand وهو لإظافة سجل جديد وفي جملة الإستعلام حددنا الحقول التي سوف تضاف لها معلومات جديده وكان من ظمنها الحقل Ask ، وحددنا أيضا البيانات المضافة لهذه الحقول ورمزنا لها بالرمز ? على الترتيب والتوالي ( بحيث الاستفهام الأول للحقل الأول والثاني للثاني وهكذا .. ) . وبعد ذلك استدعينا الخاصية Parameters للأمر InsertCommand وطلبنا الخاصية AddWithValue للخاصية Parameters وحددنا انه مكان الرمز ? نخزن القيمة الموجوده في مربع النص txtask .
5- هذا الكود :
InsertCommand.ExecuteNonQuery()
تجعل هذه الخاصية ( ExecuteNonQuery ) الأمر InsertCommand ينفذ جملة الإستعلام المطلوبه منه ، والتي هي ليست استفساراً .
6- هذا الكود :
maxIdCommand.Dispose()
هذا الأمر( Dispose ) يتخلص من المتغير maxIdCommand لأننا لم نعد نحتاجه . يعني اننا نستخدمه في حالة رغبتنا في عدم استخدام شيئ كي لا يحتل جزء من الذاكره بدون طائل .
أرجو أن أكون وضحت الأمور ولم أزدها غموضاً ..
ان أخطأت فمن نفسي والشيطان وإن أصبت فبتوفيق الله ، والحمد لله ...
تم تعديل هذه المشاركة بواسطة yaseralshikh في 12 سبتمبر 2006 في 22:53
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005








