برنامج دليل هاتف Phone Book – C# & VB.NET

برنامج دليل هاتف Phone Book – C# & VB.NET


سنقوم بتصميم برنامج دليل هاتف بسيط بواسطة لغة C# و  VB.NET وقاعدة بيانات من Sql Server .. خطوات العمل:

  تصميم قاعدة البيانات:

قاعدة البيانات تتألف من جدول واحد و خمس أعمدة (حقول)  بالشكل التالي:


  كتابة كود الاتصال مع قاعدة البيانات:

اولاً يجب استدعاء المكتبات اللازمة للتعامل مع قواعد البيانات:
using System.Data;
using System.Data.SqlClient;
Imports System.Data
Imports System.Data.SqlClient
بعد ذلك يجب التصريح عن المتحولات والكائنات التالية والتي هي بالترتيب:
  1. الكائن con من الفئة SqlConnection وهو للاتصال بقاعدة البيانات.
  2. الكائن da من الفئة SqlDataAdapter وهو الكائن الذي يقوم بدور الوسيط بين قاعدة البيانات وبرنامجنا وبواسطته يتم الاتصال مع قاعدة البيانات. للمزيد من المعلومات الفئة SqlDataAdapter
  3. الكائن ds من الفئة DataSet وهو قاعدة بيانات وهمية نقوم بملئها بالبيانات الموجودة في قاعدة البيانات من أجل سهولة التعامل مع  السجلات  في البرنامج. للمزيد من المعلومات الفئة DataSet
للمزيد من التفاصيل حول هذه الكائنات السابقة راجع الدرس: التعامل مع قواعد البيانات في الدوت نت ADO.NET
SqlConnection con;
SqlDataAdapter da;
DataSet ds = new DataSet();
Private con As SqlConnection
Private da As SqlDataAdapter
Private ds As New DataSet()
  كتابة نص الاتصال مع قاعدة البيانات:
string conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath +
           @"\dbProg.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
Private conStr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=" & Application.StartupPath & _
                                   "\dbProg.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
                                                                                         
ملاحظة: المتحولات والكائنات السابقة يجب كتابتها بحيث تصبح عامة أي تكتب بعد السطر التالي:
public partial class Form1 : Form
Partial Public Class Form1

الان نقوم بإنشاء إجراء اسمه LoadData يتم فيه تجهيز الكائنات السابقة وتحضيرها للعمل , حيث نقوم اولاً بإنشاء كائن الاتصال con مع تمرير نص الاتصال conStr.
ثم يتم تفريغ قاعدة البيانات ds من البيانات ( طبعاً للمرة الاولى لن يكون هناك بيانات ولكن بعد الاضافة والتعديل سيصبح هناك بيانات ).
con = new SqlConnection(conStr);
ds.Clear();
da = new SqlDataAdapter("SELECT * FROM tbInfo", con);
con = New SqlConnection(conStr)
ds.Clear()
da = New SqlDataAdapter("SELECT * FROM tbInfo", con)

بعد ذلك نقوم بفتح الاتصال ثم نستخدم الكائن da لجلب السجلات من قاعدة البيانات ووضعها في قاعدة البيانات الوهمية ds مع تمرير اسم الجدول tbInfo طبعاً ,, اخيراً لا ننسى إغلاق الاتصال وبذلك ينتهي الاجراء LoadData:
con.Open();
da.Fill(ds, "tbInfo");
con.Close();
con.Open()
da.Fill(ds, "tbInfo")
con.Close()
  الحدث Form_Load للنافذة الرئيسية:

أولاً نستدعي الاجراء السابق LoadData الذي كما ذكرنا يقوم بتجهيز الكائنات وملئ قاعدة البيانات بالسجلات:
LoadData();

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

استخدام الخاصية DataBindings سهل فقط نحتاج إلى تمرير اسم الخاصية (التابعة للأدة) التي سيتم فيها عرض قيمة العمود , طبعاً أداة Label تعرض البيانات في الخاصية Text. ثم تمرير قاعدة البيانات ds , وأخيراً تحديد الجدول والعمود الذي يحوي البيانات المطلوبة.
lblID.DataBindings.Add("Text", ds, "tbInfo.id");
lblName.DataBindings.Add("Text", ds, "tbInfo.Name");
lblPhone.DataBindings.Add("Text", ds, "tbInfo.Telephone");
lblMobile.DataBindings.Add("Text", ds, "tbInfo.Mobile");
lblEmail.DataBindings.Add("Text", ds, "tbInfo.Email");
lblID.DataBindings.Add("Text", ds, "tbInfo.id")
lblName.DataBindings.Add("Text", ds, "tbInfo.Name")
lblPhone.DataBindings.Add("Text", ds, "tbInfo.Telephone")
lblMobile.DataBindings.Add("Text", ds, "tbInfo.Mobile")
lblEmail.DataBindings.Add("Text", ds, "tbInfo.Email")

أخيراً استدعاء الإجراء الذ يظهر رقم السجل الحالي وعدد السجلات الكلية:
getCurrentPosition();
  الإجراء getCurrentPosition:
