المتابعون للمدونة

الاثنين، 23 يناير 2017

المعاملات Parameters


المعاملات Parameters:

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

وتختلف صيغة هذه العلامة تبعا لنوع مزود البيانات، فمزود سيكويل يستخدم الرمز @ لتمييز المعامل، يتبعه اسم متغير بدون أن يفصل بينهما مسافات (مثل @UserName).. لهذا نستطيع كتابة الاستعلام عن كتب أحد المؤلفين كالتالي:

Cmd.CommandText = "SELECT Books.Book " +
          "FROM Authors, Books " +
           "WHERE Authors.ID = AuthorID " +
           "AND Authors.Author = @Author"

هذا يبدو كأننا عرفنا متغيرا اسمه @Author واستخدمناه في جملة الاستعلام، ليتم التعويض عنه عند تنفيذها.

أما في مزود OLEDB و ODBC فيتم استخدام علامة الاستفهام الإنجليزية ? للإشارة إلى وجود معامل، دون منح هذا المعامل أي اسم:

Cmd.CommandText = "SELECT Books.Book " +
          "FROM Authors, Books " +
           "WHERE Authors.ID = AuthorID " +
           "AND Authors.Author = ?"

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

Cmd.CommandText = "SELECT Books.Book " +
          "FROM Authors, Books " +
           "WHERE Authors.ID = AuthorID " +
           "AND Authors.Author = AuthorValue"

في هذه الحالة ستعتبر آكسيس أن AuthorValue هو اسم معامل.. بل يمكنك أيضا أن تستخدم الاسم @Author في الاستعلام، وستقبله آكسيس كاسم معامل، وهذا يساعدك على استخدام نفس استعلامات سيكويل سيرفر مع آكسيس!

لكن هذا المرونة من آكسيس تسبب مشكلة غريبة في بعض الأحيان، فلو أخطأت مثلا في كتابة اسم الحقل AuthorID في الاستعلام السابق، وكتبته مثلا AutherID، فستعتبره آكسيس اسم معامل، وبدلا من أن تحصل في برنامجك على رسالة تخبرك أن هذا العمود ليس موجودا في الجدول، ستحصل على رسالة تخبرك بأن قيم بعض المعاملات مفقودة.. هذا هو السبب الذي سيجعلك ترى آلاف الأسئلة من المبرمجين عن سبب ظهور هذه الرسالة الغربية في برنامجهم:
"No value given for one or more required parameters"

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

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

ويشترط في حالة سيكويل سيرفر أن يكون لكل من المعامل الموجود في نص الاستعلام والمعامل الموجود في مجموعة المعاملات نفس الاسم.. فإذا عرّفت في نص الاستعلام معاملا اسمه @Author، فيجب أن يكون اسمه في مجموعة المعاملات أيضا @Author.

أما معاملات OLEDB و ODBC فكلها ممثلة بالرمز ? ما يجعلك مضطرا إلى تعريفها في مجموعة المعاملات DbCommand.Parameters بنفس ترتيب ظهورها في نص الاستعلام.. وحتى لو كنت تستخدم معاملات مسماة في آكسيس، فما زلت مضطرا إلى المحافظة على الترتيب الصحيح لهذه المعاملات، كما أن اسم كل معامل ما زال غير مهم، لهذا تستطيع تعريف معامل في مجموعة المعاملات اسمه X ليعوض عن معامل في نص الاستعلام اسمه @Author.. فكل ما يهم حقا هو الترتيب وليس الاسم.. يمكنك اعتبار أن آكسيس يمحو اسم المعامل ويضع بدلا منه علامة استفهام ? على سبيل التسهيل عليك.

هذا هو ما جعل من الممكن أن نستخدم نفس جملة الاستعلام، ونفس كود تعريف المعاملات في حدث ضغط زر "الكتب" في المشروع Factories للحصول على كتب أحد المؤلفين من قاعدة الكتب في آكسيس أو قاعدة الكتب في سيكويل سيرفر.

وفي المنشور التالي، سنتعرف على مجموعة المعاملات والفئات المستخدمة معها.

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر