【问题标题】:The variable name '@fname' has already been declared. Variable names must be unique within a query batch or stored procedure变量名“@fname”已被声明。变量名称在查询批处理或存储过程中必须是唯一的
【发布时间】:2018-07-04 00:59:13
【问题描述】:

我想将数据从 LIST 保存到 SQL Server,但错误是:

变量名'@fname'已经被声明了

这是我的代码:

public void Save()
{
    string insert = "Insert into Professor (fname, lname, dateOfBirth, gender, country, email, mdp) Values (@fname, @lname, @dateOfBirth, @gender, @country, @email, @mdp) ";

    SqlCommand vide = new SqlCommand("Truncate table Professor", mode);

    // Save data from LIST to SERVER
    mode.Open();

    // Truncate the Table
    vide.ExecuteNonQuery();

    // Save all data to SQL Server
    SqlCommand cmd = new SqlCommand(insert, mode);

    for(int i = 0; i < pf.Count; i++)
    {
        cmd.Parameters.AddWithValue("@fname", pf[i].fname);
        cmd.Parameters.AddWithValue("@lname", pf[i].lname);
        cmd.Parameters.AddWithValue("@dateOfBirth", pf[i].dateOfBirth);
        cmd.Parameters.AddWithValue("@gender", pf[i].sexe);
        cmd.Parameters.AddWithValue("@country", pf[i].country);
        cmd.Parameters.AddWithValue("@email", pf[i].email);
        cmd.Parameters.AddWithValue("@mdp", pf[i].password);

        cmd.ExecuteNonQuery();
    }

    mode.Close();

    MessageBox.Show("Your compte has been added!");
} 

这是我将所有数据从 sql 保存到列表的上传功能

public void Upload()
{
    pf.Clear();
    mode.Open();

    SqlCommand cmd = new SqlCommand("SELECT * FROM Professor", mode);

    SqlDataReader myReader = cmd.ExecuteReader();

    while (myReader.Read())
    {
       Professor p = new Professor(myReader["fname"].ToString(), myReader["lname"].ToString(),Convert.ToDateTime(myReader["dateOfBirth"].ToString()),myReader["country"].ToString(),myReader["gender"].ToString(),myReader["email"].ToString(),myReader["mdp"].ToString());
       pf.Add(p);
    }

    mode.Close();
}

顺便说一句,我把truncate只是为了避免由于主键而导致重复数据的问题,这就是为什么我将所有sql数据保存到我的列表中,并且在这个函数中我想添加新数据以保存干净的数据到我的 SQL Server。

我该如何解决?

【问题讨论】:

  • 您正在尝试将参数添加到循环中的命令。这将导致多次添加相同的参数,这就是您收到此错误的原因。您应该在循环之外添加参数,并在循环中设置它们的值。
  • Chetan Ranpariya 但是我该怎么做,请给我一个例子!!
  • 如果您阅读了错误消息中的文字,它们会非常清楚地说明问题。在第一次通过循环时,添加参数。之后的每一次通过,它们都已经存在,你不能再次添加它们。错误消息不仅会占用屏幕上的空间。它们提供了有关问题的信息,但您实际上必须阅读它们才能使用这些信息。
  • 感谢你们的cmets。

标签: c# sql sql-server visual-studio


【解决方案1】:

您正在尝试将参数添加到循环中的命令。这将导致多次添加相同的参数,这就是您收到此错误的原因。您应该在循环之外添加参数,并在循环中设置它们的值。

Save 方法更改如下。

public void Save()
{
    string insert = "Insert into Professor (fname,lname,dateOfBirth,gender,country,email,mdp) Values(@fname,@lname,@dateOfBirth,@gender,@country,@email,@mdp) ";
    SqlCommand vide = new SqlCommand("Truncate table Professor", mode);
    //Save data from LIST to SERVER
    mode.Open();
    //Truncate the Table
    vide.ExecuteNonQuery();
    //Save All data to SQL
    SqlCommand cmd = new SqlCommand(insert, mode);
    //Add parameters to the command
    cmd.Parameters.Add("@fname", SqlDbType.VarChar);
    cmd.Parameters.Add("@lname", SqlDbType.VarChar);
    cmd.Parameters.Add("@dateOfBirth", SqlDbType.DateTime);
    // Not sure what value you are storing for gender so setting type to VarChar  
    cmd.Parameters.Add("@gender", SqlDbType.VarChar); 
    cmd.Parameters.Add("@country", SqlDbType.VarChar);
    cmd.Parameters.Add("@email", SqlDbType.VarChar);
    cmd.Parameters.Add("@mdp", SqlDbType.VarChar);

    //Setting values of parameters and execute the command
    for(int i=0;i<pf.Count;i++)
    {
        cmd.Parameters["@fname"].Value = pf[i].fname;
        cmd.Parameters["@lname"].Value = pf[i].lname;
        cmd.Parameters["@dateOfBirth"].Value = pf[i].dateOfBirth;
        cmd.Parameters["@gender"].Value = pf[i].sexe;
        cmd.Parameters["@country"].Value = pf[i].country;
        cmd.Parameters["@email"].Value = pf[i].email;
        cmd.Parameters["@mdp"].Value = pf[i].password;
        cmd.ExecuteNonQuery();
    }
    mode.Close();
    MessageBox.Show("Your compte has been added!");
} 

【讨论】:

  • 谢谢你 Chetan Ranpariya 效果很好,非常感谢。
猜你喜欢
  • 2020-02-01
  • 2015-05-26
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多