الناشر
09-19-2008, 03:00 PM
سنتكلم اليوم عن موضوع مهم في قواعد البيانات والتعامل معها … سنتكلم عن الكائن Parameters التابع لأي فئة Command في اي فئة تتبع فضاء الأسماء Data سواء كانت OleDB او SQL او Oracle … او غيرها من من الفئات والكائنات .
مقدمة :
في أي تطبيق يعتمد على قواعد البيانات ، تبرز أهميه ارسال الباراميترات Parameters الى قاعدة البيانات ، وغالبا ما يتم ذلك عن طريق جمل الإستعلام SQL Statements حتى وقت كتابة هذه المقالة ( قريبا سنستخدم Linq مع VS2008 ) ومنهم من يفضل حفظ الاستعلامات في قاعدة البيانات والاكتفاء بمخاطبتها وارسال الباراميترات اليها واستقبال نواتجها على التطبيق .
نستخدم الباراميترات في اغلب الحالات لعميات مختلفه ، كالبحث ، والمعايره من الجداول والاستعلامات الموجوده ، فمثلا الكود التالي يقوم بالبحث في الجدول Products واظهار الحقول ProductID و ProductName بشرط ان تكون الـ ProductName تبدأ بقيمه نصيه معينه يحددها المستخدم بكتابتها في مربع النص TextBox1 :
Dim sql As String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like ‘" & TextBox1.Text & "%’"
Dim cmd As New SqlCommand(sql, conn)
Dim ds As New DataSet
Dim da As New SqlDataAdapter(cmd)
debug.WriteLine(sql) ‘Lets us see the sql just before it is executed!
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)
‘DataBind ‘Uncomment this line if a web application
ليس البحث وحده كما ذكرنا ، بل ايضا اضافه وحذف البيانات وتعديلها من قاعد البيانات خصوصا في الوضع المنفصل Disconnected Mode ، لذلك فهي جزء اساسي من تطبيقات قواعد البيانات والتطبيقات الاخرى المسانده لها .
الكائن Parameter :
تقدم لك ADO.NET الكائن Parameter التابع لأي كائن أمر Connection ، هذا الكائن وظيفته ارسال البيانات الى قواعد البيانات في الاستعلامات ، سواء تلك الاستعلامات المكتوبه في تطبيقك مباشره بوساطه جمله استعلام SQL او الاستعلامات المحفوظه في قاعدة البيانات ذاتها .
ويمكن استخدام الكائن Parameter في الكود اعلاه ليكون بالشكل التالي :
Dim sql As String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like @ProductName + ‘%’"
Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@ProductName", TextBox1.Text)
حيث يتم اتباع الخطوات التالية عندما نرغب باستخدام الكائن Parameter :
1- في جملة الاستعلام ، نقوم بوضع تسميه معينه بدلا من اسناد قيمه متغير او كائن الى حقل معين ، فلو تلاحظ في الكود الماضي تم استخدام ProductName@ بدلا من وضع علامات تنصيص ثم استخدام الاداة TextBox1
2- تمت اضافه عنصر جديد الى مصفوفة الباراميترات التابعه للكائن cmd والذي هو عباره ع كائن اوامر SqlCommand مع مراعاة استخدام نفس تسميه الباراميتر التي وضعناها في جملة الاستعلام SQL او حتى تلك المحفوظة في استعلام قاعدة البيانات ونعطيه القيمه المطلوبة وهي النص المكتوب في TextBox1 .
احدى فوائد الباراميترات هي المحافظه على شكل جمله الاستعلام من وضع علامات الاقتباسواسماء كائنات مربعات النصوص او الادوات التي تحتوي على القيمه المطلوب ارساله مع جمله الاستعلام ، فائده اخرى نجنيها ، وهي امكانيه استخدام الاستعلامات المخزنة في قاعدة البيانات التي تتطلب باراميترات ، فنحن في تطبيقاتنا نرغب بأن يتم عرض البيانات على شرط يحدده المستخدم وليس شرطا ان تكون قيمه ثابته في كل مره خصوصا عند البحث والاضافه والحذف والتعديل .
فوائد اخرى سنعرفها في السطور التاليه وهي مهمه جدا .
بالعودة الى الكود الذي وضعناه في البدايه :
Dim sql As String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like ‘" & TextBox1.Text & "%’"
Dim cmd As New SqlCommand(sql, conn)
Dim ds As New DataSet
Dim da As New SqlDataAdapter(cmd)
debug.WriteLine(sql) ‘Lets us see the sql just before it is executed!
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)
‘DataBind ‘Uncomment this line if a web application
هنا سيسأل سائل ويقول :انا يكفيني استخدام الكود بهذه الطريقة طالما انني استخدم استعلامات من داخل تطبيقي وليست استعلامات مخزنة في قاعدة البيانات ، سأجيبه واقول له جرب ادخال القيمه التالية في TextBox1:
Chef Anton’s
الآن جرب الكود وانظر الى الخطأ الذي سيحدث وكله بسبب استخدام العلامه الصغيره ‘ ، طيب اذا كان المستخدم يدخل البيانات باللغه الانجليزية فان من حقه استخدام تلك العلامة في كتابه الاسماء وغيرها ، حتى في اللغه العربيه قد نحتاجها احيانا ،
طيب ما الحل ؟ الحل استخدم الباراميترات Parameters باستخدام الكائن Parameter .
حالة ثانيه وهي عند الرغبه في ادخال تاريخ مثل الاستعلامات التالية :
’sql server
Dim sql As String = "SELECT FirstName,LastName FROM Employees WHERE HireDate =’" & TextBox1.Text & "’"
‘oledb
Dim sql As String = "SELECT FirstName,LastName FROM Employees WHERE HireDate =#" & TextBox1.Text & "#"
لكوننا نستخدم النظام التالي في ادخال التواريخ : dd/MM/yyyy وليس النظام الأمريكي MM/dd/yyyy فإن احتمال ظهور رسائل الخطأ وارد جدا ، وعمليه استخدام الداله Format لتغيير التنسيق اعتبره شخصيا انتقاص من حقنا من قبل الأمريكان بإجبارهم لنا ان نستخدم طرق ملتويه وان كانت سهله لمجرد اننا لا نتبع نظام تاريخهم في التنسيق .
طيب ما الحل ؟ الحل استخدم الباراميترات Parameters باستخدام الكائن Parameter .
حالة ثالثه ، جرب استخدام الاستعلام التالي :
Dim sql AS String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like ‘" & TextBox1.Text & "%’"
الآن يسرني ان اخبرك بأنه من عاشر المستحيلات ان تستخدم الكود السابق لادخال قيمه في الاستعلام مثل التالية :
x’
والسبب ببساطه انه سيكون لديك استعلام بالشكل التالي :
SELECT ProductID, ProductName FROM Products WHERE ProductName LIKE ‘x’%’
ونحن معلوم لدينا انه لا يمكن ان نستخدم الحاصره ‘ من دون اغلاقها بواحده اخرى تليها !
ايضا استخدام الادخال التالي يؤدي الى خطأ آخر مشابه :
x’ –
طيب ما الحل ؟ الحل استخدم الباراميترات Parameters باستخدام الكائن Parameter .
كيف نستخدم الباراميترات في جميع الحالات السابقه ؟ هذا ما سنعرفه في الجزء الثاني ،
منقول ... (http://alnabhani.wordpress.com/2008/09/19/%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-parameters-%d9%81%d9%8a-adonet-%d9%84%d8%aa%d8%a8%d8%a7%d8%af%d9%84-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d9%85%d8%b9-%d9%82%d8%a7%d8%b9%d8%af/)
مقدمة :
في أي تطبيق يعتمد على قواعد البيانات ، تبرز أهميه ارسال الباراميترات Parameters الى قاعدة البيانات ، وغالبا ما يتم ذلك عن طريق جمل الإستعلام SQL Statements حتى وقت كتابة هذه المقالة ( قريبا سنستخدم Linq مع VS2008 ) ومنهم من يفضل حفظ الاستعلامات في قاعدة البيانات والاكتفاء بمخاطبتها وارسال الباراميترات اليها واستقبال نواتجها على التطبيق .
نستخدم الباراميترات في اغلب الحالات لعميات مختلفه ، كالبحث ، والمعايره من الجداول والاستعلامات الموجوده ، فمثلا الكود التالي يقوم بالبحث في الجدول Products واظهار الحقول ProductID و ProductName بشرط ان تكون الـ ProductName تبدأ بقيمه نصيه معينه يحددها المستخدم بكتابتها في مربع النص TextBox1 :
Dim sql As String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like ‘" & TextBox1.Text & "%’"
Dim cmd As New SqlCommand(sql, conn)
Dim ds As New DataSet
Dim da As New SqlDataAdapter(cmd)
debug.WriteLine(sql) ‘Lets us see the sql just before it is executed!
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)
‘DataBind ‘Uncomment this line if a web application
ليس البحث وحده كما ذكرنا ، بل ايضا اضافه وحذف البيانات وتعديلها من قاعد البيانات خصوصا في الوضع المنفصل Disconnected Mode ، لذلك فهي جزء اساسي من تطبيقات قواعد البيانات والتطبيقات الاخرى المسانده لها .
الكائن Parameter :
تقدم لك ADO.NET الكائن Parameter التابع لأي كائن أمر Connection ، هذا الكائن وظيفته ارسال البيانات الى قواعد البيانات في الاستعلامات ، سواء تلك الاستعلامات المكتوبه في تطبيقك مباشره بوساطه جمله استعلام SQL او الاستعلامات المحفوظه في قاعدة البيانات ذاتها .
ويمكن استخدام الكائن Parameter في الكود اعلاه ليكون بالشكل التالي :
Dim sql As String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like @ProductName + ‘%’"
Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@ProductName", TextBox1.Text)
حيث يتم اتباع الخطوات التالية عندما نرغب باستخدام الكائن Parameter :
1- في جملة الاستعلام ، نقوم بوضع تسميه معينه بدلا من اسناد قيمه متغير او كائن الى حقل معين ، فلو تلاحظ في الكود الماضي تم استخدام ProductName@ بدلا من وضع علامات تنصيص ثم استخدام الاداة TextBox1
2- تمت اضافه عنصر جديد الى مصفوفة الباراميترات التابعه للكائن cmd والذي هو عباره ع كائن اوامر SqlCommand مع مراعاة استخدام نفس تسميه الباراميتر التي وضعناها في جملة الاستعلام SQL او حتى تلك المحفوظة في استعلام قاعدة البيانات ونعطيه القيمه المطلوبة وهي النص المكتوب في TextBox1 .
احدى فوائد الباراميترات هي المحافظه على شكل جمله الاستعلام من وضع علامات الاقتباسواسماء كائنات مربعات النصوص او الادوات التي تحتوي على القيمه المطلوب ارساله مع جمله الاستعلام ، فائده اخرى نجنيها ، وهي امكانيه استخدام الاستعلامات المخزنة في قاعدة البيانات التي تتطلب باراميترات ، فنحن في تطبيقاتنا نرغب بأن يتم عرض البيانات على شرط يحدده المستخدم وليس شرطا ان تكون قيمه ثابته في كل مره خصوصا عند البحث والاضافه والحذف والتعديل .
فوائد اخرى سنعرفها في السطور التاليه وهي مهمه جدا .
بالعودة الى الكود الذي وضعناه في البدايه :
Dim sql As String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like ‘" & TextBox1.Text & "%’"
Dim cmd As New SqlCommand(sql, conn)
Dim ds As New DataSet
Dim da As New SqlDataAdapter(cmd)
debug.WriteLine(sql) ‘Lets us see the sql just before it is executed!
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)
‘DataBind ‘Uncomment this line if a web application
هنا سيسأل سائل ويقول :انا يكفيني استخدام الكود بهذه الطريقة طالما انني استخدم استعلامات من داخل تطبيقي وليست استعلامات مخزنة في قاعدة البيانات ، سأجيبه واقول له جرب ادخال القيمه التالية في TextBox1:
Chef Anton’s
الآن جرب الكود وانظر الى الخطأ الذي سيحدث وكله بسبب استخدام العلامه الصغيره ‘ ، طيب اذا كان المستخدم يدخل البيانات باللغه الانجليزية فان من حقه استخدام تلك العلامة في كتابه الاسماء وغيرها ، حتى في اللغه العربيه قد نحتاجها احيانا ،
طيب ما الحل ؟ الحل استخدم الباراميترات Parameters باستخدام الكائن Parameter .
حالة ثانيه وهي عند الرغبه في ادخال تاريخ مثل الاستعلامات التالية :
’sql server
Dim sql As String = "SELECT FirstName,LastName FROM Employees WHERE HireDate =’" & TextBox1.Text & "’"
‘oledb
Dim sql As String = "SELECT FirstName,LastName FROM Employees WHERE HireDate =#" & TextBox1.Text & "#"
لكوننا نستخدم النظام التالي في ادخال التواريخ : dd/MM/yyyy وليس النظام الأمريكي MM/dd/yyyy فإن احتمال ظهور رسائل الخطأ وارد جدا ، وعمليه استخدام الداله Format لتغيير التنسيق اعتبره شخصيا انتقاص من حقنا من قبل الأمريكان بإجبارهم لنا ان نستخدم طرق ملتويه وان كانت سهله لمجرد اننا لا نتبع نظام تاريخهم في التنسيق .
طيب ما الحل ؟ الحل استخدم الباراميترات Parameters باستخدام الكائن Parameter .
حالة ثالثه ، جرب استخدام الاستعلام التالي :
Dim sql AS String = "SELECT ProductID, ProductName FROM Products WHERE ProductName Like ‘" & TextBox1.Text & "%’"
الآن يسرني ان اخبرك بأنه من عاشر المستحيلات ان تستخدم الكود السابق لادخال قيمه في الاستعلام مثل التالية :
x’
والسبب ببساطه انه سيكون لديك استعلام بالشكل التالي :
SELECT ProductID, ProductName FROM Products WHERE ProductName LIKE ‘x’%’
ونحن معلوم لدينا انه لا يمكن ان نستخدم الحاصره ‘ من دون اغلاقها بواحده اخرى تليها !
ايضا استخدام الادخال التالي يؤدي الى خطأ آخر مشابه :
x’ –
طيب ما الحل ؟ الحل استخدم الباراميترات Parameters باستخدام الكائن Parameter .
كيف نستخدم الباراميترات في جميع الحالات السابقه ؟ هذا ما سنعرفه في الجزء الثاني ،
منقول ... (http://alnabhani.wordpress.com/2008/09/19/%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-parameters-%d9%81%d9%8a-adonet-%d9%84%d8%aa%d8%a8%d8%a7%d8%af%d9%84-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d9%85%d8%b9-%d9%82%d8%a7%d8%b9%d8%af/)