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

Inserting multiple records using DataGridView

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

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

ان شاء الله الكل بخير يارب

عندي استفسار صغير وهو عمليه اضافه مجموعه قيود دفعه واحده

انا استخدم الطريقه التاليه

ولكم الكود

 foreach(DataGridViewRow row in dataGridView2.Rows)
            {
                SqlCommand cm = new SqlCommand("insert into stud (name,class1,dep_id) values(@name,@class1,@dep_id)", cn);
                cm.Parameters.Add("@name", SqlDbType.Char).Value = row.Cells["name"].Value;
                cm.Parameters.Add("@class1", SqlDbType.Int).Value = row.Cells["class1"].Value;
                cm.Parameters.Add("@dep_id", SqlDbType.Int).Value = row.Cells["dep"].Value;

   cm.ExecuteNonQuery();
                cm.Parameters.Clear();




            }

مع العلم يتم اضافه البيانات الى قاعده البيانات لكن تظهر رساله خطا

ورساله الخطا هي

The parameterized query '(@name char(8000),@class1 int,@dep_id int)insert into stud (name' expects the parameter '@name', which was not supplied.

#2

السلام عليكم ..

  1. عندما يكون للحقل حجم (متغير ) مثل char و varchar و غيرها في قاعدة البيانات , يفضل وضعه في الكود كمايلي :
            	SqlCommand command = new SqlCommand(connectioString);
            	command.CommandType = CommandType.Text;
            	command.CommandText = "insert into stud (name,class1,dep_id) values(@name,@class1,@dep_id)";
            	command.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar, 8000));
            	command.Parameters["@name"].Value = row.Cells["name"].Value;
            	command.Connection = con;
            	command.ExecuteNonQuery();

    أما باقي الحقول فلا مشكلة .

  2. عملك بهذه الطريقة لا يعد احترافيا , لكنه جيد , حاول استخدام الــ DataTable كمصدر لبيانات الــ Grid و أي تعديلات في الــ Grid ستجدها مباشرة في الجدول .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

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

void fillData()

{

OleDbDataReader itemRead;

SqlCommand1.CommandText = "SELECT name, class1, dep_id FROM Tabel1";

if (SqlConnection1.State == ConnectionState.Closed) SqlConnection1.Open();

itemRead = SqlCommand1.ExecuteReader();

while (itemRead.Read())

{

datagridview2.Rows.Add(itemRead["name"], itemRead["class1"], itemRead["dep_id"]);

}

itemRead.Close();

SqlConnection1.Close();

}

وبعدين تكتب فى الحدث اللى انت عايزه الكود ده

SqlCommand1.CommandText = String.Format("INSERT INTO Tabel1 VALUES('{0}',{1},{2})", Textbox1.Text, Textbox2.Text, Textbox3.Text);

if (SqlConnection1.State == ConnectionState.Closed) SqlConnection1.Open();

SqlCommand1.ExecuteNonQuery();

SqlConnection1.Close();

fillData();

ملحوظة Textbox ده مثال للتوضيح

واتمنى لك التوفيق وشكرا

تم تعديل هذه المشاركة بواسطة صوت الماضى في 6 ديسمبر 2011 في 18:17

#4
houssam11350_11350 كتب:

السلام عليكم ..

  1. عندما يكون للحقل حجم (متغير ) مثل char و varchar و غيرها في قاعدة البيانات , يفضل وضعه في الكود كمايلي :
            	SqlCommand command = new SqlCommand(connectioString);
            	command.CommandType = CommandType.Text;
            	command.CommandText = "insert into stud (name,class1,dep_id) values(@name,@class1,@dep_id)";
            	command.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar, 8000));
            	command.Parameters["@name"].Value = row.Cells["name"].Value;
            	command.Connection = con;
            	command.ExecuteNonQuery();

    أما باقي الحقول فلا مشكلة .

  2. عملك بهذه الطريقة لا يعد احترافيا , لكنه جيد , حاول استخدام الــ DataTable كمصدر لبيانات الــ Grid و أي تعديلات في الــ Grid ستجدها مباشرة في الجدول .

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

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

 cm.Parameters.Add("@name", SqlDbType.Char).Value =Convert.ToString( row.Cells["name"].Value);

مالمقصود باستخدام DataTable حتى يكون عملي احترافيا وبارك الله فيكم جميعا

تم تعديل هذه المشاركة بواسطة altae13 في 7 ديسمبر 2011 في 11:11

#5

السلام عليكم ...

  1. طالما أن الــ dataGrid تأخذ بيانات من قاعدة البيانات , و أعمدتها نفس أعمدة الجدول , إذا نضع مصدر بياناتها هو الجدول مباشرة ,كما في الكود :
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace ArabTeamSQL
    {
    	public partial class Form1 : Form
    	{
        	public Form1()
        	{
            	InitializeComponent();
        	}
        	DataTable dataTable;
        	private void btnSelect_Click(object sender, EventArgs e)
        	{
            	SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True");
            	connection.Open();
            	SqlCommand command = new SqlCommand();
            	command.CommandType = CommandType.Text;
            	command.CommandText = "SELECT name , class1 , dep_id FROM stud;";
            	command.Connection = connection;
            	DataSet dataset = new DataSet();
            	SqlDataAdapter adapter = new SqlDataAdapter();
            	adapter.SelectCommand = command;
            	adapter.Fill(dataset);
    
            	dataTable = dataset.Tables[0];
            	dataGridView1.DataSource = dataTable;
    
    
        	}
    
        	private void btnSave_Click(object sender, EventArgs e)
        	{
            	SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True");
            	connection.Open();
            	SqlCommand command = new SqlCommand();
            	command.Connection = connection;
            	command.CommandType = CommandType.Text;
            	command.CommandText =  "insert into stud (name,class1,dep_id) values(@name,@class1,@dep_id)";
    
            	foreach(DataRow row in dataTable.Rows)
            	{
                	command.Parameters.Clear();
                	command.Parameters.Add("@name", SqlDbType.VarChar).Value = row["name"].ToString();
                	command.Parameters.Add("@class1", SqlDbType.Int).Value = row["class1"].ToString();
                	command.Parameters.Add("@dep_id", SqlDbType.Int).Value = row["dep_id"].ToString();
    
                	command.ExecuteNonQuery();
    
            	}
        	}
    
    	}
    }

  2. عند إدخال البيانات في الــ DataGrid يتم مباشرة إضافة البيانات في الــ DataTable لأنهما مربوطان , العكس صحيح , و بالتالي تكون حلقة الــ for على أسطر الجدول , (و طريقتك ليست خاطئة).
  3. لاحظ أنه لا يمكن إضافة نص في خلية الــ class1 لأن نوعه Integer والعمود الموافق له في DataTable مباشرة يأخذ النوع Integer .
  4. أمور الإضافة و الحذف و التعديل على الجداول أصبحت سهلة , في الفيجوال استديو ..فيكفي أن نقوم بإنشاء DataSource لجدول من قاعدة البيانات و تسحبه على الفورم حتى يقوم بإضافة DataGrid وتوليد TableAdapter موافق له ... و لا داعي لكتابة أي استعلامات .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#6

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

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

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

تم تعديل هذه المشاركة بواسطة altae13 في 7 ديسمبر 2011 في 17:24

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