我想将数据从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。
我该如何解决?
答案 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!");
}