الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حفظ DataGridView في قاعدة البيانات؟

بدأه صلاح سعيد في 12 يناير 2011 · 5 رد · 2,191 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لدي مشكلة تواجهني منذ فترة و لم أجد لها حل يعمل مائة في المائة.

أنا أعمل على برنامج 2008 c sharp windows form applications مع قاعدة بيانات sql Server 2005 و لدي فورم Form يوجد به ComboBox و Save Command و DataGridView ((تحتوي

هذه ال DataGridView على أعمدة Columns حقول نص و قوائم منسدلة TextBox and ComboBox)) غير مرتبطة بقاعدة البيانات (أي أنها عند Run Time تكون خالية) و عند التشغيل أقوم

بكتابة البيانات في هذه ال DataGridView ثم اقوم بحفظ البيانات عند طريق زر الحفظ.

قمت بمحاولة عمل دوارة for Loop تقوم بدخول لكل سطر في ال DataGridView ثم اقوم بتنفيذ insert query لهذا السطر من البيانات, و لكن هذه الطريقة تقوم بعمل بأضافة سطر واحد فقط

من ال DataGridView.

ارجو المساعدة...

−1
#2

يا جماعة يا أهل خبرة السي شارب و لا أحد يرد

...

رجاءا المساعدة...

#4

TareqVB كتب:

السلام عليكم

اين هذا الكود اقل مايمكن كود التخزين و loop !!!


{
SqlConnection cn = new SqlConnection(connecting.strCon);
SqlCommand cm = new SqlCommand("insert into WorkMove (wkmNo,trcNo,shwPrice,clnPrice,wkmNum,wkmPrice) values (@wkmNo,@trcNo,@shwPrice,@clnPrice,@wkmNum,@wkmPrice)", cn);
int i;
i= Convert.ToInt32(dataGridView1.Rows.Count.ToString());
int d = 0;
d = Convert.ToInt32(dataGridView1.CurrentRow.Index.ToString());


for (d = 2; i >= d;d++ )

{
cm.Parameters.AddWithValue("@wkmNo", dataGridView1.CurrentRow.Cells[0].Value.ToString());
cm.Parameters.AddWithValue("@trcNo", comboBox1.SelectedValue);
cm.Parameters.AddWithValue("@shwPrice", dataGridView1.CurrentRow.Cells[2].Value.ToString());
cm.Parameters.AddWithValue("@clnPrice", dataGridView1.CurrentRow.Cells[3].Value.ToString());
cm.Parameters.AddWithValue("@wkmNum", dataGridView1.CurrentRow.Cells[4].Value.ToString());
cm.Parameters.AddWithValue("@wkmPrice", dataGridView1.CurrentRow.Cells[5].Value.ToString());

cn.Open();
cm.ExecuteNonQuery();
cn.Close();
MessageBox.Show("data saved");
d++;

}
}
private void btnSave_Click(object sender, EventArgs e)

تم تعديل هذه المشاركة بواسطة صلاح سعيد في 15 يناير 2011 في 19:06

1
#5
صلاح سعيد كتب:


{
SqlConnection cn = new SqlConnection(connecting.strCon);
SqlCommand cm = new SqlCommand("insert into WorkMove (wkmNo,trcNo,shwPrice,clnPrice,wkmNum,wkmPrice) values (@wkmNo,@trcNo,@shwPrice,@clnPrice,@wkmNum,@wkmPrice)", cn);
int i;
i= Convert.ToInt32(dataGridView1.Rows.Count.ToString());
int d = 0;
d = Convert.ToInt32(dataGridView1.CurrentRow.Index.ToString());


for (d = 2; i >= d;d++ )

{
cm.Parameters.AddWithValue("@wkmNo", dataGridView1.CurrentRow.Cells[0].Value.ToString());
cm.Parameters.AddWithValue("@trcNo", comboBox1.SelectedValue);
cm.Parameters.AddWithValue("@shwPrice", dataGridView1.CurrentRow.Cells[2].Value.ToString());
cm.Parameters.AddWithValue("@clnPrice", dataGridView1.CurrentRow.Cells[3].Value.ToString());
cm.Parameters.AddWithValue("@wkmNum", dataGridView1.CurrentRow.Cells[4].Value.ToString());
cm.Parameters.AddWithValue("@wkmPrice", dataGridView1.CurrentRow.Cells[5].Value.ToString());

cn.Open();
cm.ExecuteNonQuery();
cn.Close();
MessageBox.Show("data saved");
d++;

}
}
private void btnSave_Click(object sender, EventArgs e)

