【问题标题】:C#-The variable name '@startdate' has already been declared.Variable names must be unique a query batch or stored procedureC# - 变量名称“@startdate”已被声明。变量名称在查询批处理或存储过程中必须是唯一的
【发布时间】:2016-07-31 14:34:14
【问题描述】:

我需要一种方法来更新我的 datagridview 中的单元格并使用查询将其保存到数据库中,但我遇到了这个异常:

变量名'@startdate'已经被声明。变量 名称在查询批处理或存储过程中必须是唯一的

这是我的代码:

private void toolStripLabel1_Click(object sender, EventArgs e)
{
    try
    {
        conn.Open();
        string query2 = "UPDATE [Semester] SET [Start_Date]=@startdate, " +
                        " [End_Date]=@enddate WHERE [Sem_Num]=@sem";
        cmd = new SqlCommand(query2, conn);
        if (dataGridView1.Rows.Count > 0)
        {
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                cmd.Parameters.AddWithValue("@startdate", 
                                       dataGridView1.Rows[i].Cells[1].Value.ToString());
                cmd.Parameters.AddWithValue("@enddate", 
                                       dataGridView1.Rows[i].Cells[2].Value.ToString());
                cmd.Parameters.AddWithValue("@sem", 
                                  Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value));
                this.dataGridView1.EndEdit();
                cmd.ExecuteNonQuery();

            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        conn.Close();
    }
}

【问题讨论】:

  • 特别是在这种情况下,日期被转换为字符串并且数据库需要将这些字符串重新转换回日期。错误的秘诀。
  • 您不应保留全局 conn 对象。只需在方法内创建一个新的。

标签: c# .net sql-server sql-server-2008


【解决方案1】:

清除每次迭代中的参数:

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    cmd.Parameters.Clear();
    cmd.Parameters.AddWithValue("@startdate", dataGridView1.Rows[i].Cells[1].Value.ToString());
    cmd.Parameters.AddWithValue("@enddate", dataGridView1.Rows[i].Cells[2].Value.ToString());
    cmd.Parameters.AddWithValue("@sem", Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value));
    this.dataGridView1.EndEdit();
    cmd.ExecuteNonQuery();

}

或者在循环外定义参数,在里面设置值:

var startParam = cmd.Parameters.Add("@startdate", SqlDbType.DateTime2);
var endParam = cmd.Parameters.Add("@enddate", SqlDbType.DateTime2);
var semParam = cmd.Parameters.Add("@sem", SqlDbType.Int);

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    startParam.Value = Convert.ToDateTime(dataGridView1.Rows[i].Cells[1].Value);
    endParam.Value = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].Value);
    semParam.Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value);
    cmd.ExecuteNonQuery();
}

【讨论】:

    【解决方案2】:

    每次运行循环时,您都在向同一个命令添加新参数。

    您需要清除参数或创建新命令。

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2015-05-26
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2020-08-23
      相关资源
      最近更新 更多