C# 如何通过该过程将多行从gridview存储到数据库

C# 如何通过该过程将多行从gridview存储到数据库,c#,asp.net,sql-server,stored-procedures,gridview,C#,Asp.net,Sql Server,Stored Procedures,Gridview,我希望通过该过程将多行从gridview存储到数据库。如果gridview中只有一行,我的代码将正确执行,但如果有多行,它将抛出一个错误 过程或函数insertDetails指定的参数太多 这是我的C#代码: protectedvoid按钮2\u单击(对象发送者,事件参数e) { for(int i=0;i

我希望通过该过程将多行从gridview存储到数据库。如果gridview中只有一行,我的代码将正确执行,但如果有多行,它将抛出一个错误

过程或函数insertDetails指定的参数太多

这是我的C#代码:

protectedvoid按钮2\u单击(对象发送者,事件参数e)
{
for(int i=0;i
我发现导致问题的
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();
            }
        }
    }
}
protectedvoid按钮2\u单击(对象发送者,事件参数e)
{
使用(var con=newsqlconnection(“[DB connection string]”)
{
使用(var cmd=new SqlCommand())
{
cmd.Connection=con;
cmd.CommandText=“insertDetails”;
cmd.CommandType=CommandType.storedProcess;
//创建循环外部的所有参数
//无需在此处使用`cmd.Parameters.Clear()`
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();
对于(int i=0;i
旁注:
SqlConnection
SqlCommand
使用
using
语句,因为它们都实现了
IDisposable

类似问题:


您只需在环路外打开和关闭连接一次。重新更正错误-将参数与存储过程和表中的参数进行比较。
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();
            }
        }
    }
}