أخي الكريم إذا كنت تريد أن تجد حلا مثاليا لمشكلتك فعليك بإستخدام الأجراءات المخزنة stored procedure فهي أفضل الحلول

لعمليات الأدخال المتعدد ومثالية ليكون تطبيقك منظم أما بالنسبة للكود السابق فهو حسب ماأتضح لي أنه به الكثير من العيوب

حيث أنه لا يصلح إلا لشخص يعرف حقيقة الكود لأنك قمت بعمل الأتي :

i= Convert.ToInt32(dataGridView1.Rows.Count.ToString());

هنا لنفترض أن قيمة المتغير خمسة على أعتبار أن عدد الصفوف 5

ثم

d = Convert.ToInt32(dataGridView1.CurrentRow.Index.ToString());

وهنا لنفترض أن الصف المحدد كان الأول أو ربما الثاني أو الثالث هل سنأخد رقمه !!!!!!

كما أن المتغير d يتزايد في التكرار نفسه ويتزايد ايضا بعد كود الإضافة !!!!!

أذا ما نظرنا إلى التكرار فهو بالتأكيد سيكون خاطيء لأنه بني على خطأ

أرجوا الأنتباه لهذه النقطة

عندما قمت بإنشاء الكأئن SqlCommand cm

فإنه يحتفظ بالقيم التي قمت بعمل أدراج لها أول مرة لذلك عندما تطلب منه أدراج الصف

الأخر يجد الكائن في الأصل لديه قيمة مخزنه لذلك يتم رفض عملية الأدراج الثانية

وإذا اردت التخلص من هذه المشكلة عليك بعمل تعرف الكائن داخل التكرار بحيث يقوم

بعمل instance او نسخة منه مع كل عملية ادراج وهذا بالتأكيد مكلف وغير مجدي

ناهيك عن كون طريقة أستخدام اdatagridview تكاد تكون معدومة لأنها تستخدم

غالبا في عملية العرض كما هي تسميتها view ولكن من باب التنوية أحببت أن أبين لك

وأتمنى أن أكون قد وفقت في بيان المشكلة فإن اصبت فمن الله وإن أخطأت فمن نفسي

والشيطان ............

تم تعديل هذه المشاركة بواسطة روبوت في 21 يناير 2011 في 03:03

#6

السلام عليكم

عدلت الكود على السريع ليصبح كمايلي :

private void btnSave_Click(object sender, EventArgs e)
{

			SqlConnection cn = new SqlConnection(connecting.strCon);
            SqlCommand cm;

            foreach (DataGridViewRow CurrentRow in dataGridView1.Rows)
            {

                cm = new SqlCommand("insert into WorkMove (wkmNo,trcNo,shwPrice,clnPrice,wkmNum,wkmPrice) values (@wkmNo,@trcNo,@shwPrice,@clnPrice,@wkmNum,@wkmPrice)", cn);
                cm.Parameters.AddWithValue("@wkmNo", CurrentRow.Cells[0].Value.ToString());
                cm.Parameters.AddWithValue("@trcNo", comboBox1.SelectedValue);
                cm.Parameters.AddWithValue("@shwPrice", CurrentRow.Cells[2].Value.ToString());
                cm.Parameters.AddWithValue("@clnPrice", CurrentRow.Cells[3].Value.ToString());
                cm.Parameters.AddWithValue("@wkmNum", CurrentRow.Cells[4].Value.ToString());
                cm.Parameters.AddWithValue("@wkmPrice", CurrentRow.Cells[5].Value.ToString());

                cn.Open();
                cm.ExecuteNonQuery();
                cn.Close();
                MessageBox.Show("data saved for row :" + CurrentRow.Index);


            }


}

وارجو الاخذ بملاحظات الاخ روبوت فجميعها في محلها .

مواضيع مشابهة