尝试将DateTime.Now插入日期/时间字段会出现“数据类型不匹配”错误

如果我尝试将日期时间写入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); 

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

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

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

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

在NET上搜索我发现了另一个有用的提示。 核心问题在于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()); 

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

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

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