تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
موضوع للنقاش !! - طرق الاتصال بقاعدة البيانات
#1
السلام عليكم 

كمبرمج حر كاغلب البقية هنا دائما اسعى لكتابة الكود بافضل طريقة ممكنة، للتعلم بشكل صحيح والتطور الدائم

اليوم موضوعي عن طريقة الاتصال بقاعدة البيانات.

في السابق كنت استحدم كلاس فية جملة الاتصال و اقوم باستدعاء هذا الكلاس في الفورم او الكلاس المراد كالاتي :

PHP كود :
using System.Configuration;
using System.Data;
using System.Data.OleDb;

namespace 
WindowsFormsApp1.Classes
{
 
   class DB_Connect
    
{
 
       public OleDbConnection con;
 
       public void Connection()
 
       {
 
           string constring ConfigurationManager.ConnectionStrings["WindowsFormsApp1.Properties.Settings.DB_Con"].ConnectionString;
 
           con = new OleDbConnection(constring);
 
       }

 
       public void Open_Con()
 
       {
 
           if (con.State == ConnectionState.Closed)
 
           {
 
               con.Open();
 
           }
 
       }

 
       public void Close_Con()
 
       {
 
           if (con.State == ConnectionState.Open)
 
           {
 
               con.Close();
 
           }
 
       }
 
   }

وهي طريقة مريحة وفعالة واستخدمها في العادة.

لكن من فترة وبداعي الفضول لاكواد مختلفة مررت على فيديو باليوتوب يشرح فية الاتصال بقاعدة البيانات
ويستخدم SingletonHelper و يقوم باستنساخ الاتصال لعدم مناداة الاتصال كل مرة في حال كان عدد مستخدمين كثرة
لكي لا يستهلك موارد السيرفر والطريقة كالاتي :
PHP كود :
using System.Configuration;
using System.Data;
using System.Data.OleDb;

namespace 
WindowsFormsApp1.Classes
{
 
   class DB_Connect
    
{
 
       private DB_Connect() { }
 
       public OleDbConnection Connection = new OleDbConnection(ConfigurationManager.ConnectionStrings["WindowsFormsApp1.Properties.Settings.DB_Con"].ConnectionString);

 
       public void Open_Con()
 
       {
 
           if (Connection.State == ConnectionState.Closed)
 
           {
 
               Connection.Open();
 
           }
 
       }
 
       public void Close_Con()
 
       {
 
           if (Connection.State == ConnectionState.Open)
 
           {
 
               Connection.Close();
 
           }
 
       }
 
       private static class SingletonHelper
        
{
 
           internal static readonly DB_Connect Instance = new DB_Connect();
 
       }
 
       public static DB_Connect Get_Connection()
 
       {
 
           return SingletonHelper.Instance;
 
       }
 
   }

لكن لاحظت انة في الطريقة الاولى البرنامح اسرع قليلا في عمليات الاضافة و التعديل.

هل من احد لدية خبرة او معلومة من هي الطريقة الانسب والافضل ؟؟
الرد
#2
اخى الكريم كل الطرق تودى الى روما انا لما اشتغل قاعدة لوكل استخدم هذا الربط
للاتصال هذا الكود
OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=bbc.accdb;jet oledb:database password=1234");
OleDbCommand cmd;
وبعذ ذلك المنادة من الجدول
public void fulldata()
{
OleDbDataAdapter da = new OleDbDataAdapter("select * from issam", con);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;

dataGridView1.Columns[0].HeaderText = "تاريخ التسجيل";
dataGridView1.Columns[1].HeaderText = "الاسم";
dataGridView1.Columns[2].HeaderText = "الجنس";
dataGridView1.Columns[3].HeaderText = "تاريخ الميلاد";
dataGridView1.Columns[4].HeaderText = "الحالة الاجتماعية";
dataGridView1.Columns[5].HeaderText = "عدد الزوجات";
dataGridView1.Columns[6].HeaderText = "عدد الابناء";
dataGridView1.Columns[7].HeaderText = "التعليم";
dataGridView1.Columns[8].HeaderText = "العنوان";
dataGridView1.Columns[9].HeaderText = "العمل";
dataGridView1.Columns[10].HeaderText = "الدخل";
dataGridView1.Columns[11].HeaderText = "وضع الاسرة";
dataGridView1.Columns[12].HeaderText = "التحويل";
dataGridView1.Columns[13].HeaderText = "رقم الجوال";
dataGridView1.Columns[14].HeaderText = "ملاحظات";
dataGridView1.Columns[15].HeaderText = "مستخدم";
}
ولا تنسى وضعها فى بداء التشغيل المنادة فى بداية تشغيل الفورم
وكود الحفظ كا الاتى
cmd = new OleDbCommand("Insert Into issam (xid,xname,xsex,XDATE,xsocial,xNbewives,xnbechild,xEducation,xAddress,xjob,xsalary,xFastate,xtransfer,xnumber,xnotes,xuser)values(@id,@name,@sex,@date,@social,@Nbewives,@nbechild,@Education,@Address,@job,@salary,@Fastate,@transfer,@number,@notes,@user)", con);
cmd.Parameters.AddWithValue("@id", txtid.Text);
cmd.Parameters.AddWithValue("@name", txtname.Text);
cmd.Parameters.AddWithValue("@sex", txtsex.Text);
cmd.Parameters.AddWithValue("@date", datebr.Value.ToString("yyyy/MM/dd"));
cmd.Parameters.AddWithValue("@social", txtmred.Text);
cmd.Parameters.AddWithValue("@Nbewives", numwifi.Value);
cmd.Parameters.AddWithValue("@nbechild", numchiled.Value);
cmd.Parameters.AddWithValue("@Education", txteduction.Text);
cmd.Parameters.AddWithValue("@Address", txtaddres.Text);
cmd.Parameters.AddWithValue("@job", txtgop.Text);
cmd.Parameters.AddWithValue("@salary", txtsalary.Text);
cmd.Parameters.AddWithValue("@Fastate", txtstat.Text);
cmd.Parameters.AddWithValue("@transfer", txttrnsform.Text);
cmd.Parameters.AddWithValue("@number", txtphone.Text);
cmd.Parameters.AddWithValue("@notes", txtnot.Text);
cmd.Parameters.AddWithValue("@user", txtuser.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
وكود التعديل كا الاتي
//التعديل
cmd = new OleDbCommand("update issam set xname=@name,xsex=@sex,XDATE=@date,xsocial=@social,xNbewives=@Nbewives,xnbechild=@nbechild,xEducation=@Education,xAddress=@Address,xjob=@job,xsalary=@salary,xFastate=@Fastate,xtransfer=@transfer,xnumber=@number,xnotes=@notes,xuser=@user where xid=@id", con);
cmd.Parameters.AddWithValue("@name", txtname.Text);
cmd.Parameters.AddWithValue("@sex", txtsex.Text);
cmd.Parameters.AddWithValue("@date", datebr.Value.ToString("yyyy/MM/dd"));
cmd.Parameters.AddWithValue("@social", txtmred.Text);
cmd.Parameters.AddWithValue("@Nbewives", numwifi.Value);
cmd.Parameters.AddWithValue("@nbechild", numchiled.Value);
cmd.Parameters.AddWithValue("@Education", txteduction.Text);
cmd.Parameters.AddWithValue("@Address", txtaddres.Text);
cmd.Parameters.AddWithValue("@job", txtgop.Text);
cmd.Parameters.AddWithValue("@salary", txtsalary.Text);
cmd.Parameters.AddWithValue("@Fastate", txtstat.Text);
cmd.Parameters.AddWithValue("@transfer", txttrnsform.Text);
cmd.Parameters.AddWithValue("@number", txtphone.Text);
cmd.Parameters.AddWithValue("@notes", txtnot.Text);
cmd.Parameters.AddWithValue("@user", txtuser.Text);
cmd.Parameters.AddWithValue("@id", txtid.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
وكود الحذف كا الاتى
cmd = new OleDbCommand("Delete * from issam where xid=@id", con);
cmd.Parameters.AddWithValue("@id", txtid.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
لاتنسى تبديل اسماء الجدول بجدولك
ولا تمسى try
الرد
#3
(24-09-19, 08:23 PM)issamsaidd كتب : اخى الكريم كل الطرق تودى الى روما انا لما اشتغل قاعدة لوكل استخدم هذا الربط
للاتصال هذا الكود
OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=bbc.accdb;jet oledb:database password=1234");
OleDbCommand cmd;
وبعذ ذلك المنادة من الجدول
public void fulldata()
       {
           OleDbDataAdapter da = new OleDbDataAdapter("select * from issam", con);
           DataTable dt = new DataTable();
           da.Fill(dt);
           dataGridView1.DataSource = dt;

           dataGridView1.Columns[0].HeaderText = "تاريخ التسجيل";
           dataGridView1.Columns[1].HeaderText = "الاسم";
           dataGridView1.Columns[2].HeaderText = "الجنس";
           dataGridView1.Columns[3].HeaderText = "تاريخ الميلاد";
           dataGridView1.Columns[4].HeaderText = "الحالة الاجتماعية";
           dataGridView1.Columns[5].HeaderText = "عدد الزوجات";
           dataGridView1.Columns[6].HeaderText = "عدد الابناء";
           dataGridView1.Columns[7].HeaderText = "التعليم";
           dataGridView1.Columns[8].HeaderText = "العنوان";
           dataGridView1.Columns[9].HeaderText = "العمل";
           dataGridView1.Columns[10].HeaderText = "الدخل";
           dataGridView1.Columns[11].HeaderText = "وضع الاسرة";
           dataGridView1.Columns[12].HeaderText = "التحويل";
           dataGridView1.Columns[13].HeaderText = "رقم الجوال";
           dataGridView1.Columns[14].HeaderText = "ملاحظات";
           dataGridView1.Columns[15].HeaderText = "مستخدم";
       }
ولا تنسى وضعها فى بداء التشغيل المنادة فى بداية تشغيل الفورم
وكود الحفظ كا الاتى
cmd = new OleDbCommand("Insert Into issam (xid,xname,xsex,XDATE,xsocial,xNbewives,xnbechild,xEducation,xAddress,xjob,xsalary,xFastate,xtransfer,xnumber,xnotes,xuser)values(@id,@name,@sex,@date,@social,@Nbewives,@nbechild,@Education,@Address,@job,@salary,@Fastate,@transfer,@number,@notes,@user)", con);
                   cmd.Parameters.AddWithValue("@id", txtid.Text);
                   cmd.Parameters.AddWithValue("@name", txtname.Text);
                   cmd.Parameters.AddWithValue("@sex", txtsex.Text);
                   cmd.Parameters.AddWithValue("@date", datebr.Value.ToString("yyyy/MM/dd"));
                   cmd.Parameters.AddWithValue("@social", txtmred.Text);
                   cmd.Parameters.AddWithValue("@Nbewives", numwifi.Value);
                   cmd.Parameters.AddWithValue("@nbechild", numchiled.Value);
                   cmd.Parameters.AddWithValue("@Education", txteduction.Text);
                   cmd.Parameters.AddWithValue("@Address", txtaddres.Text);
                   cmd.Parameters.AddWithValue("@job", txtgop.Text);
                   cmd.Parameters.AddWithValue("@salary", txtsalary.Text);
                   cmd.Parameters.AddWithValue("@Fastate", txtstat.Text);
                   cmd.Parameters.AddWithValue("@transfer", txttrnsform.Text);
                   cmd.Parameters.AddWithValue("@number", txtphone.Text);
                   cmd.Parameters.AddWithValue("@notes", txtnot.Text);
                   cmd.Parameters.AddWithValue("@user", txtuser.Text);
                   con.Open();
                   cmd.ExecuteNonQuery();
                   con.Close();
وكود التعديل كا الاتي
     //التعديل
               cmd = new OleDbCommand("update issam set xname=@name,xsex=@sex,XDATE=@date,xsocial=@social,xNbewives=@Nbewives,xnbechild=@nbechild,xEducation=@Education,xAddress=@Address,xjob=@job,xsalary=@salary,xFastate=@Fastate,xtransfer=@transfer,xnumber=@number,xnotes=@notes,xuser=@user where xid=@id", con);
               cmd.Parameters.AddWithValue("@name", txtname.Text);
               cmd.Parameters.AddWithValue("@sex", txtsex.Text);
               cmd.Parameters.AddWithValue("@date", datebr.Value.ToString("yyyy/MM/dd"));
               cmd.Parameters.AddWithValue("@social", txtmred.Text);
               cmd.Parameters.AddWithValue("@Nbewives", numwifi.Value);
               cmd.Parameters.AddWithValue("@nbechild", numchiled.Value);
               cmd.Parameters.AddWithValue("@Education", txteduction.Text);
               cmd.Parameters.AddWithValue("@Address", txtaddres.Text);
               cmd.Parameters.AddWithValue("@job", txtgop.Text);
               cmd.Parameters.AddWithValue("@salary", txtsalary.Text);
               cmd.Parameters.AddWithValue("@Fastate", txtstat.Text);
               cmd.Parameters.AddWithValue("@transfer", txttrnsform.Text);
               cmd.Parameters.AddWithValue("@number", txtphone.Text);
               cmd.Parameters.AddWithValue("@notes", txtnot.Text);
               cmd.Parameters.AddWithValue("@user", txtuser.Text);
               cmd.Parameters.AddWithValue("@id", txtid.Text);
               con.Open();
               cmd.ExecuteNonQuery();
               con.Close();
وكود الحذف كا الاتى
cmd = new OleDbCommand("Delete * from issam where xid=@id", con);
                       cmd.Parameters.AddWithValue("@id", txtid.Text);
                       con.Open();
                       cmd.ExecuteNonQuery();
                       con.Close();
لاتنسى تبديل اسماء الجدول بجدولك
ولا تمسى try

شكرا صديقي.... لكن انت لم تفهم قصدي صديقي 
لو تقوم بقراءة الموضوع مرة اخرى ستفهم ما الذي احاول توصيلة
الرد
تم الشكر بواسطة: حريف برمجة , ابراهيم ايبو , asemshahen5
#4
عندي سؤال ما هي سرعة فتح الاتصال بقاعدة البيانات عندك بالاتصال الاول و الثاني .

PHP كود :
//جرب هذا لمعرفة الزمن المستغرق لتنفيذ كود، وبعدها تستطيع تعرف الأسرع بشكل جيد
 
Stopwatch sw = new Stopwatch();
 
sw.Start();
 
//------------------------------

 // Code

 //------------------------------
 
sw.Stop();
 
MessageBox.Show(sw.Elapsed.ToString()); 
سبحان الله وبحمده سبحان الله العظيم و الحمد لله ولا اله الا الله والله اكبر




الرد
تم الشكر بواسطة: حريف برمجة , Rabeea Qbaha
#5
تبين بعد تجربة الكود من الاخ asemshahen5 انة بالفعل الطريقة الاولى اسرع قليلا 
بالحقيقة لا اعلم اذا هذا الفارق البسيط يفرق بالاداء.




الرد
تم الشكر بواسطة: asemshahen5 , ابراهيم ايبو , حريف برمجة
#6
بعيدا عن جوهر الموضوع ومن باب المشاركة
منذ تعرفت على تقنية Linq2ٍSQL تركت الطريقة القديمة ado
في الحقيقة ارتحت جدا من تعب كتابة الاستعلامات والبارامترات والاجراءات المخزنة والرجوع الى قاعدة البيانات في كل مرة اكتب فيها استعلام لاتأكد من اسم العمود ان كان به حرف كبير capital او لاعرف ما نوعه وغيرها من الامور المعقدة

كذلك اصبح الوصول الى البيانات سهل جدا ولا يحتاج لكتابة كود كبير

الرد
#7
لكن استخدام طريقة Linq2ٍSQL بطيئة جدا باسترداد البيانات، احد الاخوة هنا لا اذكر من قام بعمل فيديو ليبين السرعه بين الطرق الثلاثة بالاضافة الى ال dapper 
و كان ال dapper الاسرع وكان Linq2ٍSQL الابطئ و بفارق مخيف في الحقيقة !!
الرد
#8
وعليكم السلام ورحمة الله وبركاته
انظر اخى الكريم Rabeea Qbaha

بخصوص الفرق بين الكود الاول والكود الثاني لو هختصر مباشر ممكن اقول ولا حاجة الاثنين واحد
طيب علمياً خصوصاً فى الاستخدام وطريقة التعامل

فى الكود الاول كل الامر بانه بيتم عمل الاتصال من ثم التحقق من فتح والاغلاق
فى الكود الثاني يقوم بنفس الامر بس تعال نقول ان االمر بيتم بصورة نموذجية مباشرة

طيب يعنى ايه الكلام ده عشان الامور توضح اكتر
فى الكود الاول انت عملت الكلاس بعدها عند المناداه عليها فى اى شاشة

بيتم تعريف هذا الكلاس لاستدعاء ما بداخله بحيث كمثال التالى
كود :
            DB_Connect test = new DB_Connect();

عشان تقدر بعدها تقوم بتطبيق الكود كمثال التالى
كود :
            test.Connection();

الاكواد بالاعلى توضح كمثال فقط وليس الامر الفعلى

طيب تعال كده لو حبيت معملش السطر الاول وفجاء انا محتاج اقول انا عايز اعمل الكود كده مباشر
كود :
            Connection();

تفتكر الشاشة هنا هتفهم هو المقصود بيه ايه ولا هو تبع ايه بضبط
اهو الامر فى SingletonHelper هو لخص الامر ده وجعل الكلاس لا يلزم تعريفه لانه سيتم تعريفه تلقائي فى كل شاشة

بناءاً على هذا السطر 
كود :
           internal static readonly DB_Connect Instance = new DB_Connect();

فكده كانك تماماً بتيجى فى كل مرة كنت بتقوم بكتابة هذا السطر
كود :
            DB_Connect test = new DB_Connect();

هو بيكتبه نيابتاً عنك مباشراً فبكده هتقدر تستدعي مباشراً
كود :
            Connection();

وسيتم التعرف عليه بدون مشكلة
طيب خلينا كده نتكلم عن الامر بصورة اسهل وبشكل عام كما لو انها بالعمية
تخيل انك بتنشاء Module بدلاً من Class او انك بتحول الـ Class لـ Module

ولكي تعم الفائدة لك وللجميع يمكن مراجعة هذا الفيديو ان شاء الله هتوصل الصورة من الامر اكثر

طيب ليه بيحصل فارق زمني بسيط وقد لا تلاحظها فى الامور الكبيرة
كون كما لو انه يقوم فى كل مرة كتابة كود تعريف الكلاس ليستوعبه الشاشة عند التنفيذ بشكل عامى دون توضح بشرح كبير
طيب هل الامر انه بيقلل الحمل على موارد السيرفر او لا بالطبع لا لان الموارد المستهلكة ليس على كود الاتصال
بال على طريقة التعامل وكتابة كود التنفيذ مثل الاستعلام بصورة اكبر عليه وياليه الاضافة والتعديل والحذف

اتمنى ان تكون الصورة وضحت لك بصورة اوضح
وان لا اكون شرحت بصورة غير موضحة لتصل الفريق

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد
#9
أهلا بعودتك و الحمد الله على سلامتك قد اشتقنا لك و لردودك جزاك الله عنا كل خير .
سبحان الله وبحمده سبحان الله العظيم و الحمد لله ولا اله الا الله والله اكبر




الرد
#10
(07-10-19, 11:45 PM)asemshahen5 كتب : أهلا بعودتك و الحمد الله على سلامتك قد اشتقنا لك و لردودك جزاك الله عنا كل خير .

الله يسلمك اخى الفاضل asemshahen5

هذا من اصلك الطيب اخى الكريم جزاك الله كل خير

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [C#.NET] الحصول علي البيانات من الويب سيرفيس لبرنامج سطح المكتب محمد اسماعيل 2 188 17-07-20, 07:31 PM
آخر رد: محمد اسماعيل
  [سؤال] كيف يتم اضافة جداول اوحقول او اي تعديل على قاعدة البيانات من خلال سي شارب فقط younass 5 252 04-07-20, 05:52 PM
آخر رد: kiki
  مساعده فى رفع قاعده البيانات على استضافه maxruined 2 276 01-06-20, 08:12 PM
آخر رد: maxruined
  [C#.NET] تشغيل فديو من قاعده البيانات ssayed111 2 269 23-04-20, 03:15 PM
آخر رد: سعود
  شرح الاتصال باى ماكينه حضور وانصراف بقاعده بيانات سيكول alhlwany 5 4,391 11-02-20, 03:41 PM
آخر رد: alhlwany
  [سؤال] ماهي طريقة الاتصال بقاعدة البيانات بتقنية Entity Framework اثناء تشغيل البرنامج younass 3 430 24-01-20, 11:06 PM
آخر رد: جميل5
Thumbs Up [C#.NET] كيف أحفظ الصورة في مسار وربطه بقاعدة البيانات Sqlserverثم إعادة قرائته مرة اخرى محمد جمعه 1 397 29-10-19, 01:16 PM
آخر رد: asemshahen5
  [C#.NET] ظهور البيانات في الداتا غريد وليد العمران 1 382 25-09-19, 03:31 PM
آخر رد: Rabeea Qbaha
  كيف تغير اخر رقم بحقل في قاعدة البيانات viv 0 348 26-08-19, 07:04 PM
آخر رد: viv
  [C#.NET] عدم اتصال البرنامج بقاعدة البيانات كريم جودي 2 885 26-08-19, 10:55 AM
آخر رد: ابراهيم ايبو

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم