如果我尝试将日期时间写入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分配给了用于表示DateTime.Now值的参数AddWithValue。
AddWithValue
AddWithValue选择的OleDbType是DBTimeStamp,但是Access想要一个OleDbType.Date。
DBTimeStamp
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); }
哦,好,等待有人对此进行更好的解释。