المشاركات : 669
المواضيع 88
الإنتساب : Aug 2016
السمعة :
97
الشكر: 798
تم شكره 1154 مرات في 488 مشاركات
السلام عليكم
كمبرمج حر كاغلب البقية هنا دائما اسعى لكتابة الكود بافضل طريقة ممكنة، للتعلم بشكل صحيح والتطور الدائم
اليوم موضوعي عن طريقة الاتصال بقاعدة البيانات.
في السابق كنت استحدم كلاس فية جملة الاتصال و اقوم باستدعاء هذا الكلاس في الفورم او الكلاس المراد كالاتي :
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; } } }
لكن لاحظت انة في الطريقة الاولى البرنامح اسرع قليلا في عمليات الاضافة و التعديل.
هل من احد لدية خبرة او معلومة من هي الطريقة الانسب والافضل ؟؟
المشاركات : 165
المواضيع 43
الإنتساب : Apr 2018
السمعة :
5
الشكر: 116
تم شكره 143 مرات في 78 مشاركات
اخى الكريم كل الطرق تودى الى روما انا لما اشتغل قاعدة لوكل استخدم هذا الربط
للاتصال هذا الكود
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
المشاركات : 669
المواضيع 88
الإنتساب : Aug 2016
السمعة :
97
الشكر: 798
تم شكره 1154 مرات في 488 مشاركات
(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
شكرا صديقي.... لكن انت لم تفهم قصدي صديقي
لو تقوم بقراءة الموضوع مرة اخرى ستفهم ما الذي احاول توصيلة
المشاركات : 2,329
المواضيع 81
الإنتساب : May 2018
السمعة :
522
الشكر: 14039
تم شكره 5671 مرات في 2269 مشاركات
28-09-19, 11:59 PM
(آخر تعديل لهذه المشاركة : 29-09-19, 12:02 AM {2} بواسطة asemshahen5.)
عندي سؤال ما هي سرعة فتح الاتصال بقاعدة البيانات عندك بالاتصال الاول و الثاني .
PHP كود :
//جرب هذا لمعرفة الزمن المستغرق لتنفيذ كود، وبعدها تستطيع تعرف الأسرع بشكل جيد Stopwatch sw = new Stopwatch(); sw.Start(); //------------------------------
// Code
//------------------------------ sw.Stop(); MessageBox.Show(sw.Elapsed.ToString());
سبحان الله وبحمده سبحان الله العظيم و الحمد لله ولا اله الا الله والله اكبر
المشاركات : 669
المواضيع 88
الإنتساب : Aug 2016
السمعة :
97
الشكر: 798
تم شكره 1154 مرات في 488 مشاركات
30-09-19, 09:55 PM
(آخر تعديل لهذه المشاركة : 30-09-19, 09:55 PM {2} بواسطة Rabeea Qbaha.)
تبين بعد تجربة الكود من الاخ asemshahen5 انة بالفعل الطريقة الاولى اسرع قليلا
بالحقيقة لا اعلم اذا هذا الفارق البسيط يفرق بالاداء.
المشاركات : 847
المواضيع 9
الإنتساب : Oct 2015
السمعة :
131
الشكر: 2219
تم شكره 1685 مرات في 745 مشاركات
بعيدا عن جوهر الموضوع ومن باب المشاركة
منذ تعرفت على تقنية Linq2ٍSQL تركت الطريقة القديمة ado
في الحقيقة ارتحت جدا من تعب كتابة الاستعلامات والبارامترات والاجراءات المخزنة والرجوع الى قاعدة البيانات في كل مرة اكتب فيها استعلام لاتأكد من اسم العمود ان كان به حرف كبير capital او لاعرف ما نوعه وغيرها من الامور المعقدة
كذلك اصبح الوصول الى البيانات سهل جدا ولا يحتاج لكتابة كود كبير
المشاركات : 669
المواضيع 88
الإنتساب : Aug 2016
السمعة :
97
الشكر: 798
تم شكره 1154 مرات في 488 مشاركات
لكن استخدام طريقة Linq2ٍSQL بطيئة جدا باسترداد البيانات، احد الاخوة هنا لا اذكر من قام بعمل فيديو ليبين السرعه بين الطرق الثلاثة بالاضافة الى ال dapper
و كان ال dapper الاسرع وكان Linq2ٍSQL الابطئ و بفارق مخيف في الحقيقة !!
المشاركات : 3,815
المواضيع 36
الإنتساب : Mar 2014
السمعة :
724
الشكر: 7238
تم شكره 6709 مرات في 3265 مشاركات
وعليكم السلام ورحمة الله وبركاته
انظر اخى الكريم Rabeea Qbaha
بخصوص الفرق بين الكود الاول والكود الثاني لو هختصر مباشر ممكن اقول ولا حاجة الاثنين واحد
طيب علمياً خصوصاً فى الاستخدام وطريقة التعامل
فى الكود الاول كل الامر بانه بيتم عمل الاتصال من ثم التحقق من فتح والاغلاق
فى الكود الثاني يقوم بنفس الامر بس تعال نقول ان االمر بيتم بصورة نموذجية مباشرة
طيب يعنى ايه الكلام ده عشان الامور توضح اكتر
فى الكود الاول انت عملت الكلاس بعدها عند المناداه عليها فى اى شاشة
بيتم تعريف هذا الكلاس لاستدعاء ما بداخله بحيث كمثال التالى
كود :
DB_Connect test = new DB_Connect();
عشان تقدر بعدها تقوم بتطبيق الكود كمثال التالى
الاكواد بالاعلى توضح كمثال فقط وليس الامر الفعلى
طيب تعال كده لو حبيت معملش السطر الاول وفجاء انا محتاج اقول انا عايز اعمل الكود كده مباشر
تفتكر الشاشة هنا هتفهم هو المقصود بيه ايه ولا هو تبع ايه بضبط
اهو الامر فى SingletonHelper هو لخص الامر ده وجعل الكلاس لا يلزم تعريفه لانه سيتم تعريفه تلقائي فى كل شاشة
بناءاً على هذا السطر
كود :
internal static readonly DB_Connect Instance = new DB_Connect();
فكده كانك تماماً بتيجى فى كل مرة كنت بتقوم بكتابة هذا السطر
كود :
DB_Connect test = new DB_Connect();
هو بيكتبه نيابتاً عنك مباشراً فبكده هتقدر تستدعي مباشراً
وسيتم التعرف عليه بدون مشكلة
طيب خلينا كده نتكلم عن الامر بصورة اسهل وبشكل عام كما لو انها بالعمية
تخيل انك بتنشاء Module بدلاً من Class او انك بتحول الـ Class لـ Module
ولكي تعم الفائدة لك وللجميع يمكن مراجعة هذا الفيديو ان شاء الله هتوصل الصورة من الامر اكثر
طيب ليه بيحصل فارق زمني بسيط وقد لا تلاحظها فى الامور الكبيرة
كون كما لو انه يقوم فى كل مرة كتابة كود تعريف الكلاس ليستوعبه الشاشة عند التنفيذ بشكل عامى دون توضح بشرح كبير
طيب هل الامر انه بيقلل الحمل على موارد السيرفر او لا بالطبع لا لان الموارد المستهلكة ليس على كود الاتصال
بال على طريقة التعامل وكتابة كود التنفيذ مثل الاستعلام بصورة اكبر عليه وياليه الاضافة والتعديل والحذف
اتمنى ان تكون الصورة وضحت لك بصورة اوضح
وان لا اكون شرحت بصورة غير موضحة لتصل الفريق
تحياتى لك
وتمنياتى لك التوفيق
المشاركات : 2,329
المواضيع 81
الإنتساب : May 2018
السمعة :
522
الشكر: 14039
تم شكره 5671 مرات في 2269 مشاركات
07-10-19, 11:45 PM
(آخر تعديل لهذه المشاركة : 07-10-19, 11:46 PM {2} بواسطة asemshahen5.)
أهلا بعودتك و الحمد الله على سلامتك قد اشتقنا لك و لردودك جزاك الله عنا كل خير .
سبحان الله وبحمده سبحان الله العظيم و الحمد لله ولا اله الا الله والله اكبر
المشاركات : 3,815
المواضيع 36
الإنتساب : Mar 2014
السمعة :
724
الشكر: 7238
تم شكره 6709 مرات في 3265 مشاركات
(07-10-19, 11:45 PM)asemshahen5 كتب : أهلا بعودتك و الحمد الله على سلامتك قد اشتقنا لك و لردودك جزاك الله عنا كل خير .
الله يسلمك اخى الفاضل asemshahen5
هذا من اصلك الطيب اخى الكريم جزاك الله كل خير
تحياتى لك
وتمنياتى لك التوفيق
|