7. دراسة حالة مع Firebird 2.1
7.1. تثبيت الأدوات
الأدوات المطلوب تثبيتها هي التالية:
- SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/]؛
- أداة إدارة: EMS SQL Manager for InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].
في الأمثلة التالية، المستخدم هو sysdba وكلمة المرور هي masterkey.
لنقم بتشغيل Firebird ثم أداة [SQL Manager Lite for Firebird] التي سنستخدمها لإدارة SGBD.
![]() |
- في [1]، نقوم بتشغيل Firebird SGBD من قائمة "ابدأ". هنا، لم يتم تثبيت SGBD كخدمة Windows؛
- في [2]، يتم تشغيل الخدمة. تم تثبيت أيقونة في أسفل يمين الشاشة. بالنقر بزر الماوس الأيمن عليها، يمكن إيقاف SGBD.
نقوم الآن بتشغيل الأداة [SQL Manager Lite for Firebird] التي سنستخدمها لإدارة SGBD [3].
![]() |
- في [4]، نقوم بإنشاء قاعدة جديدة؛
- في [5]، نقبل؛
![]() |
- في [5]، نقوم بتسجيل الدخول باسم SYSDBA / masterkey؛
- في [6]، نحدد موقع الملف الذي سيتم إنشاؤه. في الواقع، سيتم إنشاء قاعدة البيانات في ملف واحد؛
- في [7]، يتم تأكيد الأمر SQL الذي سيتم تنفيذه؛
![]() |
- في [8]، تم إنشاء قاعدة البيانات. يجب الآن تسجيلها في [EMS Manager]. المعلومات صحيحة. نقوم بتنفيذ [OK]؛
- في [9]، نقوم بالاتصال بها؛
- في [10]، يعرض [EMS Manager] قاعدة البيانات، وهي فارغة في الوقت الحالي.
سنقوم الآن بربط مشروع VS 2012 بهذه القاعدة.
7.2. إنشاء قاعدة البيانات من الكيانات
نبدأ بنسخ مجلد مشروع [RdvMedecins-SqlServer-01] في [RdvMedecins-Firebird-01] [1]:
![]() |
- إلى [2]، وفي VS 2012، نحذف المشروع [RdvMedecins-SqlServer-01] من الحل؛
![]() |
- في [3]، تم حذف المشروع؛
- في [4]، نضيف مشروعًا آخر. يتم أخذ هذا المشروع من المجلد [RdvMedecins-Firebird-01] الذي أنشأناه سابقًا؛
![]() |
- في [5]، يُسمى المشروع الذي تم تحميله [RdvMedecins-SqlServer-01]؛
- في [6]، نغير اسمه إلى [RdvMedecins-Firebird-01]
![]() |
- في [7]، نضيف مشروعًا آخر إلى الحل. يتم أخذ هذا المشروع من المجلد [RdvMedecins-SqlServer-01] الخاص بالمشروع الذي قمنا بحذفه من الحل سابقًا؛
- في [8]، أعيد إدراج المشروع [RdvMedecins-SqlServer-01] في الحل.
المشروع [RdvMedecins-Firebird-01] مطابق للمشروع [RdvMedecins-SqlServer-01]. علينا إجراء بعض التعديلات. في [App.config]، سنقوم بتعديل سلسلة الاتصال و [DbProviderFactory] الذي يجب تكييفه مع كل SGBD.
<!-- سلسلة الاتصال بالقاعدة -->
<connectionStrings>
<add name="monContexte" connectionString="User=SYSDBA;Password=masterkey;Database=D:\data\istia-1213\c#\dvp\Entity Framework\databases\firebird\RDVMEDECINS-EF.GDB;DataSource=localhost;
Port=3050;Dialect=3;Charset=NONE;Role=;Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;" providerName="FirebirdSql.Data.FirebirdClient" />
</connectionStrings>
<!-- مزود المصنع -->
<system.data>
<DbProviderFactories>
<add name="Firebird Client Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".Net Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.7.7.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c" />
</DbProviderFactories>
</system.data>
- السطر 3: اسم المستخدم وكلمة المرور، بالإضافة إلى المسار الكامل لقاعدة بيانات Firebird؛
- الأسطر 8-10: DbProviderFactory. تشير السطر 9 إلى DLL [FirebirdSql.Data.FirebirdClient] الذي لا نملكه. يمكن الحصول عليها باستخدام NuGet [1]:
![]() |
- في [2]، في منطقة البحث نكتب الكلمة الرئيسية firebird؛
- في [3]، اختر الحزمة [Firebird ADO.NET Data Provider]. إنه موصل ADO.NET لـ Firebird؛
![]() |
- في [4]، المرجع الجديد؛
- في [5]، في [App.config]، يجب وضع الإصدار الصحيح من DLL. يمكن العثور عليه في خصائصه.
في الملف [Entites.cs]، يجب تعديل مخطط الجداول التي سيتم إنشاؤها:
[Table("MEDECINS")]
public class Medecin : Personne
{...}
[Table("CLIENTS")]
public class Client : Personne
{...}
[Table("CRENEAUX")]
public class Creneau
{...}
[Table("RVS")]
public class Rv
{...}
هنا، لا تحتوي الجداول على مخطط.
نقوم بتكوين تنفيذ المشروع:
![]() |
- في [1]، نمنح اسمًا آخر للتجميع الذي سيتم إنشاؤه؛
- في [2]، نحدد مساحة أسماء افتراضية أخرى؛
- في [3]، نحدد البرنامج المراد تنفيذه.
في هذه المرحلة، لا توجد أخطاء في الترجمة. لنقم بتشغيل البرنامج [CreateDB_01]. نحصل على الاستثناء التالي:
نتذكر أننا واجهنا نفس الخطأ مع MySQL و Oracle و PostgreSQL. ويرتبط هذا بنوع حقل Timestamp في الكيانات. نقوم بإجراء نفس التعديل الذي أجريناه مع SGBD السابقين. في الكيانات، نستبدل الأسطر الثلاثة
[Column("TIMESTAMP")]
[Timestamp]
public byte[] Timestamp { get; set; }
بالأسطر التالية:
[ConcurrencyCheck]
[Column("VERSIONING")]
public int? Versioning { get; set; }
لذلك نقوم بتغيير نوع العمود من byte[] إلى int?. في SGBD، سنستخدم إجراءات مخزنة لزيادة هذا العدد الصحيح بمقدار وحدة واحدة في كل مرة يتم فيها إدراج أو تعديل سطر.
نقوم بإجراء التعديل السابق على الكيانات الأربعة ثم نعيد تشغيل التطبيق. عندها نحصل على الخطأ التالي:
تشير السطر 1 إلى أن قاعدة البيانات مستخدمة. لم يكن هذا هو الحال على ما أعتقد ولم أتمكن من حل هذه المشكلة.
لا يهم. سنقوم بإنشاء قاعدة البيانات [RDVMEDECINS-EF] يدويًا باستخدام الأداة [EMS Manager for Firebird]. لن نصف جميع الخطوات، بل سنكتفي بذكر أهمها فقط.
ستكون قاعدة بيانات Firebird كما يلي:
الجداول
![]() |
- في [1]، ID هو مفتاح أساسي مع السمة Autoincrement. سيتم إنشاؤه تلقائيًا بواسطة SGBD؛
![]() |
![]() |
![]() |
تحتوي الجداول المختلفة على المفاتيح الأساسية والأجنبية التي كانت موجودة في هذه الجداول نفسها في الأمثلة السابقة. تحتوي المفاتيح الأجنبية على السمة ON DELETE CASCADE.
المولدات
كما هو الحال مع Oracle و PostgreSQL، قمنا بإنشاء مولدات للأرقام المتتالية. يوجد 5 منها [1].
![]() سيتم استخدام |
- سيتم استخدام [CLIENTS_ID_GEN] لتوليد المفتاح الأساسي للجدول [CLIENTS]؛
- سيتم استخدام [MEDECINS_ID_GEN] لتوليد المفتاح الأساسي للجدول [MEDECINS]؛
- سيتم استخدام [CRENEAUX_ID_GEN] لتوليد المفتاح الأساسي للجدول [CRENEAUX]؛
- سيتم استخدام [RVS_ID_GEN] لتوليد المفتاح الأساسي للجدول [RVS]؛
- سيتم استخدام [VERSIONS_GEN] لتوليد قيم أعمدة [VERSIONING] لجميع الجداول.
المشغلات
المشغل هو إجراء يتم تنفيذه بواسطة SGBD قبل أو بعد حدث (إدراج، تعديل، حذف) في جدول. لدينا 8 مشغلات [1]:
![]() |
لنلقِ نظرة على كود DDL للمشغل [BI_CLIENTS_ID] الذي يغذي العمود [ID] في الجدول [CLIENTS]:
- السطر 2: قبل كل إدراج في الجدول [CLIENTS]؛
- السطران 6-7: إذا كان العمود ID هو NULL، فسيتم تعيين القيمة التالية من مولد الأرقام [CLIENTS_ID_GEN] له.
يتم إنشاء جميع المشغلات [ BI_CLIENTS_ID, BI_MEDECINS_ID, BI_CRENEAUX_ID, BI_RVS_ID] بنفس الطريقة.
لنلقِ نظرة الآن على الرمز DDL للمشغل [CLIENTS_VERSION_TRIGGER] الذي يغذي العمود [VERSIONING] في الجدول [CLIENTS]:
- الأسطر 1-3: قبل كل عملية INSERT أو UPDATE على الجدول [CLIENTS]؛
- السطر 6: يتلقى العمود ["VERSIONING"] القيمة التالية من مولد الأرقام [VERSIONS_GEN]. يغذي هذا المولد الأعمدة ["VERSIONING"] في الجداول الأربعة.
المشغلات [MEDECINS_VERSION_TRIGGER, CRENEAUX_VERSION_TRIGGER, RVS_VERSION_TRIGGER] مماثلة.
تم وضع البرنامج النصي لإنشاء جداول قاعدة بيانات Firebird [RDVMEDECINS-EF] في المجلد [RdvMedecins / databases / Firebird]. يمكن للقارئ تحميله وتشغيله لإنشاء جداوله.
وبعد ذلك، يمكن تشغيل البرامج المختلفة للمشروع. وهي تعطي نفس النتائج التي تعطيها مع خادم SQL باستثناء البرنامج [ModifyDetachedEntities] الذي يتعطل لنفس السبب الذي تسبب في تعطله مع Oracle و MySQL. يتم حل المشكلة بنفس الطريقة. يكفي نسخ البرنامج [ModifyDetachedEntities] من المشروع [RdvMedecins-Oracle-01] إلى المشروع [RdvMedecins-Firebird-01].
7.3. بنية متعددة الطبقات تعتمد على EF 5
نعود إلى دراسة الحالة الموضحة في الفقرة 2.
![]() |
سنبدأ ببناء طبقة [DAO] للوصول إلى البيانات. للقيام بذلك، نقوم بنسخ مشروع وحدة التحكم VS 2012 [RdvMedecins-SqlServer-02] في [RdvMedecins-Firebird-02] [1]:
![]() |
- إلى [2]، ونحذف المشروع [RdvMedecins-SqlServer-02]؛
![]() |
- في [3]، نضيف مشروعًا موجودًا إلى الحل. نأخذه من المجلد [RdvMedecins-Firebird-02] الذي تم إنشاؤه للتو؛
- في [4]، يحمل المشروع الجديد اسم المشروع الذي تم حذفه. سنقوم بتغيير اسمه؛
![]() |
- في [5]، قمنا بتغيير اسم المشروع؛
- في [6]، نقوم بتعديل بعض خصائصه، مثل اسم التجميع هنا؛
- إلى [7]، تم حذف المجلد [Models] ليتم استبداله بالمجلد [Models] من المشروع [RdvMedecins-Firebird-01]. في الواقع، يشترك المشروعان في نفس القوالب.
![]() |
- في [8]، المراجع الحالية للمشروع؛
- في [9]، تمت إضافة موصل Firebird ADO.NET باستخدام الأداة NuGet.
في الملف [App.config]، يتم استبدال معلومات قاعدة بيانات SQL Server بمعلومات قاعدة بيانات Firebird. يمكن العثور عليها في الملف [App.config] الخاص بالمشروع [RdvMedecins-Firebird-01]:
<!-- سلسلة الاتصال بقاعدة البيانات -->
<connectionStrings>
<add name="monContexte" connectionString="User=SYSDBA;Password=masterkey;Database=D:\data\istia-1213\c#\dvp\Entity Framework\databases\firebird\RDVMEDECINS-EF.GDB;DataSource=localhost;
Port=3050;Dialect=3;Charset=NONE;Role=;Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;" providerName="FirebirdSql.Data.FirebirdClient" />
</connectionStrings>
<!-- مزود المصنع -->
<system.data>
<DbProviderFactories>
<add name="Firebird Client Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".Net Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.7.7.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c" />
</DbProviderFactories>
</system.data>
تتغير أيضًا الكائنات التي يديرها Spring. حاليًا لدينا:
<!-- تكوين Spring -->
<spring>
<context>
<resource uri="config://spring/objects" />
</context>
<objects xmlns="http://www.springframework.net">
<object id="rdvmedecinsDao" type="RdvMedecins.Dao.Dao,RdvMedecins-SqlServer-02" />
</objects>
</spring>
تشير السطر 7 إلى تجميع المشروع [RdvMedecins-SqlServer-02]. أصبح التجميع الآن [RdvMedecins-Firebird-02].
وبعد ذلك، نكون جاهزين لتنفيذ اختبار الطبقة [DAO]. يجب أولاً الحرص على ملء قاعدة البيانات (البرنامج [Fill] للمشروع [RdvMedecins-Firebird-01]). ينجح برنامج الاختبار.
نقوم بإنشاء DLL للمشروع كما تم بالنسبة لمشروع [RdvMedecins-SqlServer-02] ونجمعجميع ملفات DLL الخاصة بالمشروع في مجلد [lib] تم إنشاؤه في [RdvMedecins-Firebird-02]. وستكون هذه هي مراجع مشروع الويب [RdvMedecins-Firebird-03] الذي سيلي.
![]() |
نحن الآن جاهزون لبناء الطبقة [ASP.NET] لتطبيقنا:
![]() |
سنبدأ من المشروع [RdvMedecins-SqlServer-03]. نقوم بنسخ مجلد هذا المشروع في [RdvMedecins-Firebird-03] [1]:
![]() |
- في [2]، باستخدام VS 2012 Express للويب، نفتح حل المجلد [RdvMedecins-Firebird-03]؛
- في [3]، نقوم بتغيير اسم الحل واسم المشروع؛
![]() |
- في [4]، المراجع الحالية للمشروع؛
- في [5]، نقوم بحذفها؛
- إلى [6]، لاستبدالها بمراجع إلى DLL التي قمنا بتخزينها للتو في مجلد [lib] التابع للمشروع [RdvMedecins-Firebird-02].
لم يتبق لنا سوى تعديل الملف [Web.config]. نستبدل محتواه الحالي بمحتوى الملف [App.config] من المشروع [RdvMedecins-Firebird-02]. بعد ذلك، نقوم بتشغيل المشروع على الويب. إنه يعمل. ولا ننسى ملء قاعدة البيانات قبل تشغيل تطبيق الويب.

























