كائنات ADO. إعادة تشكيل بيانات الكيان

03.04.2019

الفصل 4

نموذج ADO.NET: موفري البيانات

يبدو أحيانًا أنه قبل أن يتاح لمطوري تطبيقات قواعد البيانات الوقت الكافي للتعود على التكنولوجيا الجديدة، اقترحت Microsoft نموذجًا جديدًا تمامًا للوصول إلى قواعد البيانات. يركز هذا الفصل على نموذج ADO.NET، وهو أحدث تجسيد لنموذج ADO. أولاً، هناك ما يبرر الحاجة إلى تقديم نموذج جديد للوصول إلى قاعدة البيانات (من وجهة نظر المؤلفين)، ثم يتم تقديم وصف للنموذج نفسه وبنيته.

يهدف هذا الفصل إلى توضيح مبادئ التشغيل الأساسية لتقنية ADO.NET. تتم مناقشة العمليات الأساسية هنا ويتم وصف الكائنات الأساسية. مزود بيانات ADO.NET،على وجه التحديد الاتصال والأمر والمعلمة وقارئ البيانات. بعد ذلك (الفصول 5، "ADO.NET: كائن DataSet"، 6، "ADO.NET: كائن DataAdapter"، و7، "ADO.NET: مكونات إضافية") مناقشة الكائنات الأكثر تعقيدًا التي ترتبط ارتباطًا وثيقًا بالكائن الرئيسي كائن ADO .NET - DataSet.

نظرة عامة على تقنية ADO.NET

لقد اعتاد مطورو تطبيقات قاعدة بيانات Visual Basic على قيام Microsoft بتقديم نموذج جديد ومحسّن للوصول إلى البيانات كل بضع سنوات. بالإضافة إلى الاختصار الجديد المكون من ثلاثة أحرف، يقدم ADO.NET أيضًا نموذجًا جديدًا لواجهات برمجة التطبيقات والكائنات. على مدار السنوات القليلة الماضية، أصبح المطورون على دراية بأسلاف ADO.NET - تقنيات ODBC وDAO وRDO وADO. وعندما تم تعريفهم بكل تقنية جديدة، كان مطلوبًا منهم دراسة غرضها ومبادئ تشغيلها بعناية. في الوقت نفسه، غالبا ما يسألون أنفسهم نفس السؤال: هل من المنطقي التحول إلى التكنولوجيا الجديدة؟ وفي أغلب الأحوال كانت الإجابة نعم، طالما أن الابتكار لم يكن له أي تأثير على متطلبات المشروع الحالية والمستقبلية. في الواقع، كان الانتقال إلى التقنيات الجديدة في أغلب الأحيان مبررا تماما، باستثناء تقنية RDO (كائنات البيانات البعيدة) للمشاريع التي تحتوي على معالج قاعدة بيانات Jet (لأن تقنية JSC لا تزال تقنية أفضل للعمل مع Jet).

الدافع والفلسفة

فلماذا نحتاج إلى نموذج كائن الوصول إلى البيانات الجديد على أي حال؟ يمكن صياغة أبسط إجابة على هذا السؤال من خلال القياس على الشعار الإعلاني لشركة تويوتا في أواخر السبعينيات: "هل سألت إذن؟" توفر تقنية ADO.NET العديد من الوظائف التي كان يحلم بها المطورون منذ ظهور تقنية ADO. تمت إضافة بعض الميزات، مثل مجموعات السجلات المنفصلة المصدر ودعم XML، إلى نموذج ADO بعد إصداره. ولكن منذ أن كانوا الإضافاتبالنسبة للنموذج الأساسي، الذي لم يكن موجودًا في بنية ADO الأصلية، كانت الطريقة التي تم تطبيقها بها غير مريحة للغاية.

يعتمد نموذج ADO الكلاسيكي على نموذج COM وكائن مجموعة سجلات واحد، والذي يمكن أن يكون استخدامه متنوعًا للغاية. اعتمادًا على معلمات التكوين، مثل نوع المؤشر وموقع المؤشر ونوع القفل، سيعمل كائن مجموعة السجلات بشكل مختلف وينفذ عمليات مختلفة.

في تقنية ADO.NET، يتم فصل الوظائف المختلفة وتنفيذها بواسطة كائنات مختلفة، والتي يمكن استخدامها إما بشكل منفصل أو مع كائنات أخرى.

يمنح هذا المطور الفرصة لتخصيص استخدام الكائنات دون "أمتعة" مرهقة إضافية. وفي الوقت نفسه، يمكن لكائنات مختلفة تمامًا أن تتفاعل مع بعضها البعض لأداء وظائف أكثر تعقيدًا.

دعم التطبيقات الموزعة ونموذج البرمجة المنفصل

توفر تقنية ADO.NET دعمًا فعالاً ومرنًا للتطبيقات الموزعة عبر أجهزة كمبيوتر متعددة (خوادم قواعد البيانات، وخوادم التطبيقات، ومحطات عمل العملاء). على وجه الخصوص، يتم توفير دعم خاص للتطبيقات غير المتصلة (ثلاثية الطبقة أو الطبقة n)، مما يقلل الحمل عند التعامل مع عمليات الوصول إلى البيانات المتوازية وحظر موارد خادم قاعدة البيانات. ونتيجة لذلك، تزداد القدرة على توسيع نطاق التطبيقات، أي. دعم عدد أكبر من المستخدمين المتزامنين من خلال زيادة عدد أجهزة الكمبيوتر العميلة تدريجيًا. هذه الميزة مهمة بشكل خاص عند إنشاء تطبيقات الويب.

دعم XML الموسع

على الرغم من أن نموذج ADO الكلاسيكي قادر على تخزين البيانات وقراءتها بتنسيق XML، إلا أن التنسيق الفعلي المستخدم لهذا الشكل غير معتاد إلى حد ما وليس سهل الاستخدام. بالإضافة إلى ذلك، تمت إضافة دعم XML في نموذج ADO أثناء تطوره وبالتالي لديه بعض القيود، في حين أن دعم XML في تقنية ADO.NET هو عنصره الأساسي. تمت صياغة فلسفة ADO.NET باختصار شديد وبساطة: "البيانات هي البيانات". بغض النظر عن مصدر المدخلات، يمكن قراءتها ومعالجتها كبيانات علائقية أو هرمية، بناءً على المهمة المطروحة والأدوات المستخدمة.

يتم استخدام XML كتنسيق لنقل البيانات بين الطبقات وأجهزة الكمبيوتر. وهذا لا يحل مشكلة مرور كائنات COM عبر جدران الحماية فحسب، بل يسمح أيضًا بمشاركة البيانات بين تطبيقات متعددة تعمل على منصات أخرى غير Windows (نظرًا لأن أي نظام أساسي تقريبًا يمكنه التعامل مع بيانات نص XML).

التكامل مع .NET Framework

ADO.NET ليس مجرد الإصدار التالي من ADO، بل إنه مصمم خصيصًا للاستخدام على .NET Framework. تتم إدارة التعليمات البرمجية لجميع كائنات ADO.NET بشكل كامل، أي. يعمل ضمن .NET Framework. تعد تقنية ADO.NET جزءًا لا يتجزأ من .NET Framework، والتي تتجنب مشاكل إصدار الكائنات المعروفة جيدًا للمطورين ذوي الخبرة في ADO.

ظهور كائنات ADO.NET

على الرغم من أن ADO.NET جزء من .NET Framework، إلا أن العديد من مكوناته ستكون مألوفة للمطورين ذوي الخبرة لأنها تشبه إلى حد كبير كائنات ADO. حتى العناصر الجديدة تمامًا في ADO.NET يتم تنفيذها لتسهيل تعلمها واستخدامها قدر الإمكان بناءً على معرفتك الحالية.

أدو.نت وأدو 2.X

عند العمل باستخدام نموذج ADO.NET، يجب أن تكون على دراية بالاختلافات التالية عن نموذج ADO الكلاسيكي.

يوفر نموذج ADO الكلاسيكي طريقة للوصول إلى مصدر البيانات واستخدام نموذج بيانات فعلي.

يميز نموذج ADO.NET بشكل واضح بين طريقة الوصول إلى البيانات المرفقة ونموذج البرمجة المنفصل.

لا توجد خصائص CursorType أو CursorLocation أو LockType في نموذج ADO.NET لأن ADO.NET يوفر فقط المؤشرات الثابتة ومؤشرات العميل والتأمين المتفائل.

بدلاً من استخدام كائن مجموعة سجلات بسيط متعدد الأغراض، يقوم ADO.NET بتوزيع وظائف متنوعة بين الكائنات الأصغر - DataReader وDataSet وDataTable.

يسمح ADO.NET بالمعالجة الكاملة لبيانات XML، وليس فقط استخدامها كتنسيق إدخال/إخراج.

يدعم ADO.NET مجموعات البيانات المكتوبة بقوة بدلاً من استخدام المتغير لجميع الحقول. يتيح لك ذلك اكتشاف أخطاء وقت التشغيل بشكل أكثر فعالية وتحسين أداء التطبيق.

مكان ADO.NET في بنية .NET Framework

في التين. يوضح الشكل 4.1 مكان فئات ADO.NET في بنية .NET Framework. في قلب هذا النظام الأساسي يوجد وقت تشغيل اللغة العامة (CLR)، الذي يوفر بيئة تشغيل واحدة لجميع التطبيقات المتوافقة مع .NET، بغض النظر عن لغة البرمجة المستخدمة. يتضمن وقت تشغيل اللغة العامة (CLR) نظامًا شائعًا وإدارة الذاكرة وإدارة دورة حياة الكائن.

في المستوى المنطقي التالي فوق وقت تشغيل اللغة العامة توجد فئات النظام الأساسية. هذه الفئات هي المسؤولة عن أداء الوظائف الأساسية التي يمكن استخدامها في تطبيقات .NET. في التين. يوضح الشكل 4.1 فقط بعض الفئات الموجودة في مكتبة فئة .NET Framework، والتي تعد في الأساس مجموعة جديدة من واجهات برمجة تطبيقات Windows. في الماضي، كان الوصول إلى وظائف نظام التشغيل Windows فقط من خلال واجهات برمجة التطبيقات (APIs)، والتي تتكون من مجموعة كبيرة من الوظائف المتباينة وسيئة التصميم. في .NET Framework، يتم تنظيم هذا الوصول بناءً على الخصائص والأساليب التي توفرها فئات النظام الأساسية. إنها طريقة موجهة للكائنات ومتسقة ومريحة لإنشاء تطبيقات Windows، بغض النظر عن نوع تطبيق العميل: تطبيق سطح المكتب التقليدي أو المتصفح أو خدمة الويب.

أرز. 4.1. فئات ADO.NET في .NET Framework


يتضمن هذا المستوى عدة مساحات أسماء (مجموعات من الفئات وتعريفات أخرى) مصممة لتنظيم الوصول إلى البيانات: System.Data وSystem.OleDb وSystem.Data.SqlClient. يناقش باقي هذا الفصل، بالإضافة إلى الفصول 5 و6 و7، هذه الفئات ومساحات الأسماء بمزيد من التفصيل.

واجهات التطبيق

في هذا المستوى الأعلى، يوجد تمايز أو فصل للوظائف التي يمكن للمطورين استخدامها في أنواع مختلفة من التطبيقات. يحتوي على فئات وعناصر تحكم لإنشاء تطبيقات Windows Forms (الكلاسيكية)، وفئات وعناصر تحكم أخرى لإنشاء تطبيقات مستندة إلى الويب (نماذج ويب)، وفئات لإنشاء تطبيقات تعتمد على خدمات الويب. ومع ذلك، فإنهم جميعًا يستخدمون مكتبة فئة أساسية لمنطق التطبيق - فئات النظام الأساسية.

الآن، بعد التعرف الأول على موقع فئات ADO.NET في الهيكل العام لـ .NET Framework، دعونا نلقي نظرة فاحصة على كائنات ADO.NET الرئيسية.

موفري بيانات ADO.NET

على الرغم من التأكيد على نموذج البرمجة غير المتصلة، لا يزال يتعين عليك الاتصال بقاعدة البيانات الفعلية لاسترداد البيانات وتحديثها وإدراجها وحذفها. يُطلق على برنامج ADO.NET للاتصال بقاعدة بيانات فعلية والتفاعل معها اسم موفر بيانات ADO.NET. مزود البيانات -وهو عبارة عن تعليمات برمجية مُدارة لـ .NET مكافئة لموفر OLEDB أو برنامج تشغيل ODBC. يتكون موفر البيانات من عدة كائنات تنفذ الوظائف المطلوبة وفقًا لتعريفات فئاتها وواجهاتها.

يوجد حاليًا ثلاثة موفري بيانات ADO.NET مختلفين، كل منهم محدد في مساحة الاسم الخاصة به. تستخدم كافة الكائنات الموجودة في مساحات الأسماء هذه البادئات التالية: OleDb، وSql، وOdbc. ومع ذلك، عند الإشارة إلى هذه الكائنات ضمن مساحة الاسم الخاصة بها، يمكن تحديد اسم الكائن دون استخدام بادئة مساحة الاسم.

مزود البيانات SqICIient

تم تحسينه للعمل مع SQL Server الإصدار 7.0 (أو الأحدث) ويوفر أداءً محسنًا للأسباب التالية:

يتفاعل مع قاعدة البيانات مباشرة من خلال بروتوكول نقل البيانات الجدولي الخاص به (Tabular Data Stream - TDS)، وليس من خلال OLEDB مع واجهة OLEDB المعينة لبروتوكول TDS؛

يزيل الحمل المرتبط باستخدام خدمات التشغيل المتداخل لـ COM؛

لا توجد ميزات غير ضرورية غير مدعومة في SQL Server (كائنات موفر البيانات هذه موجودة في مساحة الاسم System.Data.SqlClient).

مزود البيانات Oledb

استنادًا إلى موفر OLEDB COM الحالي وخدمات التشغيل المتداخل .NET Framework COM للوصول إلى قاعدة البيانات. يتم استخدام موفر البيانات هذا للعمل مع إصدارات SQL Server الأقدم من 7.0. يسمح بالوصول إلى أي قاعدة بيانات تحتوي على موفر OLEDB. كائنات موفر البيانات هذا موجودة في مساحة الاسم System.Data.Oledb.

موفر بيانات Odbc

يُستخدم للوصول إلى قواعد البيانات التي لا تحتوي على موفر بيانات .NET خاص بها أو موفر OLEDB COM. في بعض الأحيان يكون أداء برنامج تشغيل ODBC أفضل من أداء برنامج تشغيل OLEDB، لذا يوصى بإجراء بعض الاختبارات لمقارنة أدائها الفعلي في قاعدة بيانات معينة. توجد كائنات موفر البيانات هذه في مساحة اسم النظام. Data.Odbc.

على ملاحظة

