السلام عليكم و رحمة الله و بركاته ..
في هذا الموضوع سوف أقوم بشرح كيفية عرض السجلات و تحديثها في قاعدة البيانات عن طريق المكون LINQTOSQL الموجود في الإصدار .NetFrameWork 3.5 فما أعلى، حيث أني وجدت ان هذه الطريقة أسهل نسبياً من التعامل مع DataSet و DataTable و باقي عناصر ADO.Net ..
ما هو LINQTOSQL؟
هو مكون جديد من مكونات .NetFrameWork 3.5. و هو ضمن تكنولوجيا ORM (Oriental Relation Mapping) التي تختلف عن ODBC حيث أن الأخيرة هي خدمة تقوم أنت من خلالها بإنشاء إتصال مع قاعدة البيانات و جلب البيانات المطلوبة أو تعديلها أو حذفها بإستخدام مكونات تكنولوجيا ADO.Net التي تتيح لك التعامل مع قاعدة بياناتك من خلال أوامر SQL التي تكتبها في برنامجك بلغة .Net .
أما LINQToSQL فهي كما قلنا تقنية تخضع لORM، و هي خدمة تتيح لك عرض قاعدة البيانات كـcontext object و الجداول كـClasses و اذا كان هناك StoredProcedures في قاعدة بياناتك فيمكن عرضها كـMethods، و بعد ذلك تتعامل مع هذه Classes من خلال تقنية LINQ لإستخلاص البيانات التي تريدها.
إذاً LINQTOSQL تعني تحويل الجداول و الإجراءات المخزنة في قاعدة بياناتك لClasses و التعامل مع هذه Classes يكون من خلال LINQ عوضاً عن أوامر SQL، و هذا يعني أننا لن نستخدم تقنية ADO.NET.
و لكن مع ذلك فتقنية ADO.NET موجودة و لكن في الخفاء حيث أن تنفيذ الإستعلام او التعديل معناه الذهاب لقاعدة البيانات الحقيقية، و هذا يحتاج لـADO.NET و لكن كما قلنا أنت لن تتعامل معها. و الصورة التالية توضح العلاقة بين LINQTOSQL و ADO.NET و قاعدة بيانات SQLSERVER :
[ملحوظة: هذه التقنية تعمل فقط مع قواعد بيانات MS SQLSERVER]
لتجربة هذه التقنية الرائعة سنقوم بعمل مشروع صغير. في هذا المشروع سنضيف عناصر قاعدة البيانات كـCLASSES ثم نربط COMBOBOX و DATAGRIDVIEW بهذه الCLASSES من خلال LINQ.
1- في البداية نقوم بإنشاء قاعدة بيانات SQLSERVER بإسم InterCompanyDB. ستكون قاعدة بياناتنا بهذه الشكل:
2- نقوم بإنشاء مشروع Windows Forms جديد و نسميه LinqToSqlApplication.
3- نضيف المكون LINQTOSQL للمشروع عن طريق الضغط بالزر الأيمن للفارة على المشروع في الجزء Solution Explorer ثم إختيار Add ثم New Item، ثم من القسم Data نختار LINQ to SQL classes و سمّه InterClasses.
4- سيضيف فيجوال ستوديو الملف InterClases.dbml و بداخله ملفان فرعيان هما: InterClases.layout.dbml و InterClases.designer.cs، الملف الأول هو ملف model لـClasses (الجداول)، و الملف الثاني هو الكلاسات الفعلية بخصائصها و وظائفها.( لاحظ أن الأكواد لن تنشأ إلا بعد تنفيذ الخطوتين القادمتين).
5- سينشئ فيجوال ستوديو شاشة خالية بها قسمان خاليان. قم بإنشاء إتصال مع قاعدة البيانات التي أنشأتها، من خلال الجزء Server Explorer بالطريقة المعتادة لتظهر لك الجداول و الإجراءات المخزنة.
6- قم بسحب و إلقاءها الجداول في المساحة الخالية و إذا كان هنا إجراءات مخزنة فقم بسحبها و إلقائها في الجزء الأيمن من الشاشة الخالية. كما في الصورة التالية:
قم بفتح الملف InterClases.designer.cs، و إنظر إلى الكود داخله، ستجد الجداول قد مُثلت بـClasses :
فلننظر لـClass InterClassesDataContext و نتفحص جزء من محتوياته:
#region Extensibility Method Definitions
partial void OnCreated();
partial void InsertCompanies_Table(Companies_Table instance);
partial void UpdateCompanies_Table(Companies_Table instance);
partial void DeleteCompanies_Table(Companies_Table instance);
partial void InsertPorts_Table(Ports_Table instance);
partial void UpdatePorts_Table(Ports_Table instance);
partial void DeletePorts_Table(Ports_Table instance);
partial void InsertVoyages_Table(Voyages_Table instance);
partial void UpdateVoyages_Table(Voyages_Table instance);
partial void DeleteVoyages_Table(Voyages_Table instance);
partial void InsertVoyageType_Table(VoyageType_Table instance);
partial void UpdateVoyageType_Table(VoyageType_Table instance);
partial void DeleteVoyageType_Table(VoyageType_Table instance);
#endregion
public InterClassesDataContext() :
base(global::LinqToSqlApplication.Properties.Settings.Default.InterCompany_DBConnectionString, mappingSource)
{
OnCreated();
}
public InterClassesDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
public InterClassesDataContext(System.Data.IDbConnection connection) :
base(connection, mappingSource)
{
OnCreated();
}
\\\المزيد من Constructors
\\\\الخصائص:
public System.Data.Linq.Table<Companies_Table> Companies_Tables
{
get
{
return this.GetTable<Companies_Table>();
}
}
public System.Data.Linq.Table<Ports_Table> Ports_Tables
{
get
{
return this.GetTable<Ports_Table>();
}
}
public System.Data.Linq.Table<Voyages_Table> Voyages_Tables
{
get
{
return this.GetTable<Voyages_Table>();
}
}
public System.Data.Linq.Table<VoyageType_Table> VoyageType_Tables
{
get
{
return this.GetTable<VoyageType_Table>();
}
}هل رأيت الخصائص؟ إن قيمتها تساوي جدول.. مثلاً الخاصية Voyages_Tables هي من النوع العام System.Data.Linq.Table الذي يستقبل نوع محدد هو Voyages_Table
سوف أكمل في وقت لاحق إن شاء الله..في المرة القادمة سنقوم بإستخدام LINQ لإستخلاص البيانات و ربط ComboBox و DataGridView بـClasses التي تمثل الجداول ثم إضافة سجلات جديدة أو تعديلها او حذفها.
