如何将多个记录从gridview添加到SQL Server表中?

问题描述:

我得到了一个csv文件,我将它插入到一个gridview中,然后显示它。之后,我需要将它存储到数据库中,从gridview中查看所有记录。如何将多个记录从gridview添加到SQL Server表中?

所以按钮点击我用下面的代码:

using (SqlConnection scn = new SqlConnection("Data Source=(local); Database='WaselProject'; Integrated Security = yes;")) 
{ 
    scn.Open(); 
    string query = "INSERT INTO Wasel_Card (RECORD, CARD_ID, FULL_NAME, SERVICE_ID, PROC_COUNT, READ_COUNT) VALUES (@record, @cardid, @fullname, @serviceid, @proccount, @readcount)"; 

    using (SqlCommand scm = new SqlCommand(query, scn)) 
    { 
     for (int i = 0; i < dataGridView1.Rows.Count; i++) 
     { 
      scm.Parameters.AddWithValue("@record", dataGridView1.Rows[i].Cells["Record"].Value.ToString()); 
      scm.Parameters.AddWithValue("@cardid", dataGridView1.Rows[i].Cells["CARD_ID"].Value.ToString()); 
      scm.Parameters.AddWithValue("@fullname", dataGridView1.Rows[i].Cells["FULL_NAME"].Value.ToString()); 
      scm.Parameters.AddWithValue("@serviceid", dataGridView1.Rows[i].Cells["SERVICE_ID"].Value.ToString()); 
      scm.Parameters.AddWithValue("@proccount", dataGridView1.Rows[i].Cells["PROC_COUNT"].Value.ToString()); 
      scm.Parameters.AddWithValue("@readcount", dataGridView1.Rows[i].Cells["READ_COUNT"].Value.ToString()); 

      scm.ExecuteNonQuery(); 
     } 
    } 
} 

,但我得到一个错误:

Additional information: The variable name '@record' has already been declared. Variable names must be unique within a query batch or stored procedure.

任何帮助吗?

在此先感谢。

+0

using语句应该放在for循环中吗?它不会开始一个新的,你试图多次分配相同的参数? – detellda

+0

如果DGV具有基于该表的数据源,则不需要任何代码。只需使用DataAdapter – Plutonix

你的问题是你一直在循环中定义参数,显然同一个命令不能定义多次相同的参数。两种方法来解决你的问题。

方法1

环路内的参数调用Clear()

for (int i = 0; i < dataGridView1.Rows.Count; i++) 
{ 
    scm.Parameters.AddWithValue("@record", dataGridView1.Rows[i].Cells["Record"].Value.ToString()); 
    scm.Parameters.AddWithValue("@cardid", dataGridView1.Rows[i].Cells["CARD_ID"].Value.ToString()); 
    scm.Parameters.AddWithValue("@fullname", dataGridView1.Rows[i].Cells["FULL_NAME"].Value.ToString()); 
    scm.Parameters.AddWithValue("@serviceid", dataGridView1.Rows[i].Cells["SERVICE_ID"].Value.ToString()); 
    scm.Parameters.AddWithValue("@proccount", dataGridView1.Rows[i].Cells["PROC_COUNT"].Value.ToString()); 
    scm.Parameters.AddWithValue("@readcount", dataGridView1.Rows[i].Cells["READ_COUNT"].Value.ToString()); 
    scm.ExecuteNonQuery(); 
    scm.Parameters.Clear(); 
} 

方法2

只有添加值内循环,但外循环一次申报您的参数。

// Define here just once 
var paramRecord = scm.Parameters.Add("@record", System.Data.SqlDbType.Variant); // There are 6 Add methods in total. 5 of them return SqlParameter so you can use any of those 5 
// the other parameters 
for (int i = 0; i < dataGridView1.Rows.Count; i++) 
{ 
    paramRecord.Value = dataGridView1.Rows[i].Cells["Record"].Value.ToString()); 
    // other parameter values here 
    scm.ExecuteNonQuery(); 
} 
+0

第二种方法更新:paramRecord.Value .Value由红色下划线(错误)@CodingYoshi – ahmad

+0

请参阅我的编辑。在将来你可以按下F12键,当你将光标放在感兴趣的方法上时,在这种情况下就是Add,它会转到你正在使用的方法。我正在使用的方法是返回集合中参数的int(索引),以便使用它来编写'scm.Parameters [返回的int] .Value。现在我正在使用另一种方法,它返回一个SqlParameter对象并具有Value属性。 – CodingYoshi

+0

@ahmadk是否有效? – CodingYoshi