SqlCommand不添加数据

时间:2019-01-27 16:19:49

标签: c# sql-server

当我想在数据库中添加数据时,它不起作用;但是,我可以在数据网格中看到数据(我的项目是Windows窗体项目)

我的代码:

string query = @"insert into produits
                    (ref_pdt, designation_pdt, quantite_pdt, prix_pdt)
                 values ('"+ tb_ref_add.Text + "','" + tb_des_add.Text + "','" + 
                    tb_qte_add.Text + "','" + tb_prix_add.Text + "')";
    SqlCommand cmd = new SqlCommand(query, loaddatabaseconnexion.connexion_BDD());
    SqlDataReader DataReader;
    try
    {
        DataReader = cmd.ExecuteReader();
        MessageBox.Show("Données sauvegardées !");
        formulaire_principal.tableau();
    }
    catch (Exception es)
    {
        MessageBox.Show(es.Message);
    }

对不起,我是法国人;)

2 个答案:

答案 0 :(得分:4)

正如@NoneOfTheAbove已经说过的那样,这里有很多问题。没有提到的一个是您试图添加数量和价格作为引号中包含的文本。 我假设表中的两列quantite_pdt(数量)和prix_pdt(价格)是数字类型。但是您可以通过使用命令参数来避免此问题。 它们会自动处理正确的格式。这对于DateTime值特别有价值,但对于string值也可以包含引号。

在下面的示例中,我假设前两列是文本列,数量是int,价格是decimal。您必须使用与表中相应列类型兼容的类型的值来传递命令参数。 (在现实生活中的代码中,您可能希望使用Int32.TryParseDecimal.TryParse并进行适当的错误处理。)并且不要忘记使SqlDbType和本示例中使用的转换适应您的实际的列类型。

string query = @"insert into produits
                (ref_pdt, designation_pdt, quantite_pdt, prix_pdt)
                values (@refp, @desig, @quant, @prix)";
try {
    using (var conn = loaddatabaseconnexion.connexion_BDD())
    using (var cmd = new SqlCommand(query, conn)) {
        cmd.Parameters.Add("@refp", SqlDbType.NVarChar).Value = tb_ref_add.Text;
        cmd.Parameters.Add("@desig", SqlDbType.NVarChar).Value = tb_des_add.Text;
        cmd.Parameters.Add("@quant", SqlDbType.Int).Value = Int32.Parse(tb_qte_add.Text);
        cmd.Parameters.Add("@prix", SqlDbType.Decimal).Value =
            Decimal.Parse(tb_qte_add.Text);

        conn.Open();
        int rowsAffected = cmd.ExecuteNonQuery();
        if (rowsAffected == 0) {
            MessageBox.Show("Il y a eu un problème !");
        } else {
            MessageBox.Show("Données sauvegardées !");
            formulaire_principal.tableau();
        }
    }
} catch (Exception ex) {
    MessageBox.Show(ex.Message);
}

我还假设loaddatabaseconnexion.connexion_BDD()在每次通话时都会创建一个新连接。这很重要,因为using语句会自动关闭并在最后放置连接。

如您所见,由于没有记录返回,因此我正在使用cmd.ExecuteNonQuery()执行命令。此方法告诉您该命令影响了多少条记录。

另请参见(法语):.Net, SQL Server, et les requêtes paramétrées (C#)

答案 1 :(得分:0)

如评论中所述,您必须重新使用自己的方法来避免使用sql injection。您最好尝试使用诸如实体框架之类的ORM,或者至少使用存储过程。

但是,如果由于某种原因必须维护此代码,则需要使用ExecuteNonQuery而不是ExecuteReader check this

如果您对数据类型或字符串连接有疑问,下面的代码将打入数据库并工作或引发异常

    string query = @"insert into produits
                    (ref_pdt, designation_pdt, quantite_pdt, prix_pdt)
                 values ('"+ tb_ref_add.Text + "','" + tb_des_add.Text + "','" + 
                    tb_qte_add.Text + "','" + tb_prix_add.Text + "')";
    SqlCommand cmd = new SqlCommand(query, loaddatabaseconnexion.connexion_BDD());
    SqlDataReader DataReader;
    try
    {
        //I assume you have already opened the connection as you didn't mention any exceptions in your question 
        cmd.ExcuteNonQuery();
        MessageBox.Show("Données sauvegardées !");
        formulaire_principal.tableau();
    }
    catch (Exception es)
    {
        MessageBox.Show(es.Message);
    }

提示:

您最好记录字符串query或在调试模式下对其进行监视,然后尝试直接从SSMS运行它以确保其正确连接