lblCurRecord.Text = Convert.ToString(Me.BindingContext(ds, "tbInfo").Position + 1)
lblCurRecord.Text &= " من أصل "
lblCurRecord.Text &= Convert.ToString(Me.BindingContext(ds, "tbInfo").Count)
lblCurRecord.Text = Convert.ToString(this.BindingContext[ds, "tbInfo"].Position + 1);
lblCurRecord.Text += " من أصل ";
lblCurRecord.Text += Convert.ToString(this.BindingContext[ds, "tbInfo"].Count);

لجلب عدد السجلات والسجل الحالي الذي نستعرضه , نستخدم الخاصية BindingContext التابعة للفورم والتي تعطينا معلومات عن قاعدة البيانات بعد ان نمرر لها (قاعدة البيانات ds , واسم الجدول). 
 
  كتابة الكود لازرار التنقل بين السجلات:
this.BindingContext[ds, "tbInfo"].Position -= 1;
this.BindingContext[ds, "tbInfo"].Position += 1;
this.BindingContext[ds, "tbInfo"].Position = 0;
this.BindingContext[ds, "tbInfo"].Position = this.BindingContext[ds, "tbInfo"].Count - 1;
Me.BindingContext(ds, "tbInfo").Position -= 1
Me.BindingContext(ds, "tbInfo").Position += 1
Me.BindingContext(ds, "tbInfo").Position = 0
Me.BindingContext(ds, "tbInfo").Position = Me.BindingContext(ds, "tbInfo").Count - 1

الكودات هي بالترتيب للأزرار ( السابق – التالي – الأول – الأخير).

أيضاً نستخدم الخاصية BindingContext للتحكم بالسجل الذي سيتم عرضه عن طريق الخاصة Position حيث نقوم بإعطائها القيمة صفر للحصول على السجل الاول حيث ان العد يبدأ من الصفر وللحصول على السجل الاخير نعطيها القيمة Count – 1 اي عدد السجلات الكلية – 1.

  كود زر الإضافة في الفورم الرئيسية Main Form:



الزر إضافة يقوم بعرض فورم جديد لإدخال البيانات ,, كما يلي:
frmAdd frm = new frmAdd();
frm.ShowDialog();
frmAdd frm = New frmAdd()
frm.ShowDialog()
  كود الزر إضافة في الفورم FrmAdd:

أولاً نقوم بعمل فحص على الحقول المطلوبة وهي حقل الاسم والهاتف كي نتأكد من ان المستخدم ادخل قيمة فيها:
if (txtName.Text.Trim().Length == 0)
{
    MessageBox.Show("من فضلك ادخل الاسم", "خطأ");
    txtName.Focus();
    return;
}
if (txtPhone.Text.Trim().Length == 0)
{
    MessageBox.Show("من فضلك ادخل رقم الهاتف", "خطأ");
    txtPhone.Focus();
    return;
}
If txtName.Text.Trim().Length = 0 Then
    MessageBox.Show("من فضلك ادخل الاسم", "خطأ")
    txtName.Focus()
    Exit Sub
End If
If txtPhone.Text.Trim().Length = 0 Then
    MessageBox.Show("من فضلك ادخل رقم الهاتف", "خطأ")
    txtPhone.Focus()
    Exit Sub
End If

ثم نقوم بالتصريح عن كائن الاتصال SqlConnection كما تعلمنا في بداية الدرس, ثم نصرح عن نص الاتصال conStr:
Dim con As SqlConnection
Dim conStr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=" & Application.StartupPath & _
                                  "\dbProg.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
SqlConnection con;
string conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath +
                      @"\dbProg.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

الان نبدأ مرحلة التعامل مع قاعدة البيانات حيث سنقوم بإنشاء الاتصال ثم فتحه:
con = new SqlConnection(conStr);
con.Open();
con = New SqlConnection(conStr)
con.Open()

بعد فتح الاتصال مع قاعدة البيانات يجب ان نصرح عن الكائن الذي سنفذ الاستعلام الذي سيقوم بإضافة السجل الجديد إلى قاعدة البيانات:
string addCmd = "INSERT INTO tbInfo (Name,Telephone,Mobile,Email) VALUES " +
  "(@Name,@Phone,@Mobile,@Email)";
SqlCommand cmd = new SqlCommand(addCmd, con);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Name", txtName.Text.Trim());
cmd.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
Dim addCmd As String = "INSERT INTO tbInfo (Name,Telephone,Mobile,Email) VALUES " & _
                                     "(@Name,@Phone,@Mobile,@Email)"
Dim cmd As New SqlCommand(addCmd, con)
cmd.Parameters.Clear()
cmd.Parameters.AddWithValue("@Name", txtName.Text.Trim())
cmd.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim())
cmd.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim())
cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim())

طبعاً قمنا بتمرير قيم جملة الإستعلام عن طريق البارمترات (@Name,@Phone,....) ثم قمنا بالتصريح عن البارمترات وإضافة قيمة كل واحد منها.

