我需要保存以C#格式插入的信息:
进入Access 2003 DB中的表: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));
我的数据库中的字段是:
错误是(条件表达式中数据不匹配的类型):
答案 0 :(得分:1)
您的代码存在的问题是参数插入的顺序 这对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是十进制类型,而不是整数,因此如果是这种情况则需要进行不同的转换
最后一点,如果IDVoce
字段是AutoIncrement字段,那么您无法在查询中为其值传递参数,您可以将工作留给数据库查找下一个自动增量编号。
答案 1 :(得分:0)
问题1:您在查询中提到您要为5列插入值,但是要向命令对象添加9个参数。
问题2:我认为OleDB不接受命名参数,因此您需要编写参数化查询,如下所示:
cmd1.CommandText = "INSERT INTO FattureVoci
([IDVoce],[CodiceArticolo],[Descrizione],[Quantita],[PrezzoUnitario])
VALUES (?,?,?,?,?)";
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.ToInt32(this.Prezzo.Text));