12

如果我尝试以简单的方式将日期时间写入 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);

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

4

2 回答 2

25

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

AddWithValue 选择的 OleDbType 是DBTimeStamp,但 Access 想要一个OleDbType.Date.

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

在网上搜索我发现了另一个有趣的提示。核心问题在于无法处理 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);
}

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

于 2013-04-25T14:52:54.437 回答
4

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

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

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

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

INSERT INTO [table] ([date]) VALUES (#2013-04-25#);
于 2013-04-25T14:31:04.823 回答