我想通过该过程将gridview中的多行存储到数据库中。如果gridview中只有一行,我的代码会正确执行,但如果有多行,则会抛出错误
过程或函数insertDetails指定的参数太多
这是我的C#代码:
protected void Button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < GridView1.Rows.Count;i++ )
{
cmd.CommandText = "insertDetails";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", GridView1.Rows[i].Cells[2].Text);
cmd.Parameters.AddWithValue("@name", GridView1.Rows[i].Cells[3].Text);
cmd.Parameters.AddWithValue("@email", GridView1.Rows[i].Cells[4].Text);
cmd.Parameters.AddWithValue("@contact", GridView1.Rows[i].Cells[5].Text);
cmd.Parameters.AddWithValue("@Addres", GridView1.Rows[i].Cells[6].Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
cmd.Dispose();
}
}
答案 0 :(得分:0)
我发现导致问题的for
循环,因为每次迭代都添加了新SqlParameter
而没有清除先前创建的迭代,因此在第二行迭代传递参数的数量将超过存储过程中定义的总参数(超过5)。
您需要先在循环外定义参数,然后在循环中设置它们的值,如下例所示:
protected void Button2_Click(object sender, EventArgs e)
{
using (var con = new SqlConnection("[DB connection string]"))
{
using (var cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandText = "insertDetails";
cmd.CommandType = CommandType.StoredProcedure;
// create all parameters outside the loop
// no need to use `cmd.Parameters.Clear()` here
cmd.Parameters.Add("@id", SqlDbType.Int);
cmd.Parameters.Add("@name", SqlDbType.VarChar);
cmd.Parameters.Add("@email", SqlDbType.VarChar);
cmd.Parameters.Add("@contact", SqlDbType.VarChar);
cmd.Parameters.Add("@Addres", SqlDbType.VarChar);
con.Open();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
// assign parameter values inside the loop and execute the query
cmd.Parameters["@id"].Value = GridView1.Rows[i].Cells[2].Text);
cmd.Parameters["@name"].Value = GridView1.Rows[i].Cells[3].Text);
cmd.Parameters["@email"].Value = GridView1.Rows[i].Cells[4].Text);
cmd.Parameters["@contact"].Value = GridView1.Rows[i].Cells[5].Text);
cmd.Parameters["@Addres"].Value = GridView1.Rows[i].Cells[6].Text);
cmd.ExecuteNonQuery();
}
}
}
}
旁注:对using
和SqlConnection
使用SqlCommand
语句,因为它们已实施IDisposable
。
类似问题:
Should I call Parameters.Clear when reusing a SqlCommand with a transation?