尝试将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#);