"لا تؤجل أبدًا ما يمكن القيام به في وقت الترجمة حتى وقت التشغيل."
ديفيد جريس، بناء المترجمات لأجهزة الكمبيوتر الرقمية
مقدمة
كمبرمجين، عندما نتعلم بعض التقنيات الجديدة، يمكن أن تكون الأمثلة في بعض الأحيان أكبر عدو لنا. غالبًا ما يتم تصميم الإرشادات لتكون بسيطة وسهلة الفهم، ولكنها في الوقت نفسه يمكن أن تؤدي إلى زيادة في كتابة التعليمات البرمجية البطيئة وغير الفعالة وحتى الخطيرة. الموقف الأكثر شيوعًا مثل هذا موجود في نموذج ADO.NET. في هذه المقالة، سنلقي نظرة على ما يعنيه وجود كائنات مكتوبة بقوة في قاعدة البيانات، مما يسمح لك بالقيام بذلك في برامجك، على الرغم من عدم وجود أمثلة.
وبشكل أكثر تحديدًا، سنرى مدى قوة إنشاء مجموعات البيانات المكتوبة واستخدامها في Visual Studio 2005. كما تستكشف هذه المقالة، توفر مجموعات البيانات المكتوبة بقوة العديد من المزايا مقارنة بتقنية الوصول إلى البيانات المكتوبة بشكل ضعيف. سنرى هنا أيضًا أن إنشاء واستخدام مجموعات البيانات المكتوبة بقوة لا يصبح أسهل مع Visual Studio 2005. إذا كنت تريد معرفة المزيد، استمر في القراءة.
أساسيات وفوائد الكائنات المكتوبة بقوة
لفهم معنى الكتابة القوية، يمكنك أولاً التفكير في المواعدة. إذا كنت عازبًا، ما هو نوع الشخص الذي قد تفكر في مواعدته؟ قد يكون لديك معايير محددة (مثل أن تكون صحيًا وجذابًا)، أو قد تكون المعايير بسيطة أو غير واضحة. بغض النظر عن ظروفك، عندما تقرر من ستقضي المزيد من الوقت معه، ستستخدم دائمًا معاييرك الخاصة لهذه الأنواع لوزنها وأخذها في الاعتبار. إذا كنت ذكيا، فسوف تفكر كثيرا في حماية نفسك من الصدمات العاطفية. قد تجد، على سبيل المثال، أن وجودك مع مدمن على الكحول أمر غير مستقر إلا إذا كان الاثنان في علاقة جدية. ومع ذلك، فمن المؤلم والصعب جدًا تغيير الشخص. لذلك، سترشدك حكمتك إلى إيقاف العلاقة حتى قبل أن تبدأ. إن إضافة شرط عدم الشرب إلى معايير المواعدة الخاصة بك سوف يحميك من وجع القلب في المستقبل ويسمح لك بتركيز وقتك وطاقتك على المرشحين الأفضل.
قد تتفاجأ كيف أن هذا المنطق له علاقة بالبرمجة. لا يهم، تعال معي أيها القارئ الجميل! تم تصميم كائنات الوصول إلى بيانات ADO.NET لتكون مرنة للغاية. عندما تقرأ بيانات من قاعدة بيانات، فمن المحتمل أنك تعمل مع العديد من الأنواع الشائعة من الكائنات التي يسمح بها إطار عمل .NET العادي، إلا إذا واجهت مشكلات خاصة. من خلال تطبيق نظرية المواعدة الخاصة بنا، يمكنك بشكل أساسي التفكير في بياناتك ذات الصلة كأشياء عالمية. "طالما أن موعدي لا يسبب الكثير من المتاعب." ألا يمكنك أن تكون أكثر وضوحًا؟ ليس هناك حد حتى لو كان إنسانا أو كائنا حيا آخر! كصديق لك، أناشدك، "المزيد من المعايير! اجعل قائمتك أصغر!"
مثلما أن إهمال من تواعده يمكن أن يؤدي إلى مشاكل في العلاقة في المستقبل، فإن ترك الأشياء الخاصة بك دون تحديد في التعليمات البرمجية الخاصة بك يمكن أن يتسبب أيضًا في حدوث أخطاء. وأيضًا، إذا تركت الكائنات القديمة تتجول في روتينك الفرعي، فقد لا تلاحظ أن هذه مشكلة حتى يتم تشغيل البرنامج. لاستخدام نظرية المواعدة الخاصة بنا، فإن اكتشاف الأخطاء في وقت التشغيل يشبه وجود شريكك في جدال مؤلم ومحرج وسط مطعم إيطالي عصري. نعم، كما ترى، إذا كنت قد خططت مسبقًا، فلن ينتهي بك الأمر مع مجموعة من رواد المطعم الذين ينظرون إليك، ولن يكون الأمر محرجًا. من خلال تطبيق بعض المعايير الأكثر صرامة على التعليمات البرمجية الخاصة بك، يمكنك اكتشاف الأخطاء قبل أن يبدأ برنامجك في التجميع. على سبيل المثال، مثال التعليمات البرمجية التالي:
string FirstName = myrow.("FirstName").ToString();
DataRow في هذا المثال غير مكتوب، ونتيجة لذلك، يجب عليك استخدام اسم العمود كسلسلة للحصول على القيمة التي تحتاجها (أو يمكنك اختيار استخدام فهرس العمود في مجموعة أعمدة السجل). لحسن الحظ أن هذا العمود موجود. نوع البيانات لعمود DataRow هو كائن، ونفترض أن نوع البيانات الموجود ضمن عمود الاسم الأول هو سلسلة، ويجب علينا تحويله بشكل صريح إلى سلسلة قبل استخدامه. إذا تغير اسم هذا العمود (على سبيل المثال، يصبح PersonFirstName)، فلن يكون لدى المترجم أي وسيلة لإعلامك. محبَط؟ ولكن ليس عليك أن تفعل ذلك. إذا كانت شفرتك تبدو كما يلي، فستكون حياتك أبسط وستكون شفرتك أكثر موثوقية.
string FirstName = PersonRow.FirstName
في هذا المثال الثاني، نستخدم صفًا مكتوبًا بقوة، ونعلم أن خاصية FirstName هي من النوع string. لا توجد أسماء أعمدة فوضوية، ولا تحويلات نوعية فوضوية. لقد قام المترجم بالفعل بفحص النوع لنا، ويمكننا تنفيذ أعمال أخرى بأمان دون القلق بشأن ما إذا كنا قد كتبنا أسماء الأعمدة بشكل صحيح.
كل شيء آخر هو نفسه، لذلك لن تتردد في استخدام هذا بدلاً من النوع العام. لكن انتظر لحظة، من أين تأتي الكائنات المكتوبة بقوة؟ أتمنى أيضًا أن أخبرك أن هذه الكائنات يتم إنشاؤها تلقائيًا. ولكن كما أن العلاقات الجيدة تستغرق وقتًا وجهدًا، فإن جعل الأشياء المكتوبة بقوة يتطلب جهدًا إضافيًا. لكن الوقت الإضافي الذي تقضيه هنا يستحق ذلك بالتأكيد، فهو يوفر بشكل كبير المزيد من الوقت الذي تقضيه في "اكتشاف الأخطاء" في المستقبل.
هناك عدة طرق لإنجاز كتابة قوية، وسنقضي بقية هذه المقالة في شرح كيفية إنشاء مجموعة بيانات مكتوبة بقوة في Visual Studio 2005. سنقوم أيضًا بمقارنة مزايا وعيوب هذا النهج مع الأساليب الأخرى.
إنشاء مجموعات بيانات مكتوبة بقوة في Visual Studio 2005
مجموعات البيانات المكتوبة بقوة هي في الواقع مجرد أعمدة وجداول محددة مسبقًا لمجموعات البيانات العادية، لذلك يعرف المترجم بالفعل ما تحتويه. بدلاً من الغلاف الفضفاض الذي يناسبك مثل قفاز البيسبول، فإن مجموعات البيانات المكتوبة بقوة تناسبك مثل القفاز. كل إصدار متتالي من Visual Studio يجعل من السهل التعامل مع مجموعات البيانات المكتوبة بقوة. في المثال التالي، سوف نستخدم قاعدة بيانات AdventureWorks الخاصة بـ SQL Server 2005. ما عليك سوى اتباع الخطوات التالية:
1. افتح Visual Studio وقم بإنشاء موقع ويب ASP.NET جديد.
2. في نافذة Solution Explorer، انقر بزر الماوس الأيمن لإضافة عنصر جديد وحدد DataSet. قم بتسميته AdventureWorks.xsd (انظر لقطة الشاشة). سيوصي Visual Studio بوضع ملف DataSet في ملف App_Code، وما عليك سوى النقر فوق "موافقة".
3. بعد فتح AdventureWorks.xsd في وضع التصميم، سيتم تشغيل معالج تكوين TableAdapter. عند هذه النقطة، انقر فوق "إلغاء الأمر" وسنقوم بسحب الجدول المطلوب من Server Explorer.
4. استعرض للعثور على قاعدة بيانات AdventureWorks في شريط أدوات Server Explorer. (إذا لم تقم بتثبيت قاعدة بيانات AdventureWorks، فيمكنك الانتقال إلى صفحة تنزيل Microsoft SQL Server 2005 Samples and Sample Databases لتنزيلها وبعض نماذج SQL Server 2005 الأخرى)
5. اسحب الجدول SalesOrderHeader والجدول SalesOrderDetail إلى نافذة تصميم DataSet. يجب أن تبدو النافذة كما في لقطة الشاشة. ماذا نرى؟ عندما نضيف جدولاً، سيقوم Visual Studio بإنشاء DataTable مكتوب بقوة (بنفس اسم الجدول الأصلي) وTableAdapter. لقد حدد DataTable هذا كل عمود لنا. TableAdapter هو ما نستخدمه لملء الجدول افتراضيًا، هناك طريقة تعبئة () للحصول على كل صف من البيانات من الجدول الأصلي.
كما هو الحال، ستعيد مجموعة البيانات المكتوبة بقوة جميع السجلات من كلا الجدولين. لكن قاعدة بيانات AdventureWorks تحتوي على الكثير من معلومات الطلب، فلماذا لا نقوم بإنشاء استعلام أكثر وضوحًا؟ يمكننا إضافة أساليب إلى كائن TableAdapter للحصول على مجموعة سجلات فرعية محددة. انقر بزر الماوس الأيمن فوق SalesORderHeaderTableAdapter وحدد إضافة|استعلام. حدد "استخدام عبارات SQL" وانقر فوق "التالي"، ثم حدد "SELECT الذي يُرجع الصفوف" وانقر فوق "التالي". مؤخرًا، أدخل الاستعلام التالي في النافذة (أو يمكنك استخدام Query Builder للقيام بهذه المهمة):
يختار
معرف طلب المبيعات، رقم المراجعة، تاريخ الطلب، تاريخ الاستحقاق، تاريخ الشحن،
الحالة، علامة الطلب عبر الإنترنت، رقم طلب المبيعات، رقم طلب الشراء،
رقم الحساب، معرف العميل، معرف جهة الاتصال، معرف مندوب المبيعات، معرف الإقليم،
معرف BillToAddress، معرف ShipToAddress، معرف ShipMethodID، معرف بطاقة الائتمان،
CreditCardApprovalCode،currencyRateID،SubTotal،TaxAmt،Freight،
TotalDue، تعليق، دليل الصف، تاريخ التعديل
من Sales.SalesOrderHeader
أين (تاريخ الطلب > @OrderDate)
استعلام SQL هذا هو استعلام SELECT بسيط، يستخدم معلمة @OrderDate لتصفية النتائج. سيوفر لنا هذا من إعادة كافة السجلات في قاعدة البيانات. احتفظ بتحديد خانتي الاختيار "ملء DataTable" و"إرجاع DataTable"، ثم انقر فوق "إنهاء". بعد إضافة عبارة SELECT هذه، يجب أن يبدو مصممك الآن مثل لقطة الشاشة، مع استعلام إضافي ضمن SalesOrderHeaderTableAdapter.
بعد إنشاء مجموعة البيانات المكتوبة بقوة، يمكننا بسهولة عرض البيانات في صفحة ASP.NET ببضعة أسطر من التعليمات البرمجية. قم بإنشاء صفحة ASP.NET جديدة في موقع الويب وانتقل إلى وضع التصميم. اسحب عنصر تحكم GridView إليه واترك معرفه كـ GirdView1. ثم انتقل إلى صفحة التعليمات البرمجية المصدر وقم بتقديم مساحة الاسم AdventureWorksTableAdapters أعلى الملف (يستخدم بناء الجملة في c# AdventureWorksTableAdapters;). وأخيرًا، أضف الكود التالي إلى حدث Page_Load:
// قم بإنشاء SalesOrderHeaderTableAdapter
SalesOrderHeaderTableAdapter salesAdapter =
new SalesOrderHeaderTableAdapter();
// احصل على الطلبات التي تمت بعد الأول من يوليو 2004
AdventureWorks.SalesOrderHeaderDataTable Orders =
salesAdapter.GetDataBy(new DateTime(2004, 7, 1));
// ربط نتائج الطلب بـ GridView
this.GridView1.DataSource = Orders;
this.GridView1.DataBind();
الكود بسيط جدا. نقوم بإنشاء مثيل لـ SalesORderHeaderTableAdapter لملء جدول البيانات. ما يجب ملاحظته هنا هو أنه على عكس DataTable العادي، فإننا نعلن عن كائن من النوع SalesORderHeaderDataTable، ونستدعي أسلوب GetDateBy() ونمرر كائن DateTime لملء البيانات. لاحظ أيضًا هنا أن الأمر الذي تم الحصول عليه مكتوب أيضًا بقوة، لذلك يجب علينا تمرير كائن DateTime بدلاً من كائن عادي. لقطة الشاشة أدناه هي نتيجة لمثال التعليمات البرمجية أعلاه.
بالإضافة إلى استخدام التعليمات البرمجية لربط مجموعة النتائج بـ GridView، يمكنك أيضًا استخدام ObjectDataSource، وتعيين خاصية TypeName الخاصة به إلى AdventureWorksTableAdapters.SalesOrderHeaderTableAdapter، وتعيين SelectMethod الخاص به إلى GetData أو GetDataBy.
بالإضافة إلى عدم الاضطرار إلى كتابة تعليمات برمجية للاتصال بقاعدة البيانات، هناك ميزة كبيرة أخرى لاستخدام مجموعة بيانات مكتوبة بقوة وهي عدم وجود سلاسل أسماء أعمدة كامنة في التعليمات البرمجية الخاصة بنا والتي لا يمكن للمترجم التحقق منها. لا نحتاج إلى إجراء أي تحويل للنوع أيضًا. إذا تغير مخطط قاعدة البيانات، فما عليك سوى تحديث ملف AdventureWorks.xsd وسنجد أن جميع التغييرات ذات الصلة تكتمل تلقائيًا في وقت الترجمة.
أساليب أخرى لإنشاء تطبيقات الوصول إلى البيانات المكتوبة بقوة
بالإضافة إلى استخدام مجموعات البيانات المكتوبة بقوة، هناك طرق أخرى لتنفيذ الكتابة القوية في برامجك. يمكنك إنشاء فئات مخصصة أخف وزنًا من DataSets وأكثر اتساقًا مع قاعدة البيانات الخاصة بك. هناك أيضًا بعض مطوري برامج الجهات الخارجية الذين قاموا بتطوير أدوات لأتمتة هذه العملية. واحدة من أكثر البرامج المميزة والمفضلة لدي هي LLBLGen Pro، وقد كتبت ذات مرة كتابًا عنها: Rapid C# Windows Development: Visual Studio 2005، وSQL Server 2005، وLLBLGen Pro. (يمكنك قراءة ثلث الكتاب مجانًا على موقع الويب الخاص بي.) ومن الأدوات الشائعة الأخرى CodeSmith. حتى مايكروسوفت تعمل على تطوير أداة صغيرة تسمى DLINQ، لكنها لا تزال قيد الاختبار ومن المقدر أنه لن يتم إطلاقها حتى العام المقبل على الأقل.
إذا كنت تستخدم نهج مجموعة البيانات القوي في Visual Studio، فإن إحدى المزايا التي لا يمكن إنكارها هي أنك لا تحتاج إلى شراء برامج إضافية. تتمتع كل هذه الحلول بميزات وفوائد مختلفة، ولكن الفوائد الرئيسية هي الموثوقية، وعدد أقل من الأخطاء، ووقت أقل في تصحيح الأخطاء. من الأسهل أيضًا التحقق من تأثير تغييرات مخطط قاعدة البيانات وإجراء الصيانة. نأمل أن تكون قد أدركت فوائد الكتابة القوية. حظا سعيدا في التطوير (والمواعدة أيضا)!
بقلم جوزيف المستشار
المرفقات
قم بتنزيل الكود الذي تم فحصه في هذه المقالة
عن المؤلف
جوزيف تشانسلور هو مطور لغة C# في جنوب كاليفورنيا وقد نال نصيبه العادل من الصدمات المتعلقة بالعلاقات، وهو يقدّر كافة أنواع التعليقات والاقتراحات، قم بزيارة مدونته أو اقرأ الفصول الخمسة الأولى من كتابه عن Visual Studio 2005 وSQL Server 2005.
العنوان الأصلي
LLBLGen: http://aspnet.4guysfromrolla.com/articles/020806-1.aspx.