一尘不染

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

c#

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

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


阅读 562

收藏
2020-05-19

共1个答案

一尘不染

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

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);
}

哦,好,等待有人对此进行更好的解释。

2020-05-19