使用Command Parametrs C#更新并插入一个按钮

时间:2019-07-17 13:39:50

标签: c# sql-server sql-server-express

我要更新并插入一个按钮。

我希望它检查是否有数据,然后它将仅对其进行更新,如果没有,则将其添加。

我不知道我在这段代码中缺少什么

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();

2 个答案:

答案 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?