لقد تأخر إنشاء موفر البيانات لـ ODBC إلى حد ما وكان متأخرًا عن إنشاء .NET Framework وVisual Studio .NET. ولذلك، لم يتم تضمينه في الإصدار الأصلي من Visual Studio .NET ويمكن نسخه من موقع Microsoft على الويب. بالإضافة إلى ذلك، يجب أن تكون على علم بإمكانية توفر موفري بيانات إضافيين متوافقين مع .NET في المستقبل القريب.

حاليًا، يمكن أيضًا نسخ موفر بيانات Oracle.NET من موقع Microsoft على الويب. سيتم تضمين موفري بيانات ODBC وOracle هؤلاء في الإصدار التالي 1.1 من .NET Framework وVisual Studio .NET 2003. ونتيجة لذلك، سيتم تسمية مساحة اسم موفر بيانات ODBC Microsoft.Data.Odbc System.Data.Odbc.

تستخدم الأمثلة الواردة في هذا الفصل الإصدار 1.0 من موفر بيانات ODBC، لذا إذا كنت تستخدم الإصدار 1.1 من موفر بيانات ODBC، فيجب عليك تغيير اسم مساحة الاسم الخاصة به.

الكائنات الرئيسية

لدى كل مزود بيانات أربعة كائنات رئيسية، وهي مدرجة في الجدول. 4.1.

الجدول 4.1. كائنات موفر البيانات الأساسية

يعتمد كل كائن على فئة عامة أساسية وينفذ الواجهة العامة، ولكن له تطبيقه الخاص. على سبيل المثال، تشتق كائنات SqlDataAdapter وOleDBDataAdapter وOdbcDataAdapter من فئة DbDataAdapter وتقوم بتنفيذ نفس الواجهات. ومع ذلك، يقوم كل منهم بتنفيذها بطريقته الخاصة لمصدر البيانات المقابل.

نظام مساحة الاسم. بيانات. يحتوي OleDb على كائنات:

OleDbConnection;

OleDbDataReader;

OleDbDataAdapter.

تحتوي مساحة الاسم System.Data.SqlClient على الكائنات:

SqlConnection;

util.SqlDataReader;

SqlDataAdapter.

تحتوي مساحة الاسم Microsoft.Data.Odbc على كائنات:

com.OdbcConnection;

OdbcDataReader;

OdbcDataAdapter.

وبالمثل، سيكون جميع موفري البيانات المستقبليين في مساحات أسماء منفصلة وسيحتويون على نفس الكائنات، ولكن مع تطبيقات وبادئات مختلفة.

كائن الاتصال

كائن نموذج ADO.NET هذا مشابه جدًا لكائن الاتصال في نموذج ADO الكلاسيكي. والغرض منه واضح: فهو يعمل على إنشاء اتصال بمصدر بيانات معين وباسم الحساب وكلمة المرور المحددين في سلسلة الاتصال. يمكن تكوين الاتصال عن طريق تحرير قيم معلمات سلسلة الاتصال حسب الحاجة. يمكن لكائن الأمر (أو DataAdapter) بعد ذلك استخدام هذا الاتصال لإجراء العمليات المطلوبة على مصدر البيانات.

على ملاحظة

بخلاف كائن الاتصال في نموذج ADO، لا يحتوي كائن الاتصال في نموذج ADO.NET على أساليب التنفيذ وOpenSchema. لتنفيذ أوامر SQL، يجب عليك استخدام كائنات Command أو DataAdapter. يتم تنفيذ وظيفة أسلوب OpenSchema باستخدام أساليب GetOleSchemaTable لكائن OleDbConnection.

على الرغم من أن كائنات OleDbConnection وSqlConnection وOdbcConnection تطبق نفس الواجهات، إلا أنها لا تزال تحتوي على تطبيقات مختلفة. على سبيل المثال، لديهم تنسيقات سلسلة اتصال مختلفة. يستخدم كائن OleDbConnection تنسيق سلسلة اتصال OLEDB القياسي مع استثناءات بسيطة. يستخدم كائن OdbcConnection أيضًا تنسيق سلسلة اتصال ODBC القياسي، ولكن مع اختلافات بسيطة. وأخيراً، يستخدم كائن SqlConnection تنسيق سلسلة اتصال مختلف تمامًا يتعلق فقط بإصدار SQL Server 7.0 أو الأحدث.

علاوة على ذلك، فإن بعض الكائنات لها خصائص إضافية. على سبيل المثال، يحتوي كائن OleDbConnection على خاصية موفر للإشارة إلى موفر بيانات OLEDB المراد استخدامه، ويحتوي كائن OdbcConnection على خاصية برنامج تشغيل للإشارة إلى برنامج تشغيل ODBC المطلوب استخدامه. لا يحتوي كائن SqlConnection على هذه الخصائص على الإطلاق، حيث يتم استخدامه مع مصدر بيانات محدد مسبقًا، أي. مع خادم SQL. ومع ذلك، فهو يحتوي على خصائص PacketSize وWorkstationID، والتي يتم استخدامها فقط للعمل مع SQL Server وليست مطلوبة لأنواع الاتصال الأخرى.

لذلك دعونا نبدأ في إنشاء الكود. دعونا نتعرف على جميع أنواع مصادر البيانات، بدءًا من أبسط مثال، والذي سيصبح تدريجيًا أكثر تعقيدًا مع اقترابنا من نهاية الفصل.

1. قم بتشغيل Visual Studio .NET IDE.

2. قم بإنشاء مشروع تطبيق Visual Basic Windows جديد. للقيام بذلك، في مربع الحوار مشروع جديد، حدد نوع مشروع Visual Basic Project في منطقة أنواع المشاريع، ثم قالب تطبيق Windows في منطقة القوالب.

3. قم بتسمية المشروع DataProviderObjects.

6. في نافذة الخصائص، حدد قيمة كائنات موفر البيانات لخاصية النص في Form1.

7. في الزاوية العلوية اليسرى من النموذج، قم بإنشاء زر عن طريق سحبه من لوحة التحكم.

8. في نافذة الخصائص، حدد قيمة cmdConnection لخاصية (الاسم) وقيمة اتصال لخاصية النص لهذا الزر.

9. في الزاوية العلوية اليمنى من النموذج، قم بإنشاء حقل نصي عن طريق سحبه من لوحة التحكم.

10. في نافذة الخصائص، حدد txtResults للخاصية (الاسم)، وTrue للخاصية Multiline، وBoth لخاصية ScrollBars لمربع النص هذا.

11. قم بزيادة حجم حقل النص بحيث يشغل 80% من مساحة النموذج بالكامل.

وفي نهاية هذه العمليات، سيبدو النموذج كما في الشكل. 4.2.


أرز. 4.2. Form1 لمشروع DataProviderObjects


انتقل إلى نافذة تحرير كود النموذج وقم بتضمين الأسطر التالية في أعلى الملف، والتي تستورد مساحات الأسماء المستخدمة هنا وفي الأمثلة التالية في الفصل.

لاحظ أن مساحات الأسماء هذه تحتوي على فئات كائنات ADO.NET وتعريفات لكل موفر بيانات.

على ملاحظة

قد لا يكشف Visual Studio .NET عن مساحة الاسم Data.Odbc لأنه امتداد للإصدار الأساسي للمنتج. في هذه الحالة، اتبع الخطوات التالية.

1. انسخ برنامج تثبيت ODBC Data Provider من موقع Microsoft على الويب واتبع كافة تعليمات التثبيت.

2. في نافذة SolutionExplorer، انقر بزر الماوس الأيمن فوق المجلد References الخاص بمشروع DataProviderObjects.

3. حدد أمر إضافة مرجع من قائمة السياق.

4. في علامة التبويب .NET في مربع الحوار "إضافة مرجع"، قم بالتمرير عبر قائمة المكونات وحدد موقع الملف Microsoft.Data.Odbc.dll.

5. انقر نقرًا مزدوجًا فوق Microsoft.Data.Odbc.dll لإضافته إلى قائمة المكونات المحددة الموجودة أسفل مربع الحوار إضافة مرجع.

6. انقر فوق "موافق" لإغلاق مربع الحوار "إضافة مرجع".

إذا لم يتم التعرف على بعض مساحة الاسم المستوردة الأخرى لسبب ما، فستحتاج إلى توفير مرجع إلى ملف System.Data.dll. للقيام بذلك، اتبع الخطوات المذكورة في الفقرات. 2-6، حيث بدلاً من الملف Microsoft.Data.Odbc.dll، عند تنفيذ الخطوة 4، تحتاج إلى استخدام الملف System.Data.dll.

الآن، بالنسبة لزر btnConnection، تحتاج إلى إنشاء الكود الموضح في القائمة 4.1 لإنشاء اتصال بقاعدة بيانات SQL Server pubs. يقوم هذا الرمز بإنشاء اتصال ويعرض حالة الاتصال قبل وبعد محاولة الاتصال بقاعدة البيانات.

القائمة 4.1. رمز لفتح اتصال وعرض حالته
انقر فوق btnConnection الفرعي الخاص (مرسل ByVal باسم System.Object، _
ByVal e As System.EventArgs) يتعامل مع btnConnection.Click
"فتح اتصال
txtResults.Text & "جارٍ فتح اتصال قاعدة البيانات..." _
& ControlChars.CrLf & ControlChars.CrLf
"عرض حالة الاتصال
إذا (cnn.State = System.Data.ConnectionState.Open) ثم
txtResults.Text = txtResults.Text & "الاتصال مفتوح"
txtResults.Text = txtResults.Text & "الاتصال مغلق"
txtResults.Text = txtResults.Text & ControlChars.CrLf
نصيحة

إحدى الميزات الجديدة المفيدة لـ Visual Basic .NET هي القدرة على الحصول على تمثيل نصي لقيم التعداد، بدلاً من إنشاء روتين مخصص باستخدام عبارات تحديد الحالة لكافة قيم التعداد الممكنة. ترث كافة أنواع التعداد التي تعتبر كائنات الأسلوب ToString، الذي يُرجع سلسلة تحتوي على تمثيل نصي للقيمة الحالية. تستخدم القائمة 4.1 مقتطف التعليمات البرمجية التالي لعرض حالة الاتصال بناءً على عبارات if-else.

"عرض حالة الاتصال - الخيار 1
إذا (cnn.State = System.Data.ConnectionState.Open) ثم
txtResults.Text = txtResults.Text& "الاتصال مفتوح"
txtResults.Text = txtResults.Text & "الاتصال مغلق

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

"عرض خيار حالة الاتصال 2
txtResults.Text & "الاتصال هو" & cnn.State.ToString & ControlChars.CrLf

بعد تشغيل تطبيق DataProviderObjects الناتج والنقر فوق زر الاتصال، ستظهر أسطر حول إغلاق الاتصال وحالة الاتصال وإعادة فتح الاتصال في حقل النص، كما هو موضح في الشكل. 4.3.

على ملاحظة

عند كتابة كود الإنتاج، يجب عليك تحديد وتنفيذ استراتيجية معالجة الاستثناء لمعظم الإجراءات والعمليات. يعتمد عادةً على كتل محاولة الالتقاط لمعالجة الاستثناءات. لم يتم تضمين هذا الرمز في الأمثلة الموضحة هنا لأن هدفنا هو التركيز على مفاهيم برمجة قاعدة البيانات بدلاً من وصف مبادئ البرمجة العامة لـ Visual Basic .NET.

كائن الأمر

يشبه كائن Command الخاص بنموذج ADO.NET كائن الاتصال إلى حد كبير الكائن السابق له من طراز ADO 2.X السابق. يسمح لك كائن Command بتنفيذ الأوامر على مصدر البيانات وتلقي البيانات التي تم إرجاعها أو نتائج الأوامر.


أرز. 4.3. حالة تطبيق DataProviderObjects قبل وبعد فتح الاتصال باستخدام الكود الموجود في القائمة 4.1


يحتوي هذا الكائن على الخصائص التالية: CommandText وCommandType لتعريف النص ونوع الأمر الفعلي؛ اتصال لتحديد الاتصال المستخدم لتنفيذ الأمر؛ CommandTimeout لتحديد المهلة التي يتم بعدها إلغاء الأمر وعرض رسالة خطأ؛ معلمات لمجموعة من معلمات الأوامر؛ المعاملة للإشارة إلى المعاملة التي يتم فيها استخدام هذا الأمر.

تتمتع كافة الإصدارات الثلاثة لكائن Command (في مساحات أسماء OleDb وSql وOdbc) بخصائص وأساليب متطابقة، فيما عدا أن الكائن SqlCommand له أسلوب إضافي لا يمتلكه المتغيران الآخران لهذا الكائن، وهما ExecuteXmlReader. يستفيد من SQL Server لإرجاع البيانات تلقائيًا بتنسيق XML (إذا تمت إضافة عبارة FOR XML إلى استعلام SQL).

على ملاحظة

هناك اختلاف آخر بين إصدارات موفري البيانات المختلفين لكائن Command وهو استخدام قيم خصائص CommandType. تدعم جميعها قيم Text وStoredProcedure، كما تدعم كائنات OleDbCommand وSqlCommand القيمة المحتملة الثالثة، TableDirect. يسمح لك هذا بتحميل محتويات الجدول بالكامل بكفاءة عن طريق تعيين خاصية CommandType على TableDirect وخاصية CommandText على اسم الجدول.

دعونا نواصل العمل مع النموذج الموضح في الشكل. 4.3.

1. أضف زرًا آخر أسفل زر btnConnection مباشرةً عن طريق سحب رمز الزر من لوحة التحكم.

2. في نافذة الخصائص، قم بتعيين خاصية الاسم على btnCommand وخاصية النص على أمر.

3. أضف الكود الخاص بالزر الموضح في القائمة 4.2.

القائمة 4.2. رمز لفتح اتصال قاعدة البيانات وإعداد كائن الأمر
"إنشاء مثيل لكائن الاتصال
"إنشاء مثيل لكائن الأمر
خافت cmd باسم SqlCommand = New SqlCommand() txtResults.Clear()
"اختر au_lname، الحالة من المؤلفين"
"نص أمر الإخراج
txtResults.Text = txtResults.Text & ControlChars.Tab & cmd.CommandText() & ControlChars.CrLf

بعد تشغيل تطبيق DataProviderObjects، انقر فوق زر Command وسيعرض مربع النص أمر SQL الموجود في خاصية CommandText لكائن SqlCommand، وهو: SELECT au_lname, State FROM Authors.

على ملاحظة

تعمل العديد من فئات ‎.NET Framework، بالإضافة إلى الفئات التي أنشأها مطورون آخرون، على زيادة التحميل على مُنشئي الكائنات. بمعنى آخر، هناك عدة طرق لإنشاء مثيل جديد للفئة، حيث يأخذ كل مُنشئ مجموعة من الوسائط الفريدة الخاصة به. بهذه الطريقة يمكنك اختيار الإصدار الأمثل للمهمة الحالية. يختلف المُنشئ في القائمة 4.2 لكائن SqlConnection عن المُنشئ الافتراضي في القائمة 4.1، والذي لا يأخذ أي وسيطات. يتم تعيين سلسلة الاتصال لاحقًا لكائن SqlConnection باستخدام خاصية ConnectionString.

