过程指定了太多参数。它插入第一行,并在第二行给出该错误

时间:2018-12-14 19:57:06

标签: c# sql-server stored-procedures

我正在尝试将所有DataGridView行插入数据库。

这是我的代码:

private void btnSave_Click(object sender, EventArgs e)
{
    try
    {
        using (SqlConnection sqlcon = new SqlConnection(con))
        {
            sqlcon.Open();

            SqlCommand cmd = new SqlCommand("dbo.SaveWorkerSchedulePerDay", sqlcon);
            cmd.CommandType = CommandType.StoredProcedure;

            for (int i = 0; i < eachDayScheduleDG.Rows.Count; i++)
            {
                cmd.Parameters.AddWithValue("@day", DateTime.Now.ToString("yyyy-MM-dd"));
                cmd.Parameters.AddWithValue("@worker_id", eachDayScheduleDG.Rows[i].Cells[0].Value);
                cmd.Parameters.AddWithValue("@timeEnter", Convert.ToDateTime(eachDayScheduleDG.Rows[i].Cells[2].Value));
                cmd.Parameters.AddWithValue("@timeExit", Convert.ToDateTime(eachDayScheduleDG.Rows[i].Cells[3].Value));
                cmd.Parameters.AddWithValue("@costPerDay", getCostDays(eachDayScheduleDG.Rows[i].Cells[0].Value.ToString(), i));

                cmd.ExecuteNonQuery();
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("error: "+ ex);
    }
}

我收到以下错误:

  

过程指定了太多参数。

我知道它正在插入第一行而没有任何错误。

2 个答案:

答案 0 :(得分:2)

问题在于,每次for循环迭代时,您都在向命令中添加越来越多的参数。

相反,请像这样重用参数:

// First, create the parameters without values.
cmd.Parameters.Add("@day", SqlDbType.DateTime);
cmd.Parameters.Add("@worker_id", SqlDbType.Int);
cmd.Parameters.Add("@timeEnter", SqlDbType.DateTime);
cmd.Parameters.Add("@timeExit", SqlDbType.DateTime);
cmd.Parameters.Add("@costPerDay", SqlDbType.Decimal);

for (int i = 0; i < eachDayScheduleDG.Rows.Count; i++)
{
    // Assign the values to the existing parameters.
    cmd.Parameters["@day"].Value = DateTime.Now.ToString("yyyy-MM-dd");
    cmd.Parameters["@worker_id"].Value = eachDayScheduleDG.Rows[i].Cells[0].Value);
    cmd.Parameters["@timeEnter"].Value = Convert.ToDateTime(eachDayScheduleDG.Rows[i].Cells[2].Value);
    cmd.Parameters["@timeExit"].Value = Convert.ToDateTime(eachDayScheduleDG.Rows[i].Cells[3].Value);
    cmd.Parameters["@costPerDay"].Value = getCostDays(eachDayScheduleDG.Rows[i].Cells[0].Value.ToString(), i);

    cmd.ExecuteNonQuery();
}

请确保使用正确的SqlDbType常量。

答案 1 :(得分:0)

接受创建命令的两行并将其移至for循环内。这样,您就不必再为同一行的每一行添加更多参数了。