我要更新并插入一个按钮。
我希望它检查是否有数据,然后它将仅对其进行更新,如果没有,则将其添加。
我不知道我在这段代码中缺少什么
cnx.Open();
SqlCommand cmd = cnx.CreateCommand();
SqlDataReader dr;
cmd.CommandText = "Select * from TPayement where ID='" + txt_ID.Text + "'";
dr = cmd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
cmd.CommandText = "update TPayement (ID, Nom, QUA, Salaire, NombreJour, HeurSupplimentaire, SalaireHeur, Somme) values (@ID, @Nom, @QUA, @Salaire, @NombreJour, @HeurSupplimentaire, @SalaireHeur, @Somme) where ID='" + txt_ID.Text + "'";
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters.Add("@Nom", SqlDbType.VarChar, 50);
cmd.Parameters.Add("@QUA", SqlDbType.VarChar, 50);
cmd.Parameters.Add("@Salaire", SqlDbType.Float);
cmd.Parameters.Add("@NombreJour", SqlDbType.Float);
cmd.Parameters.Add("@HeurSupplimentaire", SqlDbType.Float);
cmd.Parameters.Add("@SalaireHeur", SqlDbType.Float);
cmd.Parameters.Add("@Somme", SqlDbType.Float);
cmd.Parameters["@ID"].Value = txt_ID.Text;
cmd.Parameters["@Nom"].Value = txt_Nom.Text;
cmd.Parameters["@QUA"].Value = txt_QUA.Text;
cmd.Parameters["@Salaire"].Value = txt_Salaire.Text;
cmd.Parameters["@NombreJour"].Value = txt_NBRJ.Text;
cmd.Parameters["@HeurSupplimentaire"].Value = txt_HSUP.Text;
cmd.Parameters["@SalaireHeur"].Value = txt_SalireHeur.Text;
cmd.Parameters["@Somme"].Value = txt_Somme.Text;
cmd.ExecuteNonQuery();
MessageBox.Show("Se payement est enregistrer");
}
else
{
cmd.CommandText = "insert into TPayement (ID, Nom, QUA, Salaire, NombreJour, HeurSupplimentaire, SalaireHeur, Somme) values (@ID, @Nom, @QUA, @Salaire, @NombreJour, @HeurSupplimentaire, @SalaireHeur, @Somme)";
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters.Add("@Nom", SqlDbType.VarChar, 50);
cmd.Parameters.Add("@QUA", SqlDbType.VarChar, 50);
cmd.Parameters.Add("@Salaire", SqlDbType.Float);
cmd.Parameters.Add("@NombreJour", SqlDbType.Float);
cmd.Parameters.Add("@HeurSupplimentaire", SqlDbType.Float);
cmd.Parameters.Add("@SalaireHeur", SqlDbType.Float);
cmd.Parameters.Add("@Somme", SqlDbType.Float);
cmd.Parameters["@ID"].Value = txt_ID.Text;
cmd.Parameters["@Nom"].Value = txt_Nom.Text;
cmd.Parameters["@QUA"].Value = txt_QUA.Text;
cmd.Parameters["@Salaire"].Value = txt_Salaire.Text;
cmd.Parameters["@NombreJour"].Value = txt_NBRJ.Text;
cmd.Parameters["@HeurSupplimentaire"].Value = txt_HSUP.Text;
cmd.Parameters["@SalaireHeur"].Value = txt_SalireHeur.Text;
cmd.Parameters["@Somme"].Value = txt_Somme.Text;
dr.Close();
cmd.ExecuteNonQuery();
MessageBox.Show("Se payement est enregistrer");
}
dr.Close();
cnx.Close();
答案 0 :(得分:1)
问题是您使用Command对象cmd
打开了DataReader。
然后,在关闭DataReader之前,您尝试重新利用相同的cmd
对象并执行它。
您必须先关闭DataReader,然后才能重新使用cmd
对象进行插入或更新。
答案 1 :(得分:0)
只是一个小建议,您不应该那样创建查询,因为它可以进行sql注入。您应该提供ID参数。一些恶意用户可以在txt_ID文本框中编写查询,以便向您的查询中注入代码。
cmd.CommandText = "Select * from TPayement where ID='" + txt_ID.Text + "'";
您可以阅读以下内容:How does the SQL injection from the "Bobby Tables" XKCD comic work?