الآن بقي إعطاء الامر بتنفيذ الاستعلام ثم إغلاق الاتصال كما تعلمنا:
cmd.ExecuteNonQuery();
con.Close();
cmd.ExecuteNonQuery()
con.Close()
  كود زر التعديل في الفورم الرئيسية Main Form:

الزر تعديل يقوم بعرض فورم جديد لتعديل بيانات السجل بعد ان نمرر قيم السجل إلى الفورم الجديد ,, كما يلي:
frmEdit frm = new frmEdit();
frm.Controls["lblID"].Text = lblID.Text;
frm.Controls["txtName"].Text = lblName.Text;
frm.Controls["txtPhone"].Text = lblPhone.Text;
frm.Controls["txtMobile"].Text = lblMobile.Text;
frm.Controls["txtEmail"].Text = lblEmail.Text;
frm.ShowDialog();
Dim frm As New frmEdit()
frm.Controls("lblID").Text = lblID.Text
frm.Controls("txtName").Text = lblName.Text
frm.Controls("txtPhone").Text = lblPhone.Text
frm.Controls("txtMobile").Text = lblMobile.Text
frm.Controls("txtEmail").Text = lblEmail.Text
frm.ShowDialog()

بعد ان ننشىء نسخة من الفورم نقوم بتمرير قيم السجل الحالي إلى الفورم الجديد لتعديلها, وذلك عن طريق الخاصية Controls والتي هي مصفوفة تحوي الأدوات Controls الموجودة على الفورم الجديد FrmEdit حيث نقوم بتحديد الأداة التي نريد تعديل خصائصها عن طريق تمرير اسم الأداة Name للمصفوفة المتمثلة بالخاصية Controls.

  كود الزر تعديل في الفورم FrmEdit:

الكود يماثل كود عملية الإضافة Add بنسبة 90% حيث ان المراحل الثالث الاولى هي نفسها ( فحص الحقول المطلوبة – التصريح عن كائن الاتصال SqlConnection ونص الاتصال conStr – ثم إنشاء الإتصال con وفتحه).

القسم الذي سيختلف تقريباً هو جملة الاستعلام فقط:
Dim addCmd As String = "UPDATE tbInfo SET Name=@Name,Telephone=@Phone," & _
  "Mobile=@Mobile,Email=@Email WHERE id=@ID"
Dim cmd As New SqlCommand(addCmd, con)
cmd.Parameters.Clear()
cmd.Parameters.AddWithValue("@Name", txtName.Text.Trim())
cmd.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim())
cmd.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim())
cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim())
cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(lblID.Text))
string addCmd = "UPDATE tbInfo SET Name=@Name,Telephone=@Phone," +
  "Mobile=@Mobile,Email=@Email WHERE id=@ID";
SqlCommand cmd = new SqlCommand(addCmd, con);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Name", txtName.Text.Trim());
cmd.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(lblID.Text));

فقط الاختلاف في جملة الاستعلام كانت Insert Into أصبحت Update ,, وايضاً أضفنا بارمتر جيد هو @ID الذي نمرر له قيم الحقل ID والذي يمثل المفتاح الاساسي Primary Key وبواسطته يمكننا تعديل السجل المطلوب.

باقي الكود هو نفسه أيضاً ( تنفيذ الاستعلام – ثم إغلاق الاتصال).

  كود الزر حذف Delete:

الكود يتبع نفس خطوات كودي الإضافة والحذف, الاختلاف فقط بجملة الاستعلام ستصبح Delete:
int idx = Convert.ToInt32(lblID.Text);
SqlCommand cmd = new SqlCommand("DELETE FROM tbInfo WHERE id=" + idx.ToString(), con);
Dim idx As Integer = Convert.ToInt32(lblID.Text)
Dim cmd As New SqlCommand("DELETE FROM tbInfo WHERE id=" & idx.ToString(), con)

سنحتاج في جملة Delete إلى رقم ID السجل المطلوب حذفه لأننا كما قلنا انه هو Primary Key وهو موجود في الليبل lblID فقط نقوم بتحويل قيمته إلى رقمية Integer.

بعد ذلك ننشئ كائن تنفيذ الاستعلام مع تمرير جملة الاستعلام وكائن الاتصال con ثم يبقى تنفيذ الاستعلام.




6 تعليقات

رابط التحميل لايعمل

رد

اعتذر جداً :( ,, تم إصلاح المشكلة

الروابط تعمل كلها !

رد

مو شغاله الروابط

رد

أخي جميع الروابط تعمل ,,, ارجو التأكد والمحاولة مرة أخرى

ربما يكون السبب مكافح فيروسات او الجدارالناري للكمبيوتر

رد
أزال المؤلف هذا التعليق.

السلام عليكم ورحمة الله وبركاتة

الاخ الفاضل مدير المدونة
لو سمحت اريد الاتفاق معك على عمل وحاولت مراسلتك ولم احصل صفحة اتصل بنا

رد

إرسال تعليق