"إنشاء مثيل لكائن الاتصال
خافت cnn باسم SqlConnection = New SqlConnection()
"إنشاء سلسلة اتصال
cnn.ConnectionString = "الخادم=المضيف المحلي;uid=sa;قاعدة البيانات=الناشرين"

تستخدم القائمة 4.2 مُنشئ كائن SqlConnection الذي يأخذ سلسلة اتصال كمعلمة. يتيح لك هذا إنشاء كائن وتحديد سلسلة اتصال له على الفور في سطر واحد من التعليمات البرمجية.

"إنشاء مثيل لكائن الاتصال
Dim cnn SqlConnection = New SqlConnection("server=localhost;uid-sa;database=pubs")

استخدام كائن الأمر مع المعلمات والإجراءات المخزنة

عند إنشاء استعلامات أو أوامر على مصدر بيانات، غالبًا ما تحتاج إلى تمرير قيم المعلمات إلى إجراء (تحديث أو إدراج أو حذف البيانات) أو الإجراء المخزن. لحل هذه المشكلة، يحتوي كائن الأمر على خاصية معلمات، وهي كائن ParameterCollection الذي يحتوي على مجموعة من كائنات المعلمة. وهذا يشبه الطريقة التي يعمل بها في طراز ADO 2.X.

تقترن كائنات Parameter وParameterCollection بشكل وثيق بموفر البيانات المقابل، لذلك يجب تنفيذها كجزء من موفر بيانات ADO.NET. توجد اختلافات كبيرة في كيفية برمجة كائن SqlParameterCollection وكيفية استخدام كائنات OdbcParameterCollection وOledbParameterCollection. تعتمد كائنات OdbcParameterCollection وOledbParameterCollection على المعلمات الموضعية، بينما يعتمد كائن SqlParameterCollection على المعلمات المسماة. تؤثر هذه الاختلافات بشكل كبير على طريقة تعريف الاستعلامات والمعلمات.

لنبدأ بإنشاء استعلام بسيط يتضمن معلمات لاسترداد الأسماء الأولى والأخيرة لجميع المؤلفين من حالة معينة من قاعدة بيانات Pubs.

من ناحية، عند استخدام موفري بيانات OLEDB أو ODBC، سيبدو الاستعلام كما يلي:

حدد الحالة، au_fname، au_lname من المؤلفين أين الحالة =؟

هنا، تحل علامة الاستفهام محل معلمة واحدة، ويمكن استخدام علامات استفهام متعددة لمعلمات متعددة. يجب أن يتطابق ترتيب المعلمات في ParameterCollection تمامًا مع الترتيب الذي تظهر به بدائلها في الاستعلام أو الإجراء المخزن.

من ناحية أخرى، عند استخدام موفر بيانات SqlClient، سيبدو الاستعلام كما يلي:

حدد الحالة، au_fname، au_lname من المؤلفين حيث الحالة = @MyParam

هنا، العنصر النائب للمعلمة هو اسمها، ويتم الإشارة أيضًا إلى المعلمات الإضافية بأسمائها، لذلك لا يهم ترتيب المعلمات في ParameterCollection.

يمكنك إنشاء كائن معلمة بشكل صريح باستخدام مُنشئ المعلمة (أي استخدام عامل التشغيل الجديد) أو عن طريق تمرير الوسائط المطلوبة إلى الأسلوب Add الخاص بكائن ParameterCollection (خاصية المعلمات لكائن الأمر). تذكر أن كلتا الطريقتين (منشئ المعلمة وطريقة الإضافة) تحتويان على إصدارات مثقلة.

ما يلي هو إحدى الطرق لتمكين معلمة أمر عن طريق تحديد كائن معلمة بشكل صريح.

Dim rayParameter كمعلمة OdbcParameter جديدة("@MyParam"، OdbcType.Char، 2)

لكن طريقة تضمين معلمة أمر باستخدام طريقة الإضافة تبدو مختلفة.

الطريقة الثانية أقصر وعادة ما تكون مفضلة ما لم يكن هناك سبب خاص لإعادة استخدام كائن المعلمة.

تتطلب طريقة الإضافة لكائن المعلمة عادةً تحديد اسم المعلمة ونوعها وطولها. ثم تحتاج إلى تحديد اتجاه نقل البيانات: الإدخال أو الإخراج أو InputOutput أو ReturnValue. الاتجاه الافتراضي هو الإدخال. وأخيرًا، لتعيين قيمة لمعلمة، يجب عليك استخدام خاصية القيمة لكائن المعلمة. يمكنك أيضًا تحديد خصائص أخرى للمعلمة، مثل المقياس (خاصية Scale)، والدقة (خاصية الدقة)، وما إذا كان يمكن استخدام القيم الخالية (خاصية IsNullable).

عند استخدام موفر بيانات SqlClient، يمكنك استخدام رمز متطابق تقريبًا. الاختلافات الوحيدة هي بادئات Odbc بدلاً من بادئات Sql ونوع التعداد SqlDbType بدلاً من OdbcType.

تعتيم myParameter كـ SqlParameter جديد("@MyParam"، SqlDbType.Char، 2)
myParameter.Direction = ParameterDirection.Input
cmd.Parameters.Add(myParameter)

تبدو طريقة تضمين معلمة أمر باستخدام طريقة الإضافة مشابهة.

cmd.Parameters("@MyParam").Direction = ParameterDirection.Input
cmd.Parameters("@MyParam").Value = "CA" !}
نصيحة

يمكنك استخدام خاصية القيمة لكائن DBNull لتمرير قيمة فارغة إلى معلمة.

cmd.Parameters("@MyParam").Value = DBNull.Value

قم بتغيير كود cmdButton كما هو موضح في القائمة 4.3. بعد بدء تشغيل البرنامج والنقر فوق cmdButton، سيظهر نص الطلب بالإضافة إلى اسم المعلمة وقيمتها في حقل النص.

القائمة 4.3. كود لإعداد وعرض الأمر ومعلماته
Private Sub btnCommand_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يتعامل مع btnCommand.Click
"إنشاء مثيل لكائن الاتصال
خافت cnn باسم SqlConnection = SqlConnection جديد (_
"الخادم = المضيف المحلي؛ uid = sa؛ قاعدة البيانات = الحانات")
"إنشاء مثيل لكائن الأمر وكائنات المعلمة
Dim prm As SqlParameter = New SqlParameter()
" فتح اتصال cnn.Open()
"تحديد الاتصال ونص الأمر
cmd.CommandType = CommandType.Text
"حدد au_lname، الحالة من المؤلفين حيث الحالة = @MyParam"
cmd.Parameters.Add(New SqlParameter("@MyParam", SqlDbType.Char, 2))
cmd.Parameters("@MyParam").Value = "CA" !}
"نص أمر الإخراج
txtResults.Text = "سلسلة الأوامر:" & ControlChars.CrLf
cmd.CommandText() & ControlChars.CrLf
"معلمات أمر الإخراج
txtResults.Text = txtResults.Text & "معلمات الأمر:" & _
لكل حفلة موسيقية في كمد. حدود
txtResults.Text = txtResults.Text & ControlChars.Tab & _
prm.ParameterName & " = " & prm.Value & ControlChars.CrLf

يتم استدعاء الإجراءات المخزنة بنفس الطريقة، فيما عدا أنه يتم استخدام الخاصية CommandType.StoredProcedure بدلاً من الخاصية CommandType.Text، ويتم تعيين اسم الإجراء المخزن إلى الخاصية CommandText. ولذلك، فإن التعليمات البرمجية لاستدعاء الإجراء GetAuthorsFromState المخزن بمعلمة مكونة من حرفين لاسترداد معلومات حول كافة المؤلفين لحالة معينة ستبدو كما يلي.

cmd.CommandText = "GetAuthorsFromState"
cmd.Parameters.Add("@MyParam"، SqlDbType.Char، 2)
cmd.Parameters("@MyParam").Direction = ParameterDirection.Input
cmd.Parameters("@MyParam").Value = "CA" !}
نصيحة

لاستدعاء إجراء مخزن باستخدام OdbcCommand، يجب عليك استخدام تسلسلات أحرف ODBC القياسية (بما في ذلك الأقواس المتعرجة)، وليس فقط اسم الإجراء الخاص بخاصية CommandText. يتم استخدام علامات الاستفهام كعناصر نائبة للمعلمات في ODBC. إليك ما يبدو أعلاه بالنسبة لموفر بيانات ODBC:

cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "(GetAuthorsFromState ؟)"
cmd.Parameters.Add("@MyParam"، OdbcType.Char، 2)
cmd.Parameters("@MyParam").Direction = ParameterDirection.Input
cmd.Parameters("@MyParam").Value = "CA" !}

يقوم الإجراء المخزن أيضًا بإرجاع قيمة تم تحديدها باستخدام تسلسل خاص من الأحرف (علامة استفهام وعلامة يساوي) بجوار قوس الفتح، كما هو موضح أدناه.

cmd.CommandText = "(؟ = GetAuthorsFromState ?)"

لكي يقوم الإجراء المخزن بإرجاع قيمة، يجب عليك تحديد اتجاه الإخراج ثم قراءة قيمة خاصية المعلمة بعد استدعاء الإجراء المخزن. يحدد هذا المثال أيضًا قيمة الإرجاع للإجراء المخزن. نظرًا لأنه تم تحديد نوع SQL Server Int هنا، ليست هناك حاجة لتحديد طول لهذه المعلمة نظرًا لأنها حسب التعريف 4 بايت.

