|
الدرس 13 ADO.Net
|
|
11-06-2009, 03:17 AM
(اخر تعديل لهذه المشاركة : 02-01-2010 12:34 PM بواسطة مصطفى الشريف.)
مشاركات: #1
|
|||
|
|||
|
السلام عليكم ورحمه الله وبركاته بسم الله الرحمن الرحيم و الصلاه والسلام على اتم المرسلين والله اكبر ولله الحمد اللهم يسر ولا تعسر بعد ما تعلمنا كيفيه الاتصال بقاعده البيانات MSQL و Access سنتعرف الان على كيفيه التعامل مع قاعده البيانات مثلاً تنفيذ استعلام SQL الفصيله التي تقوم بتنفيذ امر ضد قاعده البيانات هي SqlCommand لقواعد بيانات SQL OleDbCommand لقواعد بيانات Access حيث يتطلب تنفيذ امر ضد قاعده بيانات توفير اتصال مفتوح Connection ,,,,,ونص الامر (استعلام SQL) منCommandText لأستخدام هذه الفصيله قم بتعريف متغير من نوع الفصيله داخل الفصيله لكن خارج اي اجراء PHP كود: Dim OLEDB_CMD As New OleDbCommandقم بتمرير الاتصال و نص الاستعلام للفصيله كالتالي PHP كود: OLEDB_CMD.Connection = Connection1لتطبيق الكود افتح مشروع جديد او افتح المشروع الذي كنت اعددته بالدرس السابق PHP كود: Imports System.Data.OleDbلو نظرنا في كود تنفيذ الامر بعد تحديد الاتصال المطلوب للكائن OLEDB_CMD نقوم بتعين جمله استعلام يقوم باضافه سجل جديد لقاعده بيانات موجوده مع البرنامج ثم نقوم باستدعاء الاسلوب OLEDB_CMD.ExecuteNonQuery() الذي يقوم بتنفيذ الاستعلام الان لو فتحت قاعده البيانات ستجد سجل جديد مضاف لقاعده البيانات... 2-طرق تنفيذ الامر هناك 4 طرق لتنفيذ الاستعلام على قاعده البيانات كالتالي 1-ExecuteNonQuery :تقوم بتنفيذ استعلام دون توقع عوده نص من نتيجه الاستعلام لكن نتوقع عوده عدد السجلات التي تأثرت(تستعمل عند استعلامات الاضافه و الحذف والتعديل). 2-ExecuteReader تقوم بتنفيذ استعلام مع توقع عوده نص من نتيجه الاستعلام (تستعمل عند استعلامات الاختيار) . 3- ExecuteScalar تقوم بتنفيذ استعلام مع توقع عوده سجل واحد من نتيجه الاستعلام (تستعمل عند استعلامات الاختيار). سنقوم الان بتعديل المثال السابق بحيث يتم تنفيذ استعلام مختلف بعض الشئ كود: SELECT COUNT(*) FROM EmployeeData WHERE EmployeeName = 'Mohamed'SELECT Count استعلام يرجع عدد السجلات التي تنطبق عليها الشرط WHERE EmployeeName = 'Mohamed لو عدلنا الاستعلام ليصبح كالتالي PHP كود: "SELECT COUNT(*) FROM EmployeeData " & _فان نتيجه الاستعلام ستكون كافه الحقول من الجدول EmployeeData عندما الحقل EmployeeName يساوي المتغير Name1. الان سنحاول تنفيذ الاستعلام من البرنامج بحيث يدخل المستخدم الاسم في حقل نص فيتم التحقق من اسم الموظف ان كان موجود بالجدول EmployeeData. اضف لمشروع جديد زر امر و مربع ادخال نص..واستبدل الكود الموجود بالتالي PHP كود: Imports System.Data.OleDbحيث استخدمنا الاسلوب ExecuteScalar لمعرفه نتيجه الاستعلام.. Security Issue: SQL Injection Attacks حقن الاستعلامات ظهرت منذ فتره ثغره امنيه في معظم التطبيقات التي تقوم بأستعمال قواعد بيانات تدعم استعلامات SQL مثل قواعد اكسس و sql server تقوم تلك الثغره باستغلال ما يعرف بال Patched query's ويقصد بها الاستعلامات المركبه بحيث يتم تنفيذ اكثر من استعلام مع وضع فاصل بين كل استعلام العلامه التاليه ; كذلك التعليقات على الستعلامات حيث يتم تجاهل اي نص بعد العلامه -- يعني مثلاً لو انت تريد تصميم برنامج يتحقق من صلاحيه مستخدم ما للوصول لبرنامج معين انت ستستعمل الكود التالي PHP كود: OLEDB_CMD.CommandText = "SELECT COUNT(*) FROM EmployeeData " & _لكن المتسلل او الHacker بعد ما يعرف اصدار البرنامج اللي سيادتك مركبه على الخادم ويتحقق من انه فعلاً يحتوي على الثغره المذكوره. لن يكتب اي كلمه سر على الاطلاق سيكتب النص التالي في صندوق ادخال اسم المستخدم كود: xxx’ ; DROP TABLE [EmployeeData] --دعنا نتفحص هذا الكود لو اختبرت القيمه OLEDB_CMD.CommandText بعد ادخال النص و الضغط على زر التنفيذ ستجد انه يساوي التالي تماماً كود: SELECT COUNT(*) FROM EmployeeDataذلك الاستعلام يحتوي على جملتين SQL وتعليق حيث 1- جمله SELECT كود: SELECT COUNT(*) FROM Customersحيث سيتم ارجاع عدد السجلات التي توافق EmployeeName = ’xxx’ 2- جمله DROP TABLE [] كود: [b]DROP TABLE [EmployeeData][/b]حيث سيتم مسح الجدول EmployeeData تماماً لاحظ تم الربط بين الاستعلامين ب العلامه ; 3- كود: --’ AND EmployeePassowrd = ”طبعاً هذا باقي الاستعلام الاصلي الذي تم سبقه بالعلامه -- ليتم تعريفه كتعليق ولن يلفت له على الاطلاق.. لو عايز تهزر مع حد بس مش عاوز تضيع قاعده البيانات اللي هو عامله استعمل الكود التالي كود: xxx’ ; SHUTDOWN WITH NOWAIT --ليتم ايقاف الخادم على الفور ![]() ![]() ![]() الحل لمثل تلك الثغرات يكون من خلال احد الطرق الاَتيه اولاً البحث عن اي علامات غريبه في المدخلات من خلال دوال البحث (راجع درس الدوال) مثل العلامه ' او ال Double Dash -- واذا صادف وجود اي منها قم بحذفها او امتنع عن تنفيذ باقي الاستعلام. الطريقه الثانيه التعامل مع الاستعلامات من خلال الاوامر ذات العوامل :- 2-الاوامر ذات العوامل Command Parameters:- في الكود السابق بتاع التحقق من المستخدم انت استخدمت البيانات اللي موجوده في التكستات مباشره لتكمله جمله الاستعلام وهذا كما قلنا يعرضك لكثير من المشاكل الامنيه وغيرها... ما سنضيفه الان هو القدره على ربط قيم معينه متغيره بجمله الاستعلام الموجهه لقاعده البيانات يعني الاستعلام بتعنا بيحاول يعثر على قيمه تساوي اسم الموظف EmployeeName و كلمه السر EmployeePasword فبدلاً من دمج اسم الموظف و كلمه السر في جمله الاستعلام نقوم بتعريف قيمه متغيره في جمله الاستعلام . يعني جمله الاستعلام بدل ما تكون هكذا كود: "SELECT COUNT(*) FROM EmployeeData " & _تكون هكذا كود: "SELECT COUNT(*) FROM EmployeeData " & _لاحظ اننا سبقنا اسم القيمه المتغيره او ال parameter بالعلامه @ متبوعه بأسم ال parameter. لاحظ انك لو بتستعمل Access لابد انك تستخدم العلامه ? بدلاً من @ الان انتهى التعامل مع نص الاستعلام نفسه و بدأ التعامل مع ال SqlCommand التي بدورها ستقوم باستبدال القيم المتغيره او ال parameter بالنص الموافق له:_ ابدأ مشروع جديد و ادخل الكود التالي في حدث الضغط على زر ما واضف 2 Textbox PHP كود: Dim connection1 As SqlConnection = New SqlConnection("Data Source=.\sqlexpress;Initial Catalog=Employees;Integrated Security=True")في الكود التالي كود: sqlCommand1.Parameters.Add("@EmployeeName", SqlDbType.NVarChar)لاحظ اننا استخدمنا الاسلوب Add الخاص بالمجموعه sqlCommand1.Parameters التي يمكن التفكير بها كمصفوفه تحوي كل المعاملات او ال Parameters الخاصه بجمله الامر sqlCommand1. حيث اننا حددنا اولاً اسم المعامل ثم نوعه.. ويمكن تحديد طوله ايضاَ. ثم في الكود التالي نبدأ بتحديد قيمه المعامل انها تساوي قيمه الموجوده بصندزق النص: كود: sqlCommand1.Parameters("@EmployeeName").Value = TextBox1.Textلو حاولت انك تحقن اي استعلام داخل الجمله الرأيسيه ستفشل. مميزات القيم المتغيره او ال Parameters بالاستعلامات :- 1-التأكد من ان انواع البيانات تم تحديدها وفقاً لأنواع ال ADO 2-تمكنك من استخدام الاسلوب Prepare الذي سيسرع منعمليه تنفيذ الاستعلامات. 3-تمكنك من التعامل مع الاجرائات المخزنه او ال Stored procedures. اعداد الاستعلامات The Prepare Method عندما تتوقع تنفيذ جمله استعلام اكثر من مره فيجب عليك اعدادها بالاسلوب Prepare هكذا ستزيد من سرعه برنامجك بنسبه 50% حيث انك لن ترسل جمله الاستعلام كل مره لكنك فقط ستغير المعاملات او ال Parameters .لكن لاحظ انك لو غيرت نص الستعلام سيكون عليك اعاده الاعداد مره اخرى الصيغه العامه لجمله الاعداد سهله جداً كود: command.Prepare()ويمكن تنفيذها في اي وقت بعد اضافه المعاملات او ال Parameters للكائن Sql Command فقط ستقوم بتمرير جمله الاستعلام في اول مره بعد تغيير جمله الاستعلام..لكن لاحظ انك لو غيرت نص الستعلام سيكون عليك اعاده الاعداد مره اخرى يعد الكود التالي كود مناسب لاضافه سجل جديد بالجدول PHP كود: Dim connection1 As SqlConnection = New SqlConnection("Data Source=.\sqlexpress;Initial Catalog=Employees;Integrated Security=True")لكن تخيل انك تريد اضافه 100 سجل جديد بنفس الطريقه ان اعاده ارسال جمل الاستعلام اكثر من مره للخادم هو الحل ليس بالفعال.. لكن يفضل استخدام جمل الاعداد كالتالي PHP كود: Tryالأجرائات المخزنه Stored Procedure T-SQL تكلمنا من قبل خلال مقدمه قواعد بيانات SQL Server عن الاجرائات المخزنه وبينا اهميتها و تعاملنا مع احد الامثله لأجراء بسيط وكان التنفيذ على قاعده بيانات . اليوم سنتعامل مع الاجرائات المخزنه من خلال الكود... 01100001-00101101-01101100-00101101-01101100-00101101-01100001-00101101-01101000
|
|||
|
|
11-13-2009, 06:45 PM
مشاركات: #2
|
|||
|
|||
|
RE: الدرس 13 ADO.Net
السلام عليكم
سنتعلم اليوم كيفيه تنفيذ الاستعلامات التي تعود بقيمه طويله(جداول كامله) من خلال الاسلوب ExecuteReader الخاص بالكائن OleDbCommand لعرض ناتج الاستعلام والتعامل معه يجب عليك تعريف متغير من نوع الفصيله DataReader وهو يعتبر مخزن بيانات المسترجعه من الاستعلام حيث تستطيع تلك الفصيله احتواء جداول تحتوي على صور او بيانات معقده الكود التالي يقوم بتنفيذ استعلام يعود بجدول كامل من قاعده البيانات: PHP كود: ' ----- Connect to the database.لاحظ ان الكود مخصص لقاعده بيانات MSQL اسمها MyDatabase و يمكن تعديل الكود ليعمل على قاعده بيانات Access الان اذا اردت قرائه البيانات من ال dataResults بافتراض ان الاستعلام عاد بنتيجه قم بقرائه البيانات من خلال استدعاء الاسلوب Read() الخاص بالكائن dataResults كالتالي PHP كود: Do While dataResults.Read()الكود السابق يقوم بعمل تكرار طالما الاسلوب dataResults.Read يرجع قيمه حيث يتم عرض رساله تحوي محتوى السجل لاحظ ايضاً اننا استخدمنا الاسلوب CStr() لتحويل محتوى السجل من object وهو النوع الافتراضي الذي تعود به الاسلوب dataResults.Read لنحول القيمه الى نص.. لمزيد من المعلومات عن تحويل انواع البيانات ارجع للدرس الخاص بذلك لاحظ انه يمكن الوصول لمحتوى السجل من خلال الطرق التاليه كود: dataResults("Column2")من خلال اسم العمود او من خلال ترتيب العمود الاندكس ممكن التأكد من ان الاستعلام يحتوي على نتائج من خلال الكود التالي PHP كود: If (dataResults.HasRows = False) Then MsgBox("No data.") الجدير بالذكر ان الفصيله DataReader لا يمكن ربطها بأدوات التحكم المختلفه صندوق نص و صندوق الصور بشكل مباشر..ذلك لان الفصيله DataReader تعمل بطريقه "forward-only" ذلك يعني ان السجل الذي تم عرضه مره من خلال الاسلوب read يتم حذفه ولا يمكن الرجوع اليه الا من خلال اعاده تنفيذ الاستعلام. لحل هذه المشكله ممكن استخدام فصيله اخرى و هي DataSet |
|||
|
|
|





