【问题标题】:How to store multiple rows from gridview to database through the procedure如何通过程序将gridview中的多行存储到数据库中
【发布时间】:2018-09-30 08:07:16
【问题描述】:

我想通过该过程将网格视图中的多行存储到数据库中。如果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();
    }
}

【问题讨论】:

  • 您只想在循环外打开和关闭一次连接。重新出错 - 将参数与存储过程和表中的参数进行比较。

标签: c# asp.net sql-server stored-procedures gridview


【解决方案1】:

我发现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();
            }
        }
    }
}

旁注:SqlConnectionSqlCommand 都使用using 语句,因为它们实现了IDisposable

类似问题:

Should I call Parameters.Clear when reusing a SqlCommand with a transation?

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2011-01-27
    • 2017-09-01
    • 1970-01-01
    • 2015-04-10
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多