cmd.Parameters.Add(New SqlParameter("result"، SqlDbType.Int)
كمد. المعلمات ("النتيجة").Direction = ParameterDirection.ReturnValue
cmd.Parameters.Add(New SqlParameter("@MyParam"، SqlDbType.Int)
cmd.Parameters("@MyParam").Direction = ParameterDirection.Output
"استدعاء إجراء مخزن
رسالة (cmd.Parameters("@MyParam").Value)
على ملاحظة

عند تحديد معلمة سيتم استخدامها لقيمة الإرجاع الخاصة بإجراء مخزن، يجب تحديدها أولاً في قائمة المعلمات في مجموعة المعلمات. يعد هذا أحد متطلبات موفري بيانات OLEDB وODBC لأنه، كما هو مذكور أعلاه، يتم تعريف معلمات هؤلاء الموفرين بالترتيب، ولا يمكن طلب قيمة الإرجاع إلا من البداية. ومع ذلك، عند تحديد قيمة إرجاع لموفر بيانات SQL، يمكنك وضعها في أي مكان في مجموعة المعلمات لأن معلمات موفر بيانات SQL محددة بالاسم.

تنفيذ الأوامر

لقد قمنا حتى الآن بتحديد خصائص ومعلمات كائن الأمر فقط، لكننا لم ننفذ تلك الأوامر. هناك ثلاث طرق قياسية لتنفيذ الأوامر لكائن Command وطريقة واحدة لكائن SqlCommand.

طريقة التنفيذ NonQuery. ينفذ أمر SQL ولا يُرجع أية سجلات.

طريقة تنفيذ Scalar ينفذ أمر SQL ويعيد الحقل الأول من السجل الأول.

طريقة تنفيذ القارئ ينفذ أمر SQL ويعيد مجموعة من السجلات باستخدام كائن DataReader.

أسلوب ExecuteXmlReader (كائن SqlCommand فقط). ينفذ أمر SQL ويعيد مجموعة من السجلات بتنسيق XML باستخدام كائن XmlReader.

طريقة التنفيذ NonQuery

تتيح هذه الطريقة تنفيذ الأوامر دون إرجاع قيم (مجموعات السجلات أو القيم العددية) بخلاف القيمة التي تشير إلى نجاح الأمر أو فشله. هذه هي الطريقة الأكثر فعالية لتنفيذ الأوامر ضد مصدر البيانات. بهذه الطريقة، يمكنك تنفيذ أوامر SQL أو الإجراءات المخزنة التي هي أوامر DDL لتعريف البيانات (على سبيل المثال، لإنشاء أو تغيير بنية قاعدة البيانات: الجداول أو طرق العرض أو الإجراءات المخزنة) أو أوامر DML لمعالجة البيانات (على سبيل المثال، لتحديث أو إدراج أو حذف البيانات).

على ملاحظة

تقوم طريقة ExecuteNonQuery بإرجاع قيمة عددية فقط تشير إلى نجاح الأمر أو فشله.

يؤدي التنفيذ الناجح لأوامر DDL لتعريف البيانات لتغيير بنية قواعد البيانات إلى إرجاع -1، كما يؤدي التنفيذ الناجح لأوامر DML لمعالجة البيانات لتحديثها أو إدراجها أو حذفها إلى إرجاع عدد الصفوف المضمنة في الأمر. إذا فشل كلا النوعين من الأوامر، يتم إرجاع القيمة 0.

بالاستمرار في مشروع DataProviderObjects، فلنحاول استخدام كائنات مساحة اسم OleDb وقاعدة بيانات Pubs. مهمتنا هي إنشاء جدول tblStateZipCodes جديد لقاعدة البيانات هذه باستخدام أمر DDL. تم تصميم جدول tblStateZipCodes الجديد لتنظيم العلاقة بين الرموز البريدية والحالات. تعريفات الحقول الخاصة به هي نفس تعريفات الحقول في الجداول الأخرى في قاعدة بيانات Pubs، ولكنها تختلف عن تعريفات الحقول في الجداول الأخرى في قاعدة بيانات Novelty. يحتوي هذا الجدول على حقلين: الرمز البريدي للرمز البريدي والحالة لاسم الولاية المقابلة. يوجد أدناه أمر SQL لإنشاء هذا الجدول.

إنشاء جدول tblStateZipCodes (

أنت الآن بحاجة إلى تغيير Form1 الأصلي عن طريق تنفيذ سلسلة من الخطوات.

1. افتح Form1 في Visual Studio .NET IDE.

2. في الزاوية العلوية اليسرى من النموذج، قم بإنشاء زر آخر عن طريق سحب الرمز الخاص به من لوحة التحكم.

3. في نافذة الخصائص، حدد قيمة btnNonQuery لخاصية (الاسم) وقيمة ExecuteNonQuery لخاصية النص.

بعد ذلك، قم بإنشاء التعليمات البرمجية لروتين btnNonQuery_Click، الذي يظهر في القائمة 4.4.

القائمة 4.4. رمز لإنشاء جدول قاعدة بيانات باستخدام كائنات مساحة الاسم OleDb
فرع خاص btnNonQuery_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يتعامل مع btnNonQuery.Click
خافت SQL كسلسلة نتيجة خافتة كعدد صحيح
خافت cmd كـ OleDbCommand = New OleDbCommand()
"تحديد الاتصال ونص الأمر
cmd.CommandType = CommandType.Text
" تحديد أمر SQL لإنشاء جدول جديد
sql = "إنشاء جدول tblStateZipCodes(" & _
"رمز الرمز البريدي (5) ليس فارغًا،" & _
MsgBox(sql) cmd.CommandText = sql
"يتم فتح اتصال قبل استدعاء الأسلوب ExecuteNonQuery.
"للتعامل مع المواقف الاستثنائية، تحتاج إلى وضع
"الرمز الموجود في كتلة Try-Catch بسبب فشل التنفيذ
"يُنشئ الأمر أيضًا خطأً في وقت التشغيل.
"يعرض رسالة خطأ.
"إخراج نتائج الأمر.
messageBox.Show("اكتمل الأمر بنجاح")
"MessageBox.Show("اكتمل الأمر بنجاح")
messageBox.Show("فشل تنفيذ الأمر")
"MessageBox.Show("فشل الأمر")

بعد تشغيل التطبيق الناتج والنقر فوق الزر ExecuteNonQuery، سيظهر أولاً مربع حوار يشير إلى اكتمال الأمر بنجاح. يمكنك التحقق من تنفيذ الأمر بشكل صحيح عن طريق عرض قائمة جداول قاعدة بيانات Pubs (الناشرون) في مربع الحوار Server Explorer الخاص بـ Visual Studio .NET IDE (المغطى في الفصل الأول، "أساسيات قاعدة البيانات") أو في SQL Server Enterprise Manager (المغطى في الفصل 3، "تقديم SQL Server 2000").

عند النقر فوق الزر ExecuteNonQuery مرة أخرى، سيظهر مربعا حوار للرسائل: يشير أحدهما إلى حدوث استثناء (تم إنشاؤه بواسطة كتلة معالجة استثناءات محاولة الالتقاط)، والآخر يشير إلى فشل الأمر.

يمكنك إنشاء طريقة عرض أو إجراء مخزن بطريقة مماثلة. لإنشاء "EmployeeJobs_view" الذي يُرجع قائمة بالموظفين مرتبة حسب المسمى الوظيفي، بما في ذلك الأسماء الأولى والأخيرة والمسميات الوظيفية، استبدل أمر SQL في القائمة 4.4 بالأمر التالي.

sql = "إنشاء عرض لـ StaffJobs_view AS" & _
"اختر أفضل 100 وظيفة في المائة. job_desc،" & _
"اسم الموظف، اسم الموظف" &_
"الموظف في jobs.job_id = الموظف. job_id &_
على ملاحظة

لتضمين عبارة ORDER BY في تعريف طريقة العرض الذي يفرز النتائج، يجب عليك تضمين جملة TOP في أمر SELECT.

لإنشاء إجراء مخزن يأخذ معلمة واحدة ويعيد قيمة، تحتاج إلى تعديل أمر SQL هذا، كما هو موضح في القائمة 4.5.

القائمة 4.5. رمز يحتوي على أمر SQL لإنشاء الإجراء AuthorsInState1 المخزن
sql = "إنشاء إجراء AuthorsInState1 @State char(2)" & _
" كما أعلن @result int" & _
" اختر @result = العد (*) من المؤلفين " & _
على ملاحظة

على الرغم من أن الطريقة لا تقوم بإرجاع السجلات، إلا أنه يمكن تمرير أو إرجاع معلمات الإدخال والإخراج وقيم الإرجاع باستخدام مجموعة المعلمات. يعد هذا أسلوبًا أكثر فعالية من تشغيل أمر يقوم بإرجاع مجموعة سجلات أو قيمة عددية.

دعونا ننتقل الآن إلى النوع الثاني من أوامر SQL لإدارة البيانات، أي. تحديثها أو إدراجها أو حذفها. تتطلب هذه الأوامر عادةً تحديد المعلمات، خاصة عند العمل مع الإجراءات المخزنة.

بالاستمرار في مشروع DataProviderObjects، لنفترض أن الناشر الذي أنشأ قاعدة بيانات الناشرين قرر زيادة حقوق المؤلفين، معبرًا عنها كنسبة مئوية. يتيح تضمين زر جديد وحقل نصي جديد في النموذج لكبير المحاسبين لدى الناشر زيادة رسوم المؤلف باستخدام معلمة الأمر UPDATE. للقيام بذلك، عليك اتباع الخطوات المذكورة أدناه.

1. قم بإنشاء زر جديد ضمن الزر cmdExecuteNonQuery.

2. في نافذة الخصائص لهذا الزر، حدد قيمة cmdUpdate لخاصية الاسم وقيمة تحديث لخاصية النص.

3. قم بإنشاء حقل نصي جديد ضمن زر التحديث الجديد.

4. في نافذة الخصائص لهذا الحقل النصي، حدد قيمة txtParam1 لخاصية (الاسم) وقيمة 0 لخاصية النص. يضمن تعيين هذه القيمة أنه في حالة بدء تشغيل البرنامج والنقر فوق الزر "تحديث" عن غير قصد، فلن يحدث أي ضرر للبيانات.

5. قم بإنشاء الكود الخاص بإجراء btnUpdate_Click الموضح في القائمة 4.6.

القائمة 4.6. رمز لتحديث جدول قاعدة البيانات باستخدام أمر UPDATE مع معلمة
Private Sub btnUpdate_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يتعامل مع btnUpdate.Click
"قم بإنشاء مثيل لكائن الاتصال.
خافت cnn باسم SqlConnection = SqlConnection جديد (_
"الخادم = المضيف المحلي؛ uid = sa؛ قاعدة البيانات = الحانات")
"إنشاء مثيل لكائن الأمر.
خافت cmd كـ SqlCommand = New SqlCommand()
cmd.CommandType = CommandType.Text
cmd.CommandText = "تحديث ملكية مجموعة roysched = حقوق الملكية + @param1"
"إنشاء معلمة وتحديد قيمتها.
cmd.Parameters.Add(New SqlParameter("@param1", SqlDbType.Int))
cmd.Parameters("@param1").Direction = ParameterDirection.Input
cmd.Parameters("@param1").Value = Val(txtParam1.Text)
"يتم فتح اتصال قبل استدعاء الأسلوب ExecuteReader().
النتيجة = cmd.ExecuteNonQuery()
messageBox.Show (النتيجة & "تم تحديث السجلات"، "DataProviderObjects")

يمكنك الآن تحديث جدول حقوق المؤلف في قاعدة بيانات الناشرين عن طريق تشغيل تطبيق DataProviderObjects، وإدخال قيمة حقوق ملكية جديدة في مربع النص الموجود أسفل زر التحديث، والنقر فوق الزر. سيظهر بعد ذلك مربع حوار على الشاشة يشير إلى عدد السجلات المغطاة. يمكنك التحقق من هذه النتيجة باستخدام SQL Server Enterprise Manager من خلال عرض بيانات حقوق الملكية في جدول roysched قبل الترقية وبعدها.

يمكن إجراء نفس التحديث باستخدام إجراء مخزن، مما يسمح بأداء أفضل وتخزين مركزي للتعليمات البرمجية. من العيوب المحتملة لاستخدام الإجراءات المخزنة الحاجة إلى تعيين مسؤول قاعدة بيانات أو متخصص يتمتع بخبرة في كتابة الإجراءات المخزنة. في المؤسسات الكبيرة، قد يستغرق الأمر في بعض الأحيان عدة أيام حتى يتمكن مسؤول قاعدة البيانات من تغيير الإجراءات المخزنة، ويمكنك تغييرها بنفسك في بضع دقائق. يتم إنشاء الإجراءات المخزنة باستخدام SQL Server Enterprise Manager أو SQL Query Analyzer، الموضحة في الفصل 3، "مقدمة عن SQL Server 2000." ويمكن القيام بذلك أيضًا باستخدام مشروع DataProviderObjects عن طريق تعديل أمر SQL كما حدث سابقًا.

لذا، في هذا المثال، يبدو الإجراء المخزن كما يلي:

إنشاء إجراء UpdateRoyalties
تحديث ملكية مجموعة roysched = حقوق الملكية + @param1

في القائمة 4.6، من أجل استدعاء الإجراء المخزن، ستحتاج إلى استبدال خصائص CommandText وCommandType لكائن Command.

cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "UpdateRoyalties"

من المفترض أن يؤدي تشغيل هذا البرنامج إلى نفس النتائج كما كان من قبل، ولكن الآن يتم التحديث من خلال إجراء مخزن بدلاً من أمر SQL من رمز التطبيق.

طريقة تنفيذ Scalar

في بعض الأحيان تحتاج إلى تشغيل أمر يعود العدديةالمعنى، أي. معنى واحد فقط. الأمثلة الشائعة هي أوامر SQL لحساب مجموع كل قيم SUM والعدد الإجمالي لقيم COUNT. ومن الأمثلة الأخرى جداول البحث لاستبدال قيمة واحدة أو الأوامر التي ترجع قيمة منطقية. ينفذ الأسلوب ExecuteScalar الأمر المحدد ويعيد قيمة السجل الأول في الحقل الأول لمجموعة السجلات التي تم إرجاعها، ويتم تجاهل كافة الحقول والسجلات الأخرى.

دعونا ندرج الإجراء المخزن أدناه في قاعدة بيانات Pubs.

إنشاء إجراء AuthorsInState2
حدد العد (*) من المؤلفين حيث الحالة = @param1

يأخذ الإجراء AuthorsInState2 المخزن معلمة تحتوي على رمز حالة مكون من حرفين ويقوم بإرجاع عدد المؤلفين من تلك الحالة من جدول المؤلفين. هذا الإجراء يعادل وظيفيًا الإجراء AuthorsInState1 في القائمة 4.5، ولكنه يُرجع قيمة محسوبة لمجموعة السجلات بدلاً من مجرد مؤشر لنجاح الأمر.

على ملاحظة

يؤدي استخدام الأسلوب ExecuteScalar بدلاً من الأسلوب ExecuteNonQuer وتمرير قيمة عددية باستخدام المعلمة ReturnValue إلى تحمل حمل إضافي. لماذا يتم استخدامه؟ إنه أسهل في الاستخدام لأنه لا داعي للقلق بشأن تحديد المعلمات في تعريفات الأوامر والمكالمات.

لاستدعاء هذا الإجراء المخزن باستخدام موفر بيانات ODBC، قم بما يلي.

1. قم بإنشاء زر إضافي ضمن حقل النص txtParam1.

2. في نافذة الخصائص، حدد قيمة cmdScalar للخاصية (الاسم) وقيمة ExecuteScalar لخاصية النص.

3. قم بإنشاء كود روتين btnExecuteScalar_Click الموضح في القائمة 4.7.

القائمة 4.7. رمز لاسترداد قيمة عددية من إجراء مخزن باستخدام موفر بيانات ODBC
Private Sub btnExecuteScalar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يتعامل مع btnExecuteScalar.Click
"قم بإنشاء مثيل لكائن الاتصال.
خافت cnn باسم OdbcConnection = OdbcConnection جديد(_
"DRIVER=(SQL Server);server=localhost;uid=sa;database=pubs")
"إنشاء مثيل لكائن الأمر.
خافت cmd كـ OdbcCommand = New OdbcCommand()
"حدد نص الاتصال والأمر.
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "(استدعاء AuthorsInState2(؟) )"
"إنشاء معلمة وتحديد قيمتها
cmd.Parameters.Add("@param1"، OdbcType.Char، 2)
cmd.Parameters("@param1").القيمة = txtParam1.Text
messageBox.Show("العدد هو" والنتيجة، "DataProviderObjects")

قم بتشغيل التطبيق وأدخل رمز الحالة المكون من حرفين في حقل النص أعلى الزر ExecuteScalar. بعد النقر فوق الزر ExecuteScalar، سيظهر مربع حوار يخبرك بعدد المؤلفين في الولاية. يمكنك التحقق من هذه النتيجة باستخدام SQL Server Enterprise Manager من خلال النظر في البيانات الموجودة في جدول المؤلفين في قاعدة بيانات Pubs.

على ملاحظة

يرجى ملاحظة أن قاعدة بيانات الناشرين تحتوي بشكل افتراضي على مؤلفين من ولاية يوتا (رمز UT) و15 مؤلفًا من كاليفورنيا (رمز CA).

طريقة تنفيذ القارئ

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

كائن قارئ البيانات

تم تصميم هذا الكائن لقراءة دفق السجلات غير المخزنة المستلمة من أسلوب ExecuteReader الخاص بكائن الأمر. إن كائن DataReader يكافئ بشكل أساسي كائن ADO 2.X Recordset، والذي تم تصميمه أيضًا ليتم قراءته للأمام. يوفر كائن DataReader أسرع طريقة للوصول إلى مصدر البيانات، لكنه لا يمتلك القدرة على تمرير البيانات أو تحديثها. نظرًا لأن البيانات لا يتم تخزينها مؤقتًا أو تخزينها مؤقتًا، فإن هذه الطريقة رائعة لاسترداد كميات كبيرة من البيانات. للانتقال إلى السجل التالي لكائن DataReader، يجب عليك استدعاء أسلوب القراءة الخاص به.

بالإضافة إلى مجموعة الحقول، يمكن الوصول إلى حقول كل سجل باستخدام أساليب مكتوبة بقوة. يشبه الوصول إلى الحقول باستخدام مجموعة الحقول طريقة الوصول إلى الحقول في نموذج ADO 2.X.

على ملاحظة

لا يحتوي كائن DataReader على مُنشئ صريح، على سبيل المثال. لا يمكن إنشاؤه باستخدام عامل التشغيل New(). لتهيئة كائن جديد، تحتاج إلى استدعاء أسلوب ExecuteReader لكائن الأمر.

بمعرفة نوع بيانات الحقل، يمكن الوصول إليه باستخدام أدوات الوصول المكتوبة. تقوم هذه الطرق باسترجاع قيمة الحقل عن طريق رقم الحقل، وترقيم يبدأ من الصفر، على سبيل المثال:

يستخدم المثال الأول اسم الحقل Myfield، مما يسهل قراءته واستخدامه والتوافق مع البرامج القديمة. يستخدم المثال الثاني رقم الحقل، مما يؤدي إلى تحسين الأداء بشكل ملحوظ لأنه يتجنب تحويل اسم الحقل إلى رقمه.

لتوضيح كيفية استخدام هذه الطرق، اتبع الخطوات التالية:

1. قم بإنشاء زر إضافي ضمن زر ExecuteScalar.

2. في نافذة الخصائص، حدد قيمة cmdExecuteReader لخاصية (الاسم) وقيمة ExecuteReader لخاصية النص.

3. قم بإنشاء الكود الروتيني btnExecuteReader_Click الموضح في القائمة 4.8.

على ملاحظة

بالإضافة إلى كيفية استخدام كائن DataReader، يوضح هذا المثال وظائف أخرى. على سبيل المثال، هنا، بالإضافة إلى أعضاء Text وStoredProcedure لخاصية التعداد CommandType، يتم استخدام العضو TableDirect للإشارة إلى نوع الأمر. يحتوي على اسم الجدول الذي يتم إرجاع جميع حقوله بواسطة هذا الأمر. لاحظ أن عضو التعداد هذا مدعوم فقط لموفر بيانات ODBC.

يتم التعامل مع طرق العرض عادةً بنفس الطريقة التي يتم بها التعامل مع الجداول. لذلك، عند استخدام عضو TableDirect لخاصية التعداد CommandType، يمكنك تحديد ليس فقط اسم الجدول، ولكن أيضًا اسم العرض.

القائمة 4.8. رمز لإنشاء كائن DataReader واسترداد قيم الحقول باستخدام طريقة عرض وعضو TableDirect
Private Sub btnExecuteReader_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يتعامل مع btnExecuteReader.Click
"قم بإنشاء مثيل لكائن الاتصال.
خافت cnn كـ OleDbConnection = OleDbConnection جديد (_
"المزود=SQLOLEDB;الخادم=المضيف المحلي;uid=sa;قاعدة البيانات=الناشرون")
"إنشاء مثيل لكائن الأمر.
خافت كـ OleDbCommand = جديد OleDbCommand()
"تحديد الاتصال ونص الأمر
cmd.CommandType = CommandType.TableDirect
cmd.CommandText = "EmployeeJobs_View"
" فتح اتصال قبل استدعاء الطريقة
القارئ الخافت مثل OleDbDataReader
txtResults.Text = txtResults.Text & Reader("fname") & _

(يفترض هذا أنه تم بالفعل إنشاء StaffJobs_view باستخدام روتين btnNonQuery_Click من القائمة 4.4، كما هو موضح أعلاه. – ملحوظة إد.)

على ملاحظة

تذكر استدعاء الأسلوب Read() قبل محاولة الوصول إلى بيانات كائن DataReader. على عكس كائن Recordset في نموذج ADO 2.X، حيث يتم تحديد الموقع الحالي تلقائيًا في السجل الأول بعد تحميل البيانات، في نموذج ADO.NET، يجب أن يحدد كائن DataReader بشكل صريح الموقع الحالي بالقرب من السجل الأول باستخدام استدعاء الأسلوب الأولي

يمكنك أيضًا استخدام حلقة while مع طرق وصول أكثر كفاءة ومكتوبة بقوة للوصول إلى البيانات.

txtResults.Text = txtResults.Text & Reader.GetString(1) & _
ControlChars.Tab & Reader.GetString(2) & _
ControlChars.Tab & ControlChars.Tab & _
قارئ. GetString(0) وControlChars.Ctrlf

تغيير آخر، يمليه الذوق الشخصي للمؤلف وأسلوب البرمجة، هو الجمع بين تعريف كائن DataReader وتنفيذ طريقة ExecuteReader في سطر واحد، أي. بدلاً من مقتطف التعليمات البرمجية

قارئ خافت كقارئ OleDbDataReader = cmd.ExecuteReader()

يمكنك استخدام السطر التالي:

القارئ الخافت كـ OleDbDataReader = cmd.ExecuteReader()

بعد تشغيل تطبيق DataProviderObjects، انقر فوق الزر ExecuteReader وسيتم عرض البيانات من StaffJobs_view في مربع النص الموجود على اليمين، كما هو موضح في الشكل. 4.4.


أرز. 4.4. نتائج الأمر ExecuteReader من القائمة 4.8


على ملاحظة

عند الانتهاء من استخدام كائن DataReader، يجب عليك استدعاء الأسلوب Close. وذلك لأن قيم الإخراج أو الإرجاع لكائن Command غير متوفرة عندما يكون كائن DataReader مفتوحًا. ويظل مفتوحًا طالما أن الاتصال نفسه أو كائن DataReader مفتوح.

يوفر كائن DataReader أيضًا طريقة بسيطة وفعالة لإنشاء صفحات ويب تعتمد على البيانات استنادًا إلى عنصر التحكم DataGrid، والذي تمت مناقشته بالتفصيل في الفصل 11، "نماذج الويب: التطبيقات المستندة إلى ASP.NET للعمل مع قواعد البيانات."

استخدام كائنات الاتصال والأوامر أثناء إنشاء التطبيق

تحتوي علامة التبويب "بيانات" في لوحة تحكم Visual Studio .NET على مكونات تتوافق مع العديد من أساليب الوصول إلى البيانات. باستخدام نافذة الخصائص، تسمح لك بتحديد قيم الخصائص أثناء إنشاء التطبيق، وليس فقط أثناء تشغيله. كما أنها توفر أدوات مرئية لتحديد القيم لخصائص أكثر تعقيدًا.

على سبيل المثال، لتنفيذ التعليمات البرمجية في القائمة 4.8 باستخدام مثل هذه الضوابط، اتبع الخطوات التالية:

1. قم بإنشاء نموذج آخر، Form2، في مشروع DataProviderObjects.

2. في نافذة الخصائص، قم بتعيين خاصية النص الخاصة بـ Form2 إلى مكونات الاتصال والأوامر.

3. زيادة حجم النموذج.

4. قم بتضمين حقل نص Textbox1 في النموذج الخاص بك.

5. في نافذة الخصائص، قم بتعيين خاصية Multiline على True وخاصية Scrollbars لمربع النص هذا على كلاهما.

6. قم بزيادة حجم مربع النص بحيث يغطي مساحة أكبر من النموذج.

7. من علامة التبويب "بيانات" في لوحة Controls، اسحب عنصر التحكم OleDbConnection إلى Form2. هذا المكون غير مرئي أثناء تشغيل التطبيق، لذلك سيظهر في قسم المكونات غير المرئية أسفل نافذة تحرير النموذج.

8. في نافذة الخصائص، حدد القيمة التالية لخاصية ConnectionString لعنصر التحكم OledbConnection1.

Provider=SQLOLEDB;server=localhost;uid=sa;database=pubs

9. من علامة التبويب Data في لوحة Controls، اسحب عنصر تحكم OleDbCommand آخر إلى Form2. هذا المكون أيضًا غير مرئي أثناء تشغيل التطبيق، لذلك سيظهر في أسفل نافذة تحرير النموذج.

10. في نافذة الخصائص، حدد قيمة OledbConnection1 لخاصية الاتصال والقيمة التالية لخاصية CommandText لعنصر التحكم OledbCommand1.

اختر * من EmployJobs_view

11. قم بإنشاء الكود الخاص بإجراء Form2_Load الموضح في القائمة 4.9.

نصيحة

يقدم الفصل السادس، "ADO.NET: DataAdapter Object،" الأدوات الرسومية التي تتيح لك إنشاء سلسلة الاتصال ونص أمر SQL تلقائيًا بدلاً من ترميزهما يدويًا.

القائمة 4.9. رمز لإنشاء كائن DataReader واسترجاع قيم الحقول باستخدام مكونات SqlConnection وSqlCommand
Private Sub Form2_Load(ByVal sender As System.Object, _
"يتم فتح اتصال قبل استدعاء أسلوب ExecuteReader.
القارئ الخافت = OleDbCommand1.ExecuteReader()
TextBox1.Text = TextBox1.Text & Reader("fname") & _
ControlChars.Tab & Reader("lname") & _
ControlChars.Tab & ControlChars.Tab & _
القارئ ("job_desc") & ControlChars.CrLf
" يقوم بإلغاء تحديد كافة الصفوف في حقل النص.

12. انقر بزر الماوس الأيمن فوق مشروع DataProviderObjects في نافذة Solution Explorer وحدد الأمر Properties من قائمة السياق.

13. في مجلد الخصائص العامة، حدد عام، ثم حدد Form2 في مربع نص كائن بدء التشغيل لهذا التطبيق.

بعد تشغيل تطبيق DataProviderObjects، سيعرض حقل النص في Form2 البيانات من StaffJobs_view، كما هو موضح في الشكل 1. 4.5.

مقدمو البيانات الآخرون

تم عرض فئات العديد من موفري البيانات الأساسية (على سبيل المثال، المعلمة والمعلمات) أعلاه، بالإضافة إلى الكائنات الأربعة الرئيسية في الجدول. 4.1. الفصل 5، "ADO.NET: كائن DataSet،" يلقي نظرة فاحصة على كائن DataSet والكائنات المرتبطة به، والفصل 6، "ADO.NET: كائن DataAdapter،" يغطي كائن DataAdapter.

ويتناول باقي الفصل موفر بيانات آخر، وهو كائن المعاملة. تُستخدم المعاملات لضمان الإكمال الناجح للعمليات المتعددة ذات الصلة على أساس كل شيء أو لا شيء. وهذا يعني إما أن جميع العمليات في المعاملة قد اكتملت بنجاح، أو أنها لم تكتمل على الإطلاق. المثال الكلاسيكي للمعاملة هو التحويل المصرفي للأموال. تتكون هذه العملية من مرحلتين: خصم مبلغ من المال من حساب وإضافته إلى حساب آخر. يُنصح بتجنب المواقف التي يتم فيها إكمال المرحلة الأولى فقط من المعاملة بنجاح!


أرز. 4.5. نتائج عرض البيانات في Form2 باستخدام عنصري التحكم OleDbConnection وOleDbCommand


يحتوي موفرو بيانات ADO.NET على كائن المعاملات، الذي يحتوي على أساليب معالجة المعاملات الأساسية. تقوم طريقة الالتزام بتنفيذ المعاملة الحالية، وتقوم طريقة الاستعادة بإرجاع (إلغاء) المعاملة الحالية. يتم إجراء معاملة وإنشاء كائن معاملة عن طريق استدعاء أسلوب BeginTransaction على كائن اتصال مفتوح. تم توضيح طريقة استخدام كائن المعاملة باستخدام مثال حالة العمل 4.1.

حالة العمل 4.1: إنشاء إجراء لأرشفة الطلبات القديمة حسب السنة

بعد استخدام نظام إدارة قواعد البيانات لفترة طويلة نسبيًا، يوصى بأرشفة بعض البيانات. في كل نظام إنتاج، يجب تضمين الأرشفة كجزء من عمليات النسخ الاحتياطي المطلوبة والتي يتم إجراؤها بانتظام. البيانات المؤرشفة هي بيانات غير مطلوبة للاستخدام المستمر (أي عبر الإنترنت)، ولكن في بعض الأحيان فقط. يمكن أن تؤدي إزالة هذه البيانات من الجداول التشغيلية لقاعدة البيانات الرئيسية إلى تحسين أداء الوصول إلى هذه الجداول نظرًا لوجود عدد أقل من السجلات التي يجب معالجتها وتصفيتها. ومع ذلك، غالبًا ما يتم تخزين جدول الأرشيف بتنسيق جدول مماثل ويمكن الوصول إليه بطريقة مماثلة إذا لزم الأمر. في حالة العمل هذه، يمكنك إنشاء نموذج بسيط لإجراء أرشفة بسيطة للبيانات من جدول tblOrder في قاعدة بيانات Novelty. سيسمح لك باختيار وأرشفة الطلبات حسب السنة، على سبيل المثال. بعد اختيار السنة المطلوبة يتم تنفيذ الخطوات التالية.

1. أولاً، يتم إنشاء جدول tblOrderXXXX جديد في قاعدة البيانات، حيث يشير XXXX إلى السنة التي سيتم أرشفة سجلات الطلبات الخاصة بها.

2. ثم يتم نسخ كافة سجلات الطلب للسنة المحددة من الجدول tblOrder إلى الجدول tblOrderXXXX.

3. يتم حذف كافة سجلات الطلبات المنسوخة للسنة المحددة من الجدول tblOrder.

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

قم بتشغيل Visual Studio .NET IDE.

2. قم بإنشاء مشروع تطبيق Visual Basic Windows جديد.

3. قم بتسمية المشروع BusinessCase4.

4. حدد المسار إلى ملفات المشروع.

5. زيادة حجم Form1.

6. في الإطار "خصائص"، حدد قيمة frmArchive للخاصية (الاسم) وقيمة "أوامر الأرشفة" لخاصية النص الخاصة بـ Form1.

7. قم بإنشاء مربع التحرير والسرد lstYears، وLabel1، وزر bntOK، وزر btnCancel في النموذج عن طريق سحبهم من لوحة التحكم.

8. في نافذة الخصائص، حدد القيمة أرشفة جميع الطلبات للسنة لخاصية النص الخاصة بالتسمية، والقيمة موافق للزر btnOK، والقيمة إلغاء للزر btnCancel.

9. ضع جميع عناصر التحكم كما هو موضح في الشكل. 4.6.

أرز. 4.6. ترتيب عناصر التحكم في نموذج frmArchive


في الجزء العلوي من الملف المصدر، قم بلصق السطر التالي من التعليمات البرمجية لاستيراد مساحة الاسم SqlClient.

في نص تعريف الفئة لنموذج frmArchive، قم بتضمين التعليمات البرمجية من القائمة 4.10.

القائمة 4.10. كود لأرشفة البيانات في جدول جديد
Private Sub frmArchive_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يتعامل مع MyBase.Load
"حدد القيمة الافتراضية.

فرع خاص btnCancel_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يعالج btnCancel.Click

Private Sub btnOK_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) يتعامل مع btnOK.Click
"إنشاء مثيلات لكائنات الاتصال والأوامر.
خافت cnn باسم SqlConnection = SqlConnection جديد (_
"الخادم = المضيف المحلي؛ uid = sa؛ قاعدة البيانات = الجدة")
"الحصول على قيمة السنة.
SelectedYear = lstYears.SelectedItem.ToString
"وضع الكود داخل كتلة Try-Catch لـ
"التعامل مع حالات الاستثناء.
"افتح كائن اتصال وابدأ المعاملة.
" تضمين أمر في المعاملة.
"حدد أمر SQL لإدراج الأمر المناسب
"السجلات في جدول الأرشيف.
sql = "SELECT * INTO tblOrder" & SelectedYear & _
FROM tblOrder WHERE year (OrderDate) = "&SelectedYear
"تمرير نص أمر SQL إلى معاملة.
النتيجة = cmd.ExecuteNonQuery()
"عرض نتائج إدراج السجلات في جدول الأرشيف.
السجلات = النتيجة messageBox.Show(records & _
"تم إدراج السجلات بنجاح في tblOrder" & SelectedYear)
"لم يتم إدراج سجلات في tblOrder" وSelectedYear)
"إذا لم تكن هناك سجلات، فسيتم إنشاء الجدول
" ليست هناك حاجة ويجب التراجع عن المعاملة.
"أمر SQL لإزالة المطابقة
"سجلات من الجدول الحالي.
sql = "احذف من tblOrder حيث السنة (OrderDate) = "_
"هذا الأمر موجود في نفس المعاملة.
النتيجة = cmd.ExecuteNonQuery()
"إظهار نتائج حذف الإدخالات.
"تم حذف السجلات بنجاح")
"لقد تمت جميع الإجراءات بنجاح، يمكنك تنفيذ المعاملة.

يؤدي الروتين الفرعي btnCancel_Click للتعامل مع نقرات الماوس على الزر "إلغاء" إلى إغلاق النموذج، مما يؤدي في هذه الحالة إلى إغلاق البرنامج. يتم تنفيذ كافة الإجراءات الضرورية بواسطة معالج النقر بالماوس على الزر "موافق". بعد إعلان المتغيرات، يجب أن تحصل على السنة المحددة من قائمة lstYears وحفظها لاستخدامها في المستقبل. للتأكد من إلغاء المعاملة في حالة حدوث أي استثناء، يجب عليك إحاطة الكود النشط بكتلة Try-Catch-Finally.

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

يتم تنفيذ الخطوتين الأوليين لإنشاء جدول الأرشيف ونسخ الصفوف المحددة باستخدام أمر SELECT واحد يحتوي على عبارة INTO اسم الطاولة.يتم إنشاء الجدول المحدد بهذه الطريقة تلقائيًا، وإذا كان هذا الجدول موجودًا بالفعل، فسيتم إنشاء استثناء. تتم إضافة قيمة السنة المحددة إلى اسم جدول tblOrder لإنشاء اسم جدول الأرشيف الجديد.

على ملاحظة

لا يقوم الأمر SELECT INTO بإنشاء فهرس إذا كان موجودًا في الجدول المصدر. لتحسين أداء الاستعلام في جدول معين، قد تحتاج إلى إنشاء فهارس في حقل واحد أو أكثر.

لتنفيذ أمر SQL، يتم استدعاء الأسلوب ExecuteNonQuery، الذي يُرجع عدد السجلات التي يغطيها الاستعلام. إذا كانت قيمة الإرجاع هذه أكبر من الصفر، فهذا يعني أنه تم العثور على السجلات المطلوبة وإدراجها في الجدول الجديد. وإلا، فهذا يعني أنه لا يمكن إنشاء الجدول أو لم يتم العثور على سجلات لنسخها. في أي من هاتين الحالتين، يتم التراجع عن المعاملة حتى إذا تم إنشاء الجدول بحيث لا يتم ملء قاعدة البيانات بجداول فارغة وغير مجدية.

إذا تم نسخ سجل واحد على الأقل إلى الجدول، فسيتم حذف النموذج الأولي الخاص به في جدول tblOrder الأصلي باستخدام أمر DELETE الذي يحتوي على جملة WHERE مع السنة المحددة. إذا تم تنفيذ هذا الأمر بنجاح، أي. إذا كان عدد الصفوف المنسوخة والمحذوفة هو نفسه، تعتبر المعاملة مكتملة بنجاح وملتزمة. خلاف ذلك، أي. إذا فشلت أي عملية فردية (كسر عملية حذف السجل، أو إلغاء إذن حذف البيانات المؤرشفة، أو التسبب في تعطل الخادم)، فسيتم إحباط المعاملة بأكملها. يضمن التراجع عن المعاملة أنه في حالة فشل محاولة حذف السجلات الصالحة من جدول tblOrder، فسيتم حذف جدول الأرشيف tblOrderХХХХ.

حتى الآن، نظرنا فقط في تلك المواقف الاستثنائية التي تنشأ عند انتهاك التنفيذ المتسلسل للعمليات الفرعية. ومع ذلك، يجب عليك أيضًا الاهتمام بالعديد من الاستثناءات الأخرى التي قد تحدث أثناء التنفيذ. على سبيل المثال، قد يحدث استثناء عند محاولة إنشاء جدول موجود. ولاعتراضها ومعالجتها، يجب عليك استخدام كتلة Try-Catch، والتي تعرض في هذه الحالة رسالة نصية حول الاستثناء، ويتم رفض المعاملة بأكملها.

على ملاحظة

ستكون هناك حاجة إلى كتلة Try-Catch أخرى للتعامل مع حالة الاستثناء عندما لا يمكن إنشاء جدول الأرشيف (على سبيل المثال، بسبب وجود مثل هذا الجدول). السبب الرئيسي وراء اقتراح ذلك هو أن المعاملة قد بدأت ولكن لم تحدث أي تغييرات في البيانات، وبالتالي لا يوجد أي نشاط مسجل في سجل المعاملات يجب التراجع عنه.

في الكتلة الأخيرة، يتم إغلاق الاتصال قيد الاستخدام بغض النظر عما إذا حدث استثناء أم لا.

اتبع جميع الخطوات المذكورة أعلاه وقم بتجربة هذا التطبيق عن طريق إنشاء أرشيفات لسجلات من سنوات مختلفة. للتحقق من نتائجك، قم بمقارنة محتويات الأرشيف الجديد والجداول الأصلية قبل الأرشفة وبعدها. لا تنس أن محتويات الجدول الأصلي tblOrder يمكن دائمًا إرجاعها إلى حالتها الأصلية عن طريق تشغيل البرنامج النصي لإنشائه وملؤه بالبيانات.

ملخص

يقدم هذا الفصل نظرة عامة على ADO.NET وبعض كائنات موفر بيانات .NET. يوفر موفرو البيانات واجهة ADO.NET للتفاعل مع مخازن البيانات الفعلية وتقديم نموذج برمجة في الوضع المتصل. يغطي هذا القسم بإيجاز خصائص وأساليب كائنات الاتصال والأوامر والمعلمات وDataReader والمعاملات، بما في ذلك موفري البيانات القياسيين SqlClient وOleDb وOdbc. يصف الفصل الخامس، "ADO.NET: DataSet،" كيفية العمل مع البيانات في وضع قطع الاتصال باستخدام كائنات DataSet وDataAdapter.

أسئلة وأجوبة

استنادًا إلى محتويات هذا الفصل، تم تصميم نموذج ADO.NET ليعمل في وضع قطع الاتصال ولا يوجد دعم للمؤشرات من جانب الخادم أو القفل المتشائم. ولكن ماذا لو كان تطبيق موجود يستخدمها أو كانت مواصفات مشروع جديد تتطلبها؟ هل يجب علي استخدام Visual Basic 6.0 فقط لهذا الغرض؟

أولاً، تحتاج إلى تحليل التطبيق بعناية والتأكد من أنه يجب عليك دائمًا استخدام مؤشرات الخادم أو الأقفال المتشائمة. إذا كنت في حاجة إليها حقًا (أو أي مكونات أخرى غير مدعومة في ADO.NET)، فلا تيأس. البصرية الأساسية. NET لمثل هذه التطبيقات لأن .NET Framework يوفر دعمًا شاملاً لقابلية التشغيل التفاعلي مع COM، مما يسمح للتطبيق المتوافق مع .NET باستخدام كائنات COM، والتي بدورها يمكنها استخدام رمز مُدار (متوافق مع .NET)). بمعنى آخر، لا يمكنك استخدام ADO 2.X فحسب، بل يمكنك أيضًا استخدام أي كائنات COM أخرى لا توجد لها مثيلات في .NET. وبطبيعة الحال، فإن إمكانية التشغيل المتداخل بين COM و.NET تأتي على حساب الأداء. الى أي مدى؟ لا يمكن الحصول على إجابة هذا السؤال إلا بعد إجراء اختبار شامل للتطبيق.

