【问题标题】:Trying to insert DateTime.Now into Date/Time field gives "Data type mismatch" error尝试将 DateTime.Now 插入日期/时间字段会出现“数据类型不匹配”错误
【发布时间】:2013-04-19 12:11:14
【问题描述】:

如果我尝试用简单的方法将日期时间写入 MS-Access 数据库中的记录,就像这样

cmd.CommandText = "INSERT INTO [table] ([date]) VALUES (?)";
cmd.Parameters.AddWithValue("?", DateTime.Now);

我收到一个异常提示“条件表达式中的数据类型不匹配”。

谁能告诉我为什么?这里出了什么问题?

经过一点实验,我发现如果我写的话我可以让它工作

OleDbParameter parm = new OleDbParameter("?", OleDbType.Date);
parm.Value = DateTime.Now;
cmd.Parameters.Add(parm);

但这样做似乎不那么整洁,不那么直接。为什么这是必要的?我忽略了一些简单的事情吗?

【问题讨论】:

  • date 可能是这里的关键字。试试INSERT INTO table ([date]) VALUES (?)
  • @LarsTech 当然,它是一个关键字是对的。我更新了问题中的代码。但这不是问题的原因。

标签: c# ms-access oledb


【解决方案1】:

条件表达式不匹配的问题是由于调用AddWithValue时分配给用于表示DateTime.Now值的参数的OleDbType。

AddWithValue 选择的 OleDbType 是 DBTimeStamp,但 Access 需要 OleDbType.Date

http://support.microsoft.com/kb/320435

在 NET 上搜索我发现了另一个有趣的提示。 核心问题在于无法处理 DateTime.Now 的毫秒部分的 OleDbParameter。可能强制 OleDbType 为 Date 毫秒部分被省略。 如果我们从日期中删除毫秒,我还发现插入也适用于 DBTimeStamp 类型。

cmd.Parameters.AddWithValue("?", GetDateWithoutMilliseconds(DateTime.Now));

private DateTime GetDateWithoutMilliseconds(DateTime d)
{
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
}

哦,好吧,等待有人更好地解释这一点。

【讨论】:

  • +1,这意味着cmd.Parameters.AddWithValue("?", DateTime.Today); 可以工作。
  • @LarsTech 是的,但是时间部分已经过去了
  • 必须使用 Access 数据库做出牺牲。 :-)
  • 第n度的爱恨。
  • 谢谢;这解释了为什么该调用适用于大多数日期时间,Now 除外。它也可能与Now 一起工作一千次!顺便说一句,我不是选择使用 Access,你知道的。但是,嘿,这是一个付费客户。
【解决方案2】:

最简单的语句要求数据库引擎使用其Now() 函数来获取当前日期/时间值。或者,如果您对一天中的时间不感兴趣,可以使用它的 Date() 功能; Date() 实际上会将午夜作为一天中的时间。

INSERT INTO [table] ([date]) VALUES (Now());

IOW,您无需费心在.Net 中按摩日期/时间值,以便将其插入您的 Access 数据库。

如果您想要包含文字日期值的 INSERT 语句,请使用 # 日期分隔符。所以要插入今天的日期:

INSERT INTO [table] ([date]) VALUES (#2013-04-25#);

【讨论】:

  • 我认为他使用的是 C# 而不是 VBA
  • @Mike 编程语言无关紧要,因为Now() 是 ACE/Jet 数据库引擎中的内置函数。
  • @Mike Access SQL 支持自己的内置Now()Date() 函数。这不是 c# 与 VBA 类型的问题。无论编程语言如何,当从与数据库的有效连接执行时,该 SQL 语句都将起作用。
  • @HansUp 谢谢。这实际上确实帮助我简化了我的代码,因为这是我在这种情况下需要存储的内容。但我的问题仍然存在,为什么数据库引擎抱怨 DateTime 不是放入日期/时间字段的正确类型。
  • 将日期格式化为 yyyy-mm-dd 并用# 分隔符将其包围。
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 2020-11-25
  • 1970-01-01
  • 2022-11-18
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多