为什么我的 Access DB 拒绝插入日期时间?

Why my Access DB rejects an insert date time?

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

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

我使用此查询在 table 中插入新记录,但是当我执行查询时 returns 我是 '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;

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

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

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

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

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

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

只需从您的集合中删除第一个参数,一切都应该没问题。

旁注。在 Access 以及 MySql 中,您可以根据需要将值分配给 AUTOINCREMENT/AUTONUMBER 字段。如果不关闭列的 IDENTITY 属性,SqlServer 不允许这种做法。