يبدو أن كائنات البرمجة وأساليبها وخصائصها لا تختلف عن الطريقة التي تمت برمجتها بها في نموذج ADO 2.X. لماذا الانتقال إلى نموذج ADO.NET؟

بالطبع، تنفيذ عمليات اتصال قاعدة البيانات الأساسية لا يختلف كثيرًا عن نفس العمليات في نموذج ADO 2.X. ومع ذلك، بالإضافة إلى التحسينات الطفيفة التي سبق ذكرها هنا، هناك عدد من الاختلافات المهمة التي يجب وضعها في الاعتبار.

1. يمثل Visual Basic .NET والنظام الأساسي .NET عالمًا جديدًا تمامًا، ونموذج ADO.NET هو الطريقة للوصول إلى البيانات في هذا العالم.

2. على الرغم من أنه يمكنك الاستمرار في استخدام مكونات COM الموجودة، مثل تلك الموجودة في طراز ADO 2.X، عند إنشاء تطبيقات متوافقة مع .NET، فإن هذه الطريقة ترتبط بانخفاض الأداء عند الوصول إلى مكونات COM والحاجة إلى التثبيت والتسجيل بشكل صحيح هم.

3. إن كائنات موفري البيانات المختلفين التي تمت مناقشتها في هذا الفصل مسؤولة فقط عن جزء من جميع العمليات مع قاعدة البيانات، أي قراءة البيانات وكتابتها في الوضع المتصل. يتم تنفيذ الجزء الآخر من العمليات في وضع قطع الاتصال ويرتبط بكائن DataSet. في هذا الوضع يتم تفعيل فوائد نموذج ADO.NET، ولهذا السبب يصف الفصل التالي العناصر الأساسية لكائن DataSet.


