【问题标题】:Inserting data into DB将数据插入数据库
【发布时间】:2014-05-29 10:39:34
【问题描述】:

我需要保存以 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));

我的数据库中的字段是:

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

【问题讨论】:

  • 您在 sql 命令中声明了 5 个参数,但您尝试添加 9 个参数值?你能把你的例外翻译成英文吗?列类型到底是什么?
  • uhhmmm 你能理解错误吗?
  • 错误是条件表达式中的数据类型不匹配

标签: c# mysql sql winforms


【解决方案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 字段,那么您不能在查询中为其值传递参数,您可以将查找下一个自动增量编号的工作留给数据库。

【讨论】:

  • 哦,基本上我不使用的参数我必须消除或使它们成为 cmets?我不能把它们留在代码中所以
  • 我已经评论了它们,因为我不确定你是否需要它们,实际上,命令文本不需要它们,因此,如果你将它们添加到参数集合中,你可以有一个错误(肯定在 Sql Server 中,不确定 OleDb 和 Access)
  • 谢谢,我终于明白了。
【解决方案2】:

问题 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));

【讨论】:

  • 命名参数问题不是 Access 特有的,还是 ODBC 特有的?我不完全确定。
  • @PatrickHofman OleDb 和 ODBC 都有这个限制。访问允许@前缀
  • 感谢您的澄清。
  • 好吧,我没有添加其他参数,所以我可以这样保留它们吗?我没有在查询中使用它们
猜你喜欢
  • 2020-07-05
  • 2023-04-10
  • 2021-10-21
  • 2014-08-08
  • 2014-05-04
  • 2013-05-29
  • 2015-02-27
相关资源
最近更新 更多