【问题标题】:Why my Access DB rejects an insert date time?为什么我的 Access DB 拒绝插入日期时间?
【发布时间】:2020-08-03 08:35:29
【问题描述】:

我在 Access DB 上创建了这个表。

string sql = $"CREATE TABLE Eventi (" +
  $"id AUTOINCREMENT PRIMARY KEY," +
  $"tipologia varchar(255)," +
  $"denominazione varchar(255)," +
  $"descrizione varchar(255)," +
  $"data date," +
  $"costo decimal," +
  $"prezzo decimal" +
$");";

我使用此查询在表中插入新记录,但是当我执行查询时,它返回给我一个 'System.Data.OleDb.OleDbException: 'Data type mismatch in criteria expression.'。

cmd.CommandText = "INSERT INTO Eventi (tipologia,denominazione,descrizione,data,costo,prezzo) VALUES " +
"(@tipologia, @denominazione, @descrizione, @data, @costo, @prezzo);";

这里是添加查询参数的代码:

cmd.Parameters.Add("@id", OleDbType.Integer).Value = v.Id;
cmd.Parameters.Add("@tipologia", OleDbType.VarChar, 255).Value = v.Tipologia;
cmd.Parameters.Add("@denominazione", OleDbType.VarChar, 255).Value = v.Denominazione;
cmd.Parameters.Add("@descrizione", OleDbType.VarChar, 255).Value = v.Descrizione;
cmd.Parameters.Add("@data", OleDbType.Date).Value = v.Data.Date;
cmd.Parameters.Add("@costo", OleDbType.Double).Value = v.Costo;
cmd.Parameters.Add("@prezzo", OleDbType.Double).Value = v.Prezzo;

【问题讨论】:

  • OleDbType.Decimal。 Double 和 Decimal 是不同的类型。
  • 我想知道它是否会与 AddWithValue 一起解决! :)

标签: c# database ado.net oledb


【解决方案1】:

您查询中的真正问题不是小数和双精度之间的类型差异。虽然始终表示正确的数据类型确实是一种很好的做法,但在这种情况下,双精度类型的参数可以很容易地转换为十进制 if 属性 Costo Prezzo 是十进制类型。
真正的问题是存在名为 @ID 的第一个参数,而您的字段名称和参数占位符中没有此字段。

在 OleDb 中,参数无法通过名称识别,而是使用 name 属性分配给占位符。 (事实上​​,文档告诉我们用 ? 字符来命名这些占位符)。在 OleDb 中,参数是位置参数,因此第一个参数将用作第一个占位符的值。在您的代码中,这会导致每个参数移动一个位置,从而将参数 @Descrizione 分配给字段 data,当然该字符串不是日期。

只需从您的集合中删除第一个参数,一切都会好起来的。

旁注。在 Access 中,以及在 MySql 中,如果您真的需要,您可以为 AUTOINCREMENT/AUTONUMBER 字段分配一个值。相反,如果不关闭列的 IDENTITY 属性,SqlServer 不允许这种做法。

【讨论】:

    【解决方案2】:

    不需要 ID 值,因为它是一个自动增量字段。

    正如 Liam 在 cmets 中指出的,您需要使用 OleDbType.Decimal 而不是 OleDbType.Decimal

    或者你也可以不声明类型(它将自动决定)

    cmd.Parameters.Add(new SqlParameter("@CODE", myCode));
    

    【讨论】:

    • 我怀疑你想要SqlParameter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2016-07-16
    • 1970-01-01
    • 2016-04-19
    • 2012-05-01
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多