当我想在数据库中添加数据时,它不起作用;但是,我可以在数据网格中看到数据(我的项目是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);
}
对不起,我是法国人;)
答案 0 :(得分:4)
正如@NoneOfTheAbove已经说过的那样,这里有很多问题。没有提到的一个是您试图添加数量和价格作为引号中包含的文本。
我假设表中的两列quantite_pdt
(数量)和prix_pdt
(价格)是数字类型。但是您可以通过使用命令参数来避免此问题。
它们会自动处理正确的格式。这对于DateTime
值特别有价值,但对于string
值也可以包含引号。
在下面的示例中,我假设前两列是文本列,数量是int
,价格是decimal
。您必须使用与表中相应列类型兼容的类型的值来传递命令参数。 (在现实生活中的代码中,您可能希望使用Int32.TryParse
和Decimal.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()
执行命令。此方法告诉您该命令影响了多少条记录。
答案 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运行它以确保其正确连接