الدرس الثاني في ربط قواعد البيانات

بسم الله الرحمن الرحيم
 
في بداية الدرس أريد التنويه أن هذا الدرس يعتمد بشكل مباشر على الدرس السابق حيث سوف استخدم متغير الاتصال السابق ذكره دون إعادة كتابته.
والآن نبدأ في هذا الدرس الذي سوف نكمل به خصائص الفئة Command حيث تستخدم هذه الطرق التي سوف أذكرها تعتمد في الأغلب على الاستعلامات التقليدية وهذه الخصائص هي:
–         ExecuteReader()
–         ExecuteScalar()
–         ExexuteXMLReader()
 
 
وتعود هذه الطريقة بفئة من نوع DataReader التي تمثل نتيجة الاستعلام في الـ Command حيث سنتحدث عن هذا النوع ، في ما تقدم من هذا الدرس.
 
ExecuteScalar:
 
وتستخدم هذه الطريقة لقراءة حقل  Field واحد من حقول السجل.
Dim Cmd As New SQLCommand(“Select Count(*) From MTBL Where f1 = 1”)
Dim Num As String = Cmd.ExecuteScalcr()
 
ملاحظة: عند استعمال هذه الطريقة مع جملة استعلام تعود بعدد من السجلات أو الحقول فإنه سوف تقرأ الحقل الأول من السجل الأول.
 
ExecuteXMLReader:
 
وتستخدم هذه الطريقة مع مزود الـ SQL Server .Net Data Provider® حيث أن قواعد البيانات المعتمدة في MS SQL Server® يمكن أن تستخدم الأمر For XML من أوامر لغة الاستعلام SQL التي معها والتي تعود بالسجلات بهيئة الـ XML.
وتعود هذه الطريقة بكائن من نوع System.XML.XmlReader.
Dim Cmd As new SqlCommand( “Select * from TBL1”, con)
Dim XMLR As System.XMLReader = Cmd.ExecuteXMLREader()
Do While XMLR.Read
Response.write( XMLR.Value )
Loop
XML.close()
 
ملاحظة: إنشاء الله بعد الانتهاء من هذه السلسة سوف أقوم بعرض سلسلة خاصة في التعامل مع ملفات الـ XML في بيئة الـ .NET ما لم تحدث تغيرات.
 
الوضع المتصل Connected Mode:
والآن نبدأ بهذا الوضع إلى يتميز باستخدام الفئة DataReader التي مرت علينا قبل قليل فيما سبق وتعتبر هذه الفئة على أنها تمثيل لمجموعة من السجلات التي نتجت عن استخدام الطريقة ExecuteReader() في الفئة Command حيث تكون جملة الاستعلام SQL جملة تقليدية.
 
إنشاء كائن الـ DataReader:
عند إنشاء كائن الـ DataReader فإنه لا يتم استخدام الأمر New حيث أن هذا الكائن عبارة عن كائن خصوصي Private، ويتم إنشاء الكائن عن طريق الأمر ExecuteReader(). ويجب التذكر أنه يجب أن يتوافق نوع المزود المستخدم مع نوع الفئة التي نريد استخدامها وبهذا يكون نوع الـ DataReader تدينا هو SQLDataReader.
Dim Cmd As New SQLCommand(“Select * From TBL1”, con)
Dim Dr As SqlDataReader = Cmd.ExecutReader()
 
قراءة السجلات:
بعد عملية إنشاء كائن الـ DataReader نستطيع من قراءة السجلات المسترجعة من الاستعلام بطريقتين Read()، والطريقة الثانية قراءة الخاصية Item() والتي تعود معها باسم الحقل المراد قراءته.
Dr.Read()
Response.write( Dr.Item(“FL1”) )
ويمكن استبدال اسم الحقل برقم الفهرس كما يلي:
Response.write( Dr.Item(0) )
ملاحظة: عند استخدام الفهرس فإن الترقيم يبدأ من صفر، بمعنى إذا كان عدد الحقول المسترجعة من الاستعلام 6 فإن رقم الحقل الأول يكون 0 والحقل الأخير يكون 5.
 
في كل استخدام للـ Read() سينتقل المؤشر إلى السجل التالي وتعود بقيمة False عند الوصول إلى نهاية السجلات. لذلك ينصح باستخدامها مع حلقة التكرار Do… Loop.
Do while Dr.Read()
Response.write( Dr(“FL1”) )
Loop
Dr.Close
ملاحظات:
1-       يجب إغلاق الـ DataReader عند الانتهاء منه من أجل إلغاء الـ Object وتحرير مصادر النظام، وفك الارتباط الموجود بينهما وبين كائن الاتصال.
2-     ويجب ملاحظة أن الخاصية Item  تعود بقيمة من نوع Object دوما لذا قد نحتاج إلى الاعتماد على دوال التحويل المختلفة ويمكن أيضا الاستغناء عن الخاصية Item بكتابة اسم الحقل كما هو موضح في المثال السابق.
 
خصائص أخرى:
 
GetName(): تعود باسم الحقل وليس بقيمته.
FieldCounter(): تعود بعدد الحقول.
IsDBNull(): تعود بقيمة True إن كان الحقل فارغ Null، وينصح استخدام هذه الطريقة للتحقق من الحقول قبل القراءة منها لتجنب الاستثناءات.
GetSQLxxx(): وتستخدم هذه الخاصية مع مزودات الـ SQL Server® حيث أن تُعرف هذه الخصائص الأنواع المختلفة وتوجد هذه الخصائص في المجال System.Data.SqlTypes ويبين الجدول التالي بعض هذه الطرق والنوع المقابل لها.
 

الطريقة Method النوع المسترجع Return Type المكافئ لها SQL Server®
GetSqlBoolean() SqlBoolean bit
GetSqlByte() SqlByte Tinyint
GetSqlInt16() SqlInt16 smallint
GetSqlInt32() SqlInt32 int
GetSqlInt64() SqlInt64 Bigint
GetSqlSingle() SqlSingle real

 
– وهنالك مجموع أخرى من هذه الوظائف التي يمكنكم التعرف عليها وما تمثله من مكتبة الـ MSDN.
–  وهنالك أيا ميزة إضافية لمزودات الـ SQL Server® هي السماح بتنفيذ أكثر من جملة SQL في وقت واحد وذلك بالفصل بينها بفاصلة منقوطة (;) ومن اجل الانتقال إلى النتيجة الثانية التي نتجت من الاستعلام الثاني نستخدم الطريقة NextResult() حيث تعيد قيمة False إن لم تكن نتائج مسترجعة.
 
وبهذا ننهي هذا الدرس ألقاكم بإذن الله في الوضع القادم من هذه السلسلة(الدرس الثالث).
وبهذا ننهي هذا الدرس ألقاكم بإذن الله في الوضع القادم من هذه السلسلة(الدرس الثالث).