مركز معالجة وتخزين البيانات بنظام تسليم المفتاح من الشركة

يقع الحدث قبل تنفيذ الأمر. خيارات:
  • المصدر عبارة عن سلسلة تحتوي على عبارة SQL أو اسم الإجراء المخزن.
  • CursorType - نوع المؤشر لمجموعة السجلات التي سيتم فتحها. يمكن تغيير نوع المؤشر. القيم الممكنة:
    • adOpenUnspecified(-1) - نوع المؤشر غير محدد.
    • adOpenForwardOnly(0) - يحدد مؤشر التوجيه فقط. مثل المؤشر الثابت، ولكن يمكنك فقط التمرير للأمام عبر الإدخالات. يؤدي هذا إلى تحسين التنفيذ إذا كان عليك فقط إجراء تمريرة واحدة عبر مجموعة السجلات.
    • adOpenKeyset(1) - يحدد مؤشر مجموعة المفاتيح. يشبه المؤشر الديناميكي، لكن لا يمكنك رؤية السجلات التي أضافها مستخدمون آخرون، على الرغم من أن السجلات المحذوفة بواسطة مستخدمين آخرين غير متوفرة في مجموعة السجلات الخاصة بك.
    • adOpenDynamic(2) - يحدد المؤشر الديناميكي. الإضافات والتغييرات والحذف من قبل المستخدمين الآخرين تكون مرئية. يُسمح بجميع أنواع الحركة عبر Recordset، باستثناء الإشارات المرجعية إذا كان الموفر لا يدعمها.
    • adOpenStatic(3) - يحدد مؤشرًا ثابتًا. نسخة ثابتة من مجموعة السجلات التي يمكنك استخدامها للبحث عن البيانات أو إنشاء التقارير. الإضافات أو التغييرات أو الحذف من قبل المستخدمين الآخرين غير مرئية.
  • LockType - نوع القفل لمجموعة السجلات التي سيتم فتحها. القيم الممكنة:
    • adLockUnspecified(-1) - نوع القفل غير محدد.
    • adLockReadOnly(1) - للقراءة فقط. لا يمكنك تغيير البيانات.
    • adLockPessimistic(2) - قفل متشائم. يضمن المزود التحرير الناجح للسجلات. يتم حظر السجل مباشرة بعد بدء التحرير وحتى يتم حفظ السجلات.
    • adLockOptimistic(3) - قفل متفائل. يقوم الموفر بتأمين السجلات فقط عندما يتم حفظ التغييرات، أي. عند استدعاء الأسلوب Update().
    • adLockBatchOptimistic(4) - تعديلات دفعة متفائلة. مطلوب لوضع تعديل الدفعة (تأخير حفظ السجلات).
  • الخيارات - عدد صحيح (طويل) يشير إلى خيارات تنفيذ أمر أو فتح مجموعة السجلات.
  • حالة الإعلان - تحدد حالة الحدث. القيم المحتملة - راجع وصف المعلمة المشابهة لحدث ConnectComplete.
  • pCommand هو كائن Command الذي ينطبق عليه هذا الحدث.
  • pRecordset هو كائن Recordset الذي ينطبق عليه هذا الحدث.
  • pConnection هو كائن الاتصال الذي ينطبق عليه هذا الحدث.
يمكن أن يحدث الحدث WillExecute بسبب استدعاءات Connection.Execute أو Command.Execute أو Recordset.Open. تحتوي المعلمة pConnection دائمًا على مرجع لكائن الاتصال. إذا حدث الحدث بسبب استدعاء Connection.Execute، فسيتم تعيين معلمات pRecordset وpCommand على لا شيء. إذا حدث الحدث بسبب استدعاء Recordset.Open، فستحتوي المعلمة pRecordset على مرجع إلى كائن Recordset، وسيتم تعيين المعلمة pCommand إلى لا شيء. إذا حدث الحدث بسبب استدعاء Command.Execute، فستحتوي المعلمة pCommand على مرجع إلى كائن Command، وسيتم تعيين المعلمة pRecordset إلى لا شيء.

يستخدم ADO.NET بنية ذات طبقات تدور حول عدد صغير من المفاهيم الأساسية، مثل كائنات الاتصال والأوامر وDataSet. ومع ذلك، فإن بنية ADO.NET تختلف تمامًا عن بنية ADO الكلاسيكية.

موفري البيانات في ADO.NET

مزود البياناتهي مجموعة من فئات ADO.NET التي تسمح لك بالوصول إلى قاعدة بيانات محددة وتنفيذ أوامر SQL واسترداد البيانات. في الأساس، يعد موفر البيانات بمثابة جسر بين التطبيق الخاص بك ومصدر البيانات.

كتقريب أولي، يمكن اعتبار مزود البيانات كمجموعة من الأنواع، المحددة في مساحة اسم معينة، والتي تهدف إلى التفاعل مع مصدر بيانات محدد. ومع ذلك، بغض النظر عن مزود البيانات المستخدم، يحدد كل منها مجموعة من الفئات التي توفر الوظائف الأساسية. يوضح الجدول أدناه بعض الكائنات الأساسية الشائعة وفئاتها الأساسية (المحددة في مساحة الاسم System.Data.Common) والواجهات الرئيسية (المحددة في مساحة الاسم System.Data) التي تنفذها:

نوع الكائن الطبقة الأساسية واجهات المقابلة غاية
اتصال اتصال اتصال IDb يسمح لك بالاتصال بوحدة تخزين البيانات وقطع الاتصال بها. بالإضافة إلى ذلك، توفر كائنات الاتصال الوصول إلى كائنات المعاملة المقابلة
يأمر أمر ديسيبل IDbCommand يمثل استعلام SQL أو الإجراء المخزن. بالإضافة إلى ذلك، توفر كائنات الأوامر إمكانية الوصول إلى كائن قارئ بيانات محدد لموفر البيانات
قارئ البيانات DbDataReader إداتاريدر، إداتاريكورد يوفر وصولاً للقراءة فقط إلى البيانات في الاتجاه الأمامي باستخدام مؤشر من جانب الخادم
محول البيانات DbDataAdapter IDataAdapter، IDbDataAdapter يرسل مجموعات البيانات من مخزن البيانات إلى عملية الاستدعاء والعودة. تحتوي محولات البيانات على اتصال ومجموعة من أربعة كائنات أوامر داخلية لجلب المعلومات وإدراجها وتعديلها وحذفها في مخزن البيانات
معامل DbParameter IDataParameter، IDbDataParameter يمثل معلمة مسماة في استعلام ذي معلمات
عملية معاملة Db IDbTransaction يقوم بتغليف المعاملة في قاعدة البيانات

