09-03-13, 09:31 PM
لننشئ العلاقة بين فئة Persons وفئة PhoneNumbers، ولكن قبل ذلك لنعرف ما هي العلاقات.
في بعض الأحيان يكون لشخص ما أكثر من رقم هاتف، قد يملك الشخص ثلاث هواتف أو أربعة أو عشرة، فليس هناك حصر، لهذا لا نستطيع أن نضيف خاصية رقم الهاتف في الفئة Persons، لأنها ببساطه سوف تحمل رقم واحد فقط، فالحل يكون بإضافة جدول جديد يتم تخزين الأرقام فيه، والسؤال الذي يطرح نفسه الآن هو: كيف لنا أن نميز أن هذا الرقم هو لفلان وهذا الرقم لآخر؟! الإجابة هي بإنشاء علاقة بين الجدولين الرئيسي وهو Persons والفرعي وهو PhoneNumbers، من خلال ربط العمود ID الذي يتم توليده تلقائياً كلما أضفنا اسماً جديداً، بالعمود PersonID والذي من نفس النوع Integer، بهذا نكون قد عرفنا أن رقم الهاتف يعود لاسم المستخدم والذي رقمه هو مخزن في حقل PersonID.
لننشئ العلاقة بالتوجه لنافذة الأدوات وتحديد الأداة Association:
ثم النقر مرة على الفئة Persons والتوجه للفئة PhoneNumbers والنقر عليها أيضاً مرةً واحدةً، لنرى هذه النافذة:
نختار من العمود الأول في الجدول من هذه النافذة، عمود ID ومن العمود الثاني نختار عمود PersonID:
ثم موافق ليبدو الجدولين أو الفئتين كما يلي:
الآن نضغط بزر الفأرة الأيمن على مكان فارغ في المصمم ونختار Properties، في خاصية Context Namespace نضع القيمة DB، وفي خاصية Entity Namespace نضع القيمة DB أيضاً، وخاصية Name نجعلها PhoneBookDB، ثم خاصية Connection نختار منها New لتطالعنا هذه النافذة:
نختار منها الأول وهو Microsoft SQL Server، ثم Continue لنرى:
نكتب في الـ Combobox التابع لـ Server name: .\sqlexpress، ثم نختبر الإتصال بالضغط على زر Test Connection، فإن نجح نضغط OK، وإلا نراجع خدمة الـ SQL Server.
الآن وقد انتهينا من قاعدة البيانات، نغلق التبويب الخاص بها ثم نذهب لـ Solution Explorer، ونختار منها Form1 لنفتحه في تبويب التصميم، ننقر عليه نقراً مزدوجاً لنذهب لتبويب الكود داخل حدث التحميل، نعرف متغير عام خارج أي حدث:
سيكون شكل الكود للآن كمان يلي:
إلى الآن لم ننشئ قاعدة البيانات، لعمل ذلك نكتب في حدث التحميل:
اختبرنا ما إذا لم تكن قاعدة البيانات موجود، وعلى ذلك يتم إنشائها أو الخروج من الإجراء. إن حصل خطأ وقد يكون ذلك بسبب أن خدمة SQL Server متوقفة أو أننا لم نكمل خاصية الـ Source للفئات وخصائصها، فإن كانت الأخرى، كما قلنا سيتم إنشاء قاعدة البيانات، ولكن بتجاوز الفئة أو الخاصية التي لم يكتب قيمة لها في الـ Source، فإن أردنا حذف قاعدة البيانات نكتب:
نعمل تشغيل للبرنامج ليتم إنشاء قاعدة البيانات، ثم نعود لفتح فئة محتوى البيانات من Solution Explorer والتي اسميناها PhoneBookDB.dbml، لنربط قاعدة البيانات مع محتوى البيانات، في أي مكان فارغ من المصمم نختار بعد الضغط بزر الفأرة الأيمن Properties، ثم من الخصائص نختار Connection ثم New ثم Microsoft SQL Server ثم Continue وبعد ذلك نكتب في اسم السيرفر .\sqlexpress، ثم نختار قاعدة البيانات من قائمة Select or enter a database name والتي اسميناها PhoneBookDB:
نعود للنموذج بعد أن أتممنا بفضل الله إنشاء قاعدة البيانات وربطها مع الفئة، لنعمل مدير للبرنامج:
هذه جملة التحديد في تقنية Linq وصيغتها كما رأينا، بعد كملة From نكتب اسم متغير يمثل الجدول الذي نكتب اسمه بعد ذلك وهو هنا Users، والشرط إذا كان Admin يساوي True، نقوم بجلب جميع المستخدمين في حال كان المستخدم مدير للبرنامج، فإن كان ينتهي الإجراء وإلا سنعمل مدير افتراضي للبرنامج، لنختبر ذلك:
إذا كان مجموع القيم المحددة من الجدول تساوي 0، فهذا يعني أنه لا يوجد مدير، لعمل مدير للبرنامج نكتب بين فكي جملة الشرط السابقة:
في السطر الأول عرفنا متغير من الفئة Admin، ثم بعد ذلك اسندنا قيم للخصائص المعرفة داخل الفئة، للآن لم يتم حفظ البيانات التي عملناها، لذلك نكمل على الكود السابق:
في السطر الأول استخدمنا الإجراء InsertOnSubmit التابع للخاصية Users وأرسلنا في الوسيطة المتغير الذي عرفناه فوق وهو admin ليتم إدخاله بقاعدة البيانات بعد أن نرسل أمر حفظ التغييرات، وأرسلنا التغييرات لقاعدة البيانات بالسطر:
db.SubmitChanges()
ليتم بذلك حفظ التغييرات. هكذا أنشأنا قاعدة البيانات كمان أنشأنا مدير للبرنامج.
الكود كامل:
في بعض الأحيان يكون لشخص ما أكثر من رقم هاتف، قد يملك الشخص ثلاث هواتف أو أربعة أو عشرة، فليس هناك حصر، لهذا لا نستطيع أن نضيف خاصية رقم الهاتف في الفئة Persons، لأنها ببساطه سوف تحمل رقم واحد فقط، فالحل يكون بإضافة جدول جديد يتم تخزين الأرقام فيه، والسؤال الذي يطرح نفسه الآن هو: كيف لنا أن نميز أن هذا الرقم هو لفلان وهذا الرقم لآخر؟! الإجابة هي بإنشاء علاقة بين الجدولين الرئيسي وهو Persons والفرعي وهو PhoneNumbers، من خلال ربط العمود ID الذي يتم توليده تلقائياً كلما أضفنا اسماً جديداً، بالعمود PersonID والذي من نفس النوع Integer، بهذا نكون قد عرفنا أن رقم الهاتف يعود لاسم المستخدم والذي رقمه هو مخزن في حقل PersonID.
لننشئ العلاقة بالتوجه لنافذة الأدوات وتحديد الأداة Association:
ثم النقر مرة على الفئة Persons والتوجه للفئة PhoneNumbers والنقر عليها أيضاً مرةً واحدةً، لنرى هذه النافذة:
نختار من العمود الأول في الجدول من هذه النافذة، عمود ID ومن العمود الثاني نختار عمود PersonID:
ثم موافق ليبدو الجدولين أو الفئتين كما يلي:
الآن نضغط بزر الفأرة الأيمن على مكان فارغ في المصمم ونختار Properties، في خاصية Context Namespace نضع القيمة DB، وفي خاصية Entity Namespace نضع القيمة DB أيضاً، وخاصية Name نجعلها PhoneBookDB، ثم خاصية Connection نختار منها New لتطالعنا هذه النافذة:
نختار منها الأول وهو Microsoft SQL Server، ثم Continue لنرى:
نكتب في الـ Combobox التابع لـ Server name: .\sqlexpress، ثم نختبر الإتصال بالضغط على زر Test Connection، فإن نجح نضغط OK، وإلا نراجع خدمة الـ SQL Server.
الآن وقد انتهينا من قاعدة البيانات، نغلق التبويب الخاص بها ثم نذهب لـ Solution Explorer، ونختار منها Form1 لنفتحه في تبويب التصميم، ننقر عليه نقراً مزدوجاً لنذهب لتبويب الكود داخل حدث التحميل، نعرف متغير عام خارج أي حدث:
:#C
كود :
[align=left]private DB.PhoneBookDB db = new DB.PhoneBookDB();[/align]:VB
كود :
[align=left]Private db As New DB.PhoneBookDB()[/align]سيكون شكل الكود للآن كمان يلي:
:#C
كود :
[align=left]public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private DB.PhoneBookDB db = new DB.PhoneBookDB();
private void MainForm_Load(object sender, EventArgs e)
{
}
}
[/align]:VB
كود :
[align=left]Public Class MainForm
Private db As New DB.PhoneBookDB()
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
[/align]إلى الآن لم ننشئ قاعدة البيانات، لعمل ذلك نكتب في حدث التحميل:
:#C
كود :
[align=left]if(!db.DatabaseExists())
try
{
db.CreateDatabase();
}
catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
[/align]:VB
كود :
[align=left]If Not db.DatabaseExists() Then
Try
db.CreateDatabase()
Catch ex As Exception
MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
End If[/align]اختبرنا ما إذا لم تكن قاعدة البيانات موجود، وعلى ذلك يتم إنشائها أو الخروج من الإجراء. إن حصل خطأ وقد يكون ذلك بسبب أن خدمة SQL Server متوقفة أو أننا لم نكمل خاصية الـ Source للفئات وخصائصها، فإن كانت الأخرى، كما قلنا سيتم إنشاء قاعدة البيانات، ولكن بتجاوز الفئة أو الخاصية التي لم يكتب قيمة لها في الـ Source، فإن أردنا حذف قاعدة البيانات نكتب:
:#C
كود :
[align=left]db.DeleteDatabase();
[/align]:VB
كود :
[align=left]db.DeleteDatabase()
[/align]نعمل تشغيل للبرنامج ليتم إنشاء قاعدة البيانات، ثم نعود لفتح فئة محتوى البيانات من Solution Explorer والتي اسميناها PhoneBookDB.dbml، لنربط قاعدة البيانات مع محتوى البيانات، في أي مكان فارغ من المصمم نختار بعد الضغط بزر الفأرة الأيمن Properties، ثم من الخصائص نختار Connection ثم New ثم Microsoft SQL Server ثم Continue وبعد ذلك نكتب في اسم السيرفر .\sqlexpress، ثم نختار قاعدة البيانات من قائمة Select or enter a database name والتي اسميناها PhoneBookDB:
نعود للنموذج بعد أن أتممنا بفضل الله إنشاء قاعدة البيانات وربطها مع الفئة، لنعمل مدير للبرنامج:
:#C
كود :
[align=left]var users = from d in db.Users
where d.Admin
select d;
[/align]:VB
كود :
[align=left]Dim users = From d In db.Users
Where d.Admin
Select d
[/align]هذه جملة التحديد في تقنية Linq وصيغتها كما رأينا، بعد كملة From نكتب اسم متغير يمثل الجدول الذي نكتب اسمه بعد ذلك وهو هنا Users، والشرط إذا كان Admin يساوي True، نقوم بجلب جميع المستخدمين في حال كان المستخدم مدير للبرنامج، فإن كان ينتهي الإجراء وإلا سنعمل مدير افتراضي للبرنامج، لنختبر ذلك:
:#C
كود :
[align=left]if (users.Count() == 0)
[/align]:VB
كود :
[align=left]If users.Count() = 0 Then
End If
[/align]إذا كان مجموع القيم المحددة من الجدول تساوي 0، فهذا يعني أنه لا يوجد مدير، لعمل مدير للبرنامج نكتب بين فكي جملة الشرط السابقة:
:#C
كود :
[align=left]DB.Users admin = new DB.Users();
admin.Username = "Admin";
admin.Password = "Admin";
admin.Admin = true;
admin.Active = true;[/align] :VB
كود :
[align=left]Dim admin As New DB.Users
admin.Username = "Admin"
admin.Password = "Admin"
admin.Admin = True
admin.Active = True
[/align]في السطر الأول عرفنا متغير من الفئة Admin، ثم بعد ذلك اسندنا قيم للخصائص المعرفة داخل الفئة، للآن لم يتم حفظ البيانات التي عملناها، لذلك نكمل على الكود السابق:
:#C
كود :
[align=left]db.Users.InsertOnSubmit(admin);
db.SubmitChanges();
[/align]:VB
كود :
[align=left]db.Users.InsertOnSubmit(admin)
db.SubmitChanges()
[/align]في السطر الأول استخدمنا الإجراء InsertOnSubmit التابع للخاصية Users وأرسلنا في الوسيطة المتغير الذي عرفناه فوق وهو admin ليتم إدخاله بقاعدة البيانات بعد أن نرسل أمر حفظ التغييرات، وأرسلنا التغييرات لقاعدة البيانات بالسطر:
db.SubmitChanges()
ليتم بذلك حفظ التغييرات. هكذا أنشأنا قاعدة البيانات كمان أنشأنا مدير للبرنامج.
الكود كامل:
:#C
كود :
[align=left]public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private DB.PhoneBookDB db = new DB.PhoneBookDB();
private void MainForm_Load(object sender, EventArgs e)
{
if(!db.DatabaseExists())
try
{
db.CreateDatabase();
}
catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
try
{
var users = from d in db.Users
where d.Admin
select d;
if (users.Count() == 0)
{
DB.Users admin = new DB.Users();
admin.Username = "Admin";
admin.Password = "Admin";
admin.Admin = true;
admin.Active = true;
db.Users.InsertOnSubmit(admin);
db.SubmitChanges();
}
}
catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); }
}
}
[/align]:VB
كود :
[align=left]Public Class MainForm
Private db As New DB.PhoneBookDB()
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not db.DatabaseExists() Then
Try
db.CreateDatabase()
Catch ex As Exception
MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
End If
Try
Dim users = From d In db.Users
Where d.Admin
Select d
If users.Count() = 0 Then
Dim admin As New DB.Users
admin.Username = "Admin"
admin.Password = "Admin"
admin.Admin = True
admin.Active = True
db.Users.InsertOnSubmit(admin)
db.SubmitChanges()
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
End Class
[/align]