变量名“ @fname”已经声明。变量名称在查询批处理或存储过程中必须唯一

时间:2018-07-04 00:59:13

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

我想将数据从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。

我该如何解决?

1 个答案:

答案 0 :(得分:5)

您正在尝试向循环中的命令添加参数。这将导致多次添加相同的参数,这就是您收到此错误的原因。您应该在循环外添加参数,然后只需在循环中设置其值即可。

已将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!");
}