将数据插入DB

时间:2014-04-15 07:47:04

标签: c# mysql sql winforms

我需要保存以C#格式插入的信息: Error1

进入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));

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

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

2 个答案:

答案 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));