تختلف الأسماء الدقيقة لهذه الفئات الأساسية بين الموفرين (على سبيل المثال، SqlConnection، وOracleConnection، وOdbcConnection، وMySqlConnection)، ولكن كل هذه الكائنات مشتقة من نفس الفئة الأساسية (في حالة كائنات الاتصال، هذا هو DbConnection) الذي ينفذ واجهات متطابقة (مثل IDbConnection). لذلك، إذا تعلمت العمل مع مزود بيانات واحد، فيمكنك بسهولة التعامل مع الباقي.

في ADO.NET، يشير مصطلح "كائن الاتصال" فعليًا إلى نوع معين مشتق من DbConnection؛ لا يوجد كائن اتصال "على الإطلاق". يمكن قول الشيء نفسه عن "كائن الأمر" و"كائن محول البيانات" وما إلى ذلك. وفقًا للاتفاقية، تكون أسماء الكائنات في موفر بيانات معين مسبوقة بنظام إدارة قواعد البيانات (DBMS) المقابل (على سبيل المثال، SqlConnection، وOracleConnection، وSqlDataReader، وما إلى ذلك).

55. تقنية ASP.NET. طرق الوصول إلى البيانات عن بعد.

56. نموذج كائن ASP.NET. خصائص والغرض من الكائنات الرئيسية. أمثلة.

57. مكونات ASP. أمثلة على حالات الاستخدام للوصول إلى مصادر البيانات المختلفة.

58. تنظيم واجهة المستخدم. نقل البيانات بين وحدات التطبيق.

59. الخصائص العامة لسوق منتجات برمجيات رابطة الدول المستقلة.

60. تحليل السوق لمنتجات برمجيات رابطة الدول المستقلة

الخصائص العامة للمنتجات البرمجية لـ Oracle CIS

قاعدة بيانات أوراكل

يأتي برنامج Oracle Database في مجموعة متنوعة من الإصدارات لتناسب سيناريوهات تطوير التطبيقات المختلفة ونشرها. فيما يلي الإصدارات الحالية من Oracle Database 11g:

· إصدار المؤسسة

يوفر إصدار Enterprise أعلى مستوى من الأداء والتوفر وقابلية التوسع والأمان اللازم لتطبيقات المؤسسات ذات المهام الحرجة مثل:
- المعالجة عبر الإنترنت لحجم أكبر من المعاملات (OLTP)؛
- مستودعات البيانات المطلوبة بشكل مكثف (مستودع البيانات، DSS)؛
– تطبيقات إنترنت آمنة ومكثفة الموارد.
يحتوي الإصدار Enterprise Edition على جميع مكونات Oracle Database ويمكن توسيعه عن طريق شراء خيارات وحزم إضافية.

· الطبعة القياسية

مصممة للنشر في الشركات الصغيرة والمتوسطة الحجم. توفر هذه الطبعة من نظام إدارة قواعد البيانات (DBMS) سهولة الاستخدام والطاقة العالية والأداء مع الدعم مجموعات تطبيقات أوراكل الحقيقية(Oracle RAC) لتطبيقات مستوى مجموعة العمل أو القسم، بما في ذلك تطبيقات الويب.
يتضمن الإصدار القياسي كل ما تحتاجه لإنشاء تطبيقات الأعمال المهمة.
ومع ذلك، بالمقارنة مع الإصدار Enterprise Edition، لا يتوفر عدد من المكونات والوظائف المتقدمة في الإصدار القياسي لضمان أعلى مستوى من توفر التطبيق والأداء والأمان، بما في ذلك الأدوات اللازمة لأتمتة عملية إدارة قواعد البيانات ومراقبتها وتشخيصها.
لا يمكن ترخيص الإصدار القياسي إلا على خوادم ذات سعة قصوى تبلغ 4 مآخذ معالج.

· الإصدار القياسي الأول

تم تصميمه لتطبيقات مجموعات العمل والأقسام ويتمتع بنفس وظائف الإصدار القياسي، ولكن بدون دعم Oracle RAC.
تم ترخيص Standard Edition One فقط للخوادم التي لا تحتوي على أكثر من معالجين (مآخذ). في هذه الحالة، يتلقى العميل نفس الرمز الموجود في الإصدار القياسي.

· الطبعة الشخصية

يتوفر الإصدار الشخصي فقط على نظام التشغيل Windows ويدعم نشر تطبيق المستخدم الفردي، وهو متوافق تمامًا مع إصدار Enterprise، باستثناء أن Oracle RAC غير مضمن.

ما هو ترخيص أوراكل.

يتم توزيع منتجات برامج Oracle (المشار إليها فيما يلي باسم "البرامج") من خلال توفير تراخيص لاستخدامها.
الترخيص هو حق غير حصري ودائم وغير قابل للتحويل لاستخدام البرامج، ويتم منحه للمستخدم النهائي بموجب شروط وأحكام Oracle. تظل حقوق النشر وحقوق الملكية لمنتجات البرامج المرخصة مملوكة للشركة المصنعة.
ويعني ترخيص البرامج الحصول على حقوق استخدامها، بدلاً من شراء منتجات البرامج نفسها.
لا تعتمد تكلفة الترخيص على إصدار برنامج Oracle (8i، 9i، 10g، 11g) والنظام الأساسي (Windows، Linux، Unix، وما إلى ذلك).
وفي الوقت نفسه، فإن العملاء الذين لديهم حاليًا ترخيص تحديث ودعم صالحين هم وحدهم المؤهلون للحصول على إصدارات المنتجات الجديدة.
يتم توفير البرامج المرخصة عبر قنوات الاتصال الإلكترونية أو على وسائط الأقراص المضغوطة.
يتم بيع التراخيص في بلدان رابطة الدول المستقلة فقط من خلال شركاء Oracle المعتمدين.
يتمتع العميل بفرصة اختيار طريقة شراء الترخيص: بواسطة المستخدم - مستخدم مسمى زائد أو بواسطة المعالج - المعالج.

ترخيص ترقية ودعم برامج Oracle
(ترخيص ودعم تحديث البرنامج)

يوفر ترخيص تحديث البرامج وترخيص الدعم للعملاء الحق في تحديث (ترقية) المنتج والدعم الفني على مدار 24 ساعة طوال أيام الأسبوع لمدة خمس سنوات من تاريخ إصدار المنتج.
تتضمن ترقية المنتج تحديث إصدارات البرامج والحفاظ على الإصدارات وتوفير التصحيحات (الإصلاحات).
يتمتع العملاء بإمكانية الوصول المباشر إلى خبراء Oracle لطرح أسئلة محددة تتعلق بتثبيت برامج Oracle وتشغيلها.

يتم توفير دعم الويب من خلال My Oracle Support (المعروف سابقًا باسم OracleMetaLink).
يوفر My Oracle Support للعملاء إشعارات استباقية، وصفحة رئيسية مخصصة، ومكتبات ومنتديات تقنية، ومعلومات عن دورة حياة المنتج، وقاعدة بيانات الأخطاء، والقدرة على إرسال طلب خدمة (SR).
يتم توفير ترخيص ودعم تحديث البرامج لمدة عام واحد ويتم شراؤه في نفس وقت شراء تراخيص منتجات Oracle.
تبلغ تكلفة ترخيص تحديث البرامج والدعم 22% من تكلفة تراخيص منتجات Oracle المشتراة.

تمديد الدعم
(تجديد الدعم)

يتم تجديد ترخيص ودعم تحديث البرامج عن طريق دفع رسوم اشتراك سنوية.
يضمن التجديد السنوي المنتظم لترخيص ودعم تحديث البرامج تحسين تكاليف تحديث منتجات Oracle في الفترات اللاحقة.

مقاييس الترخيص
(مقاييس الترخيص)

عادةً ما يتم ترخيص منتجات برامج Oracle باستخدام أحد المقاييس الأكثر استخدامًا:

  • المستخدم المسمى زائد(مستخدم محدد)

يقوم مقياس Named User Plus (NUP) بترخيص ما يسمى بالمستخدمين المحددين.
مستخدم مسمىب – الشخص المصرح له باستخدام البرامج المثبتة على خادم واحد أو أكثر، بغض النظر عما إذا كان يستخدم البرنامج حاليًا أم لا. يعتبر الجهاز التلقائي (الذي لا يتطلب تدخلًا بشريًا) الذي يمكنه الوصول إلى البرامج مستخدمًا (NUP) بالإضافة إلى جميع الأشخاص المصرح لهم باستخدام البرامج.
عند استخدام أجهزة أو برامج تعدد الإرسال (مثل مراقبة المعاملات أو خادم الويب)، يجب تحديد هذا الرقم عند إدخال معدد الإرسال.

ADO.NET عبارة عن مجموعة من المكتبات المضمنة في Microsoft .NET Framework والمصممة للتفاعل مع مخازن البيانات المختلفة من تطبيقات .NET. تشتمل مكتبات ADO.NET على كافة الفئات الضرورية للاتصال بمصادر البيانات ذات التنسيق العشوائي تقريبًا، وإجراء الاستعلامات مقابل هذه المصادر، والحصول على النتائج. بالإضافة إلى ذلك، فإن الميزة التي لا شك فيها لـ ADO.NET هي القدرة على العمل مع مصادر البيانات المنفصلة، ​​وهي الهياكل التي تنظم البيانات في ذاكرة الوصول العشوائي للكمبيوتر ويمكن التعامل معها باستخدام أدوات الوصول إلى البيانات المألوفة بالفعل. وبالتالي، يمكن استخدام ADO.NET كذاكرة تخزين مؤقت موثوقة ومنظمة بشكل هرمي ومنفصلة عن المصدر للعمل دون اتصال بالإنترنت، وهو أمر لا غنى عنه عند إنشاء تطبيقات قابلة للتطوير، خاصة تلك التي تستهدف الويب.

تعد ADO.NET اليوم تقنية الوصول إلى البيانات الأكثر تقدمًا بين التقنيات التي طورتها Microsoft. إنه يطور المبادئ التي تم وضعها في تقنيات مثل DAO وADO، مما يجعلها أسهل في الاستخدام وأكثر قوة وأكثر تنوعًا. وفي الوقت نفسه، تعد ADO.NET تقنية مختلفة للوصول إلى البيانات.

دعونا نلقي نظرة على بنية ADO.NET

نظرًا لأن ADO.NET عبارة عن مجموعة من الفئات لتنظيم تفاعل تطبيق العميل مع قاعدة بيانات، فلنفكر في نموذج كائن ADO.NET

في التين. يوضح الشكل 10.1 الفئات التي تشكل نموذج كائن ADO.NET

أرز. 10.1. ADO.NET التسلسل الهرمي للكائنات

تسمى الكائنات الموجودة على الجانب الأيسر متصلة وهي ضرورية لإدارة الاتصال والمعاملات واسترجاع البيانات ونقل تغييرات البيانات إلى قاعدة البيانات. يتفاعلون مباشرة مع قاعدة البيانات. تسمى الكائنات الموجودة على الجانب الأيمن منفصلة. أنها تسمح لك بالعمل مع البيانات بشكل مستقل. لا تتفاعل الكائنات المنفصلة مباشرة مع الكائنات المتصلة للحصول على البيانات من قاعدة البيانات. بتعبير أدق، يمكننا القول إنهم لا يتفاعلون مع جميع الكائنات الموجودة على الجانب الأيسر من التسلسل الهرمي للكائنات. على الرغم من أن تعبئة الكائنات المنفصلة بالبيانات ستتم مناقشتها لاحقًا، إلا أن إحدى الطرق التي تتفاعل بها هاتان المجموعتان هي أن يستخدم DataAdapter DataSet لملء الأخيرة بمجموعة من البيانات المستردة مباشرة من قاعدة البيانات.

إحدى الأفكار الأساسية وراء ADO.NET هي وجود موفري البيانات.

موفر البيانات عبارة عن مجموعة من الفئات المصممة للتفاعل مع نوع معين من مخزن البيانات. وهذا يجعل نموذج ADO.NET مرنًا للغاية وقابل للتوسيع. دعونا نلقي نظرة على طبقات نموذج موفر ADO.NET (الشكل 10.2).


أرز. 10.2.طبقات نموذج موفر ADO.NET

كما يظهر في الشكل. 10.2، يتواصل تطبيق .NET مع قاعدة البيانات من خلال موفري البيانات. يمكن لكل مزود بيانات توفير الوصول إلى تنسيق قاعدة بيانات محدد فقط. وبالتالي، للوصول إلى قاعدة بيانات Microsoft SQL Server، يتم استخدام موفر SQL Server لـ .NET، وللوصول إلى قاعدة بيانات Oracle، يتم استخدام موفر Oracle لـ .NET، وما إلى ذلك. وتعد قواعد البيانات هذه من أكثر قواعد البيانات شيوعًا في العالم، لذا فإن البيانات يتم فصل مقدمي الخدمات لهم إلى عناصر منفصلة لنموذج ADO.NET؛ ومع ذلك، هناك العديد من قواعد البيانات ذات التنسيقات المختلفة التي يجب الوصول إليها من تطبيق .NET. للقيام بذلك، يمكن استخدام OleDb لـ .NET أو ODBC لموفري بيانات .NET، مما يوفر الوصول إلى أي بيانات يوجد لها برنامج تشغيل OleDb أو ODBC، على التوالي.

عند إنشاء تطبيق يستخدم الوصول إلى البيانات، يجب عليك أولاً محاولة العثور على موفر بيانات .NET أصلي. في حالة عدم وجود ذلك، يمكنك استخدام OleDb إذا كان هناك برنامج تشغيل مناسب لمصدر البيانات الذي يتم إنشاء الاتصال به. نظرًا لوجود تقنية OleDb منذ فترة طويلة، فقد تم إنشاء العديد من برامج التشغيل لمصادر البيانات المختلفة التي تدعمها. إذا لم يتم تثبيت برنامج تشغيل OleDb المقابل على النظام، فيمكنك محاولة العثور عليه على موقع الويب الخاص بمطور قاعدة البيانات التي يتم الوصول إليها، أو على موقع Microsoft على الويب. وينطبق الشيء نفسه على تقنية ODBC. في بعض الحالات، هناك العديد من الخيارات البديلة لتنظيم الوصول إلى البيانات بتنسيق معين. على سبيل المثال، يمكنك الوصول إلى مصدر بيانات يستند إلى SQL Server باستخدام موفر SQL Server لـ .NET أو موفر OleDb. ومع ذلك، فمن الأفضل دائمًا الاستعانة بموفر بيانات مصمم خصيصًا لتوفير الوصول إلى مصدر بيانات محدد، لأنه يأخذ في الاعتبار خصائصه.

