试图插入日期时间.现在在Date/Time字段中显示“数据类型不匹配”;错误

本文关键字:显示 数据类型 不匹配 错误 字段 Time 日期 插入 时间 Date | 更新日期: 2023-09-27 18:10:48

如果我尝试用简单的方法在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/Time字段中显示“数据类型不匹配”;错误

标准表达式不匹配的问题是由于分配给用于表示DateTime的参数的OleDbType。当你调用AddWithValue .

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

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

在网上搜索,我发现了另一个有趣的提示。核心问题在于OleDbParameter不能处理DateTime.Now的毫秒部分。可能强制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);
}

哦,好吧,等着有人更好地解释一下。

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

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

现在,您不需要在.Net中修改日期/时间值,以便将其插入到Access db中。

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

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