c# - 将数据插入数据库

标签 c# mysql sql winforms

我需要保存在 C# 表格中插入的信息: Error1

进入我在 Access 2003 数据库中的表:FattureVoci

我的 C# 中的查询是:

cmd1.CommandText = "INSERT INTO FattureVoci ([IDVoce],[CodiceArticolo],[Descrizione],[Quantita],[PrezzoUnitario]) VALUES (@Id,@Prod,@Descr,@Qta,@Prezzo)";
            cmd1.Parameters.AddWithValue("@Categ", this.Categoria.Text);
            cmd1.Parameters.AddWithValue("@Prod", this.Prodotto.Text);
            cmd1.Parameters.AddWithValue("@Data", this.Data.Text);
            cmd1.Parameters.AddWithValue("@Iva", Convert.ToInt32(this.PartitaIVA.Text) );
            cmd1.Parameters.AddWithValue("@Descr", this.Descrizione.Text);
            cmd1.Parameters.AddWithValue("@Qta", Convert.ToInt32(this.Qta.Text));
            cmd1.Parameters.AddWithValue("@Intest", this.Intestatario.Text);
            cmd1.Parameters.AddWithValue("@Id", Convert.ToInt32(this.id.Text));
            cmd1.Parameters.AddWithValue("@Prezzo", Convert.ToInt32(this.Prezzo.Text));

我的数据库中的字段是: Error2

错误是(条件表达式中的数据类型不匹配): Erorr3

最佳答案

你的代码的问题是参数插入的顺序。
这对于 OleDb 至关重要,因为 OleDb 无法通过名称识别参数。它使用占位符在命令文本中的位置来分配相应的参数值。

(OleDb 使用问号作为参数占位符,但毫不奇怪,对于 Access,您还可以使用 @ 前缀,这可能会简化到 Sql Server 的升级)。

因此,当您将 @Categ 作为第一个参数添加时,OleDb 获取它的值并尝试将其分配给 IDVoce 字段。当然,这会因上述错误而失败。

当然,您不能提供比您在查询中设置的更多的参数。

cmd1.CommandText = @"INSERT INTO FattureVoci 
       ([IDVoce],[CodiceArticolo],[Descrizione],[Quantita],[PrezzoUnitario]) 
       VALUES (@Id,@Prod,@Descr,@Qta,@Prezzo)";
cmd1.Parameters.AddWithValue("@Id", Convert.ToInt32(this.id.Text));
cmd1.Parameters.AddWithValue("@Prod", this.Prodotto.Text);
cmd1.Parameters.AddWithValue("@Descr", this.Descrizione.Text);
cmd1.Parameters.AddWithValue("@Qta", Convert.ToInt32(this.Qta.Text));
cmd1.Parameters.AddWithValue("@Prezzo", Convert.ToDecimal(this.Prezzo.Text));


// Actually your query doesn't include these parameters, 
// so you can't put it in the collection
// cmd1.Parameters.AddWithValue("@Data", this.Data.Text);
// cmd1.Parameters.AddWithValue("@Categ", this.Categoria.Text);
// cmd1.Parameters.AddWithValue("@Iva", Convert.ToInt32(this.PartitaIVA.Text) );
//cmd1.Parameters.AddWithValue("@Intest", this.Intestatario.Text);

我已经重新排列了插入参数的顺序以对应于字段名称,但您的字段 Prezzo 似乎是 decimal 类型,而不是 integer,因此如果是这种情况,则需要进行不同的转换

作为最后一点,如果 IDVoce 字段是一个 AutoIncrement 字段,那么您不能在查询中为其值传递参数,您将寻找下一个自动增量数字的工作留给数据库。

关于c# - 将数据插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23077562/

相关文章:

c# - 文件下载在 IE 中通过 https 失败

mysql - SQL 查询 : Number of applications by month, 县和计划

java - 如果外键引用空行而键不可为空,如何不崩溃?

mysql - 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

mysql - mysql中如何使用count if

c# - 查看 Properties.Settings.Default 变量

c# - 关注应用程序 - 与操作系统相关的问题?

php - MySQL Union 不正确返回表名

两个日期和两次之间的mySQL查询

c# - 如何通过变量查找分配的内存?