يقوم كل موفر .NET بتنفيذ نفس الفئات الأساسية - Connection، وTransaction، وDataAdapter، وCommand، وParameter، وDataReader - والتي تعتمد أسماؤها على الموفر. على سبيل المثال، لدى موفر SQL Server كائن SqlDataAdapter، وموفر OleDb لديه OleDbDataAdapter، وما إلى ذلك.

كل مزود بيانات لديه مساحة الاسم الخاصة به. على الرغم من أن كافة الموفرين ينتمون إلى مساحة الاسم System.Data، إلا أن كل منهم يحتوي على قسم فرعي من مساحة الاسم تلك التي تحتوي على كائنات خاصة بهذا الموفر. على سبيل المثال، الكائن SqlDataAdapter موجود في مساحة الاسم System.Data.SqlClient.

يقوم جميع موفري بيانات .NET بتنفيذ نفس الوظيفة الأساسية، لذا فإن التعليمات البرمجية التي تكتبها للوصول إلى البيانات تبدو متشابهة تقريبًا بغض النظر عن الموفر. وهذا يعني أنه عندما نفكر في استخدام واجهات مزود معين، فإننا نفكر في الواقع في استخدام تلك الواجهات نفسها مع موفري البيانات الآخرين.

عند تنظيم الوصول إلى البيانات باستخدام ADO.NET، تلعب الكائنات الموضحة في الشكل 1 دورًا مهمًا للغاية. 10.1. دعونا ننظر إليهم بمزيد من التفصيل.

كائن الاتصاليمثل اتصالاً بمصدر البيانات. بمساعدتها، يمكنك تعيين نوع مصدر البيانات وموقعه ومعلمات الوصول وعدد من السمات الأخرى. قبل أن تتمكن من التفاعل مع مصدر البيانات، يجب عليك إنشاء اتصال به باستخدام كائن اتصال.

كائن الأمريمثل استعلامًا مقابل مصدر بيانات، أو استدعاء لإجراء مخزن، أو استعلام مباشر لإرجاع محتويات جدول معين. كما تعلمون، هناك عدة أنواع من الطلبات. بعضها يقوم بإرجاع البيانات المستخرجة من مصدر البيانات، والبعض الآخر يقوم بتعديل السجلات، والبعض الآخر يدير بنية قاعدة البيانات. باستخدام كائن الأمر، من الممكن تنفيذ أي من أنواع الاستعلامات التالية. تبدأ الاختلافات في سلوك كائن الأمر في الظهور عندما يكون من الضروري تنفيذ طلب معين. لذلك، على سبيل المثال، إذا كنت بحاجة إلى تنفيذ استعلام لا يُرجع سجلات، فيجب عليك استخدام أسلوب ExecuteNonQuery لكائن Command، وعند استرداد البيانات من قاعدة البيانات، استخدم أسلوب ExecuteReader، والذي بدوره يقوم بإرجاع DataReader الكائن الذي يسمح لك بعرض السجلات التي تم الحصول عليها نتيجة للطلب.

كائن قارئ البياناتتم تصميمه لتحديد أسرع وعرض ممكن للسجلات التي يتم إرجاعها بواسطة الاستعلام. ومع ذلك، فهو يسمح لك بعرض مجموعة النتائج الكاملة للسجلات عن طريق الانتقال من سجل إلى آخر وبالتالي عرض سجل واحد فقط في كل مرة. بالإضافة إلى ذلك، لا يتمتع DataReader بالقدرة على تحديث قيم السجلات وبالتالي يمكنه العمل في وضع القراءة فقط، مما يجعله يتمتع بأداء عالٍ.

كائن المعاملةيسمح لك بتجميع السجلات في وحدة عمل منطقية تسمى المعاملة. تجمع المعاملة منطقيًا بين العديد من أنشطة معالجة البيانات المختلفة في عملية واحدة. أثناء تنفيذ الإجراءات التي يتم تنفيذها كجزء من المعاملة، يقوم نظام إدارة قواعد البيانات عادةً بتخزين التغييرات التي تم إجراؤها بواسطة هذه الإجراءات على البيانات مؤقتًا حتى اكتمال المعاملة. يتيح لك هذا التراجع عن أي تغييرات تم إجراؤها داخل المعاملة في حالة فشل أحد إجراءات المعاملة على الأقل.

كائن المعلمةيسمح لك بإدخال عنصر في الطلب، والذي يمكن تعيين قيمته مباشرة قبل تنفيذ الطلب. ونتيجة لذلك، ليست هناك حاجة لتغيير نص الطلب نفسه في كل مرة.

كائن DataAdapterيمثل الرابط بين كائنات ADO.NET المنفصلة وقاعدة البيانات. بمساعدتها، يتم ملء كائنات مثل DataSet أو DataTable بالقيم التي تم الحصول عليها نتيجة لاستعلام قاعدة البيانات للعمل اللاحق معهم دون اتصال بالإنترنت. بالإضافة إلى ذلك، ينفذ DataAdapter آلية فعالة لتحديث البيانات المخزنة في قاعدة البيانات مع التغييرات التي تم إجراؤها على بيانات كائنات DataSet وDataTable.

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

كائن DataColumnيمثل عمودًا لكائن DataTable. مجموعة كافة أعمدة كائن DataTable عبارة عن مجموعة من الأعمدة. من خلال هذا الكائن يمكنك الوصول إلى قيمة الخلية للعمود المقابل.

كائن DataRowيمثل صفًا من كائن DataTable. مجموعة كافة صفوف هذا الكائن هي مجموعة الصفوف. يتم استخدام DataRow في كثير من الأحيان للوصول إلى قيمة حقل معين لسجل معين. وهذا ينطبق على خاصية العنصر.

كائن مجموعة البياناتيمثل مجموعة بيانات منفصلة يمكن اعتبارها حاوية لكائنات DataTable. تتيح لك DataSet تنظيم بنية داخل نفسها تتوافق تمامًا مع البنية الحقيقية للجداول والعلاقات بينها في قاعدة البيانات. يعد هذا مناسبًا عند العمل مع قاعدة بيانات، حيث تحتاج إلى بيانات من جداول مختلفة. في هذه الحالة، بدلاً من الاتصال بالخادم بشكل متكرر وتحديد البيانات من جدول واحد في كل مرة، يمكنك وضع كافة البيانات في كائن DataSet ثم تمريرها إلى تطبيق العميل. تعد DataSet أداة قوية جدًا للعمل مع مجموعات البيانات المنفصلة. يتم تخزين كافة التغييرات التي يتم إجراؤها على البيانات المخزنة في DataSet مؤقتًا في كائنات DataRow. عندما يصبح من الضروري نقل التغييرات من DataSet إلى قاعدة البيانات، فمن الممكن نقل البيانات التي تم تغييرها فقط، بدلاً من نقل كافة بيانات الكائن، وهذا يقلل بشكل كبير من كمية البيانات المنقولة بين الكمبيوتر العميل والخادم.

كائن DataRelationهو وصف للعلاقات بين الجداول في قاعدة البيانات العلائقية. يتم توفيره بواسطة كائن DataSet ويسمح لك بتنظيم العلاقات بين الجداول في مجموعة بيانات كائن DataSet المنفصلة. ينفذ كائن DataRelation وظيفة مشابهة لتلك التي تؤديها العلاقات المحددة في نظام إدارة قواعد البيانات بين الجداول عند إنشاء بنيات البيانات. وينطبق هذا أيضًا على الامتثال لمبادئ السلامة المرجعية للمعلومات. على سبيل المثال، يمكن تكوين DataRelation بحيث يتم نشر التغييرات التي يتم إجراؤها على قيمة المفتاح الأساسي للجدول الأصل تلقائيًا (متتالية) إلى السجلات التابعة، وعندما يتم حذف سجل في الجدول الأصل، يتم حذف السجلات الموجودة في الجداول الفرعية المقترنة به تم حذفه تلقائيا.

كائن عرض البياناتتم تصميمه لتوفير القدرة على عرض محتويات DataTable بطرق مختلفة. ينطبق هذا على عمليات مثل فرز السجلات وتصفيتها. باستخدام DataView، يمكنك عرض محتويات كائن DataTable واحد بإعدادات تصفية وفرز مختلفة. للقيام بذلك، تحتاج إلى استخدام كائنين مختلفين من DataView مقترنين بكائن DataTable واحد. تلغي هذه الميزة الحاجة إلى تخزين مجموعة واحدة من البيانات في بنيتين مختلفتين.

ستتم مناقشة استخدام كافة كائنات نموذج ADO.NET بمزيد من التفاصيل أدناه.

آخر تحديث: 31/10/2015

اليوم، العمل مع البيانات له أهمية كبيرة. تُستخدم أنظمة إدارة قواعد البيانات المختلفة لتخزين البيانات: MS SQL Server، وOracle، وMySQL، وما إلى ذلك. وتستخدم معظم التطبيقات الكبيرة أنظمة إدارة قواعد البيانات هذه لتخزين البيانات بطريقة أو بأخرى. ومع ذلك، للتواصل بين قاعدة البيانات وتطبيق C#، يلزم وجود وسيط. وتقنية ADO.NET هي مجرد وسيط.

يوفر ADO.NET تقنية لعلم البيانات تعتمد على .NET Framework. توفر لنا هذه التقنية مجموعة من الفئات التي يمكننا من خلالها إرسال الاستعلامات إلى قواعد البيانات وإنشاء اتصالات وتلقي استجابة من قاعدة البيانات وتنفيذ عدد من العمليات الأخرى.

علاوة على ذلك، من المهم ملاحظة أنه يمكن أن يكون هناك العديد من أنظمة إدارة قواعد البيانات. في جوهرها قد تختلف. على سبيل المثال، يستخدم MS SQL Server لغة T-SQL لإنشاء استعلامات، بينما يستخدم MySQL وOracle لغة PL-SQL. قد تحتوي أنظمة قواعد البيانات المختلفة على أنواع بيانات مختلفة. قد تختلف بعض النقاط الأخرى أيضًا. ومع ذلك، تم تصميم وظيفة ADO.NET بطريقة توفر للمطورين واجهة موحدة للعمل مع مجموعة واسعة من أنظمة إدارة قواعد البيانات.

يتم تمثيل أساس الواجهة للتفاعل مع قواعد البيانات في ADO.NET من خلال مجموعة محدودة من الكائنات: Connection وCommand وDataReader وDataSet وDataAdapter. باستخدام كائن الاتصال، يتم إنشاء اتصال بمصدر البيانات. يسمح لك كائن Command بإجراء عمليات على البيانات من قاعدة البيانات. يقرأ كائن DataReader البيانات المستلمة نتيجة للطلب. تم تصميم كائن DataSet لتخزين البيانات من قاعدة بيانات ويسمح لك بالعمل معها بشكل مستقل عن قاعدة البيانات. وكائن DataAdapter هو الوسيط بين DataSet ومصدر البيانات. بشكل أساسي، سيتم العمل مع قاعدة البيانات من خلال هذه الكائنات.

ومع ذلك، لاستخدام نفس مجموعة الكائنات لمصادر بيانات مختلفة، فإنك تحتاج إلى خيار مناسب مزود البيانات. يتم التفاعل مع قاعدة البيانات من خلال موفر البيانات في ADO.NET. علاوة على ذلك، يمكن أن يكون لكل مصدر بيانات في ADO.NET موفر خاص به، والذي يحدد فعليًا التنفيذ المحدد للفئات المذكورة أعلاه.

بشكل افتراضي، يحتوي ADO.NET على الموفرين المضمنين التاليين:

    مزود لخادم MS SQL

    موفر OLE DB (يوفر الوصول إلى بعض الإصدارات الأقدم من MS SQL Server، بالإضافة إلى قواعد بيانات Access وDB2 وMySQL وOracle)

    موفر ODBC (موفر مصادر البيانات التي ليس لديها موفري خدمات خاصين بها)

    مزود لأوراكل

    مقدم الكيانالعميل. مزود البيانات لتقنية ORM Entity Framework

    موفر لـ SQL Server Compact 4.0

بالإضافة إلى هؤلاء الموفرين المدمجين، هناك أيضًا العديد من المزودين الآخرين المصممين لقواعد بيانات مختلفة، على سبيل المثال، MySQL.

مساحات الأسماء الرئيسية المستخدمة في ADO.NET هي:

    System.Data: يحدد الفئات والواجهات والمفوضين الذين يقومون بتنفيذ بنية ADO.NET

    System.Data.Common: يحتوي على فئات مشتركة بين جميع موفري ADO.NET

    System.Data.Design: يحدد الفئات المستخدمة لإنشاء مجموعات البيانات الخاصة بها

    System.Data.Odbc: يحدد وظيفة موفر البيانات لـ ODBC

    System.Data.OleDb: يحدد وظيفة موفر البيانات لـ OLE DB

    System.Data.Sql: يقوم بتخزين الفئات التي تدعم الوظائف الخاصة بـ SQL Server

    System.Data.OracleClient: يحدد وظيفة الموفر لقواعد بيانات Oracle

    System.Data.SqlClient: يحدد وظيفة الموفر لقواعد بيانات MS SQL Server

    System.Data.SqlServerCe: يحدد وظيفة الموفر لـ SQL Server Compact 4.0

    System.Data.SqlTypes: يحتوي على فئات لأنواع بيانات MS SQL Server

    Microsoft.SqlServer.Server: يقوم بتخزين المكونات للتواصل بين SQL Server وCLR

يمكن تمثيل بنية ADO.NET بشكل تخطيطي على النحو التالي:

من الناحية الوظيفية، يمكن تقسيم فئات ADO.NET إلى مستويين: متصل وغير متصل. يقوم كل موفر بيانات .NET بتنفيذ نسخته الخاصة من Connection وCommand وDataReader وDataAdapter والعديد من الكائنات الأخرى التي تشكل الطبقة المتصلة. أي أنها تستخدم لإنشاء اتصال بقاعدة البيانات والتفاعل معها. كقاعدة عامة، يكون لتطبيقات هذه الكائنات لكل موفر محدد بادئة في اسمها تشير إلى الموفر:

تشكل الفئات الأخرى مثل DataSet وDataTable وDataRow وDataColumn والعديد من الفئات الأخرى الطبقة المنفصلة لأنه بمجرد استرداد البيانات إلى DataSet، يمكننا العمل مع تلك البيانات بغض النظر عما إذا كان قد تم إنشاء اتصال أم لا. أي أنه بعد تلقي البيانات من قاعدة البيانات، يمكن فصل التطبيق عن مصدر البيانات.