在参数化的 OleDbCommand 中使用 DateTime 的异常

Posted

技术标签:

【中文标题】在参数化的 OleDbCommand 中使用 DateTime 的异常【英文标题】:Exception using DateTime in a parameterized OleDbCommand 【发布时间】:2010-09-27 21:24:06 【问题描述】:

我正在尝试使用 C# 中的参数化 OleDbCommand 将 System.DateTime 插入 Access 数据库。但是,它会引发 Data type mismatch in criteria expression 异常。

这是我的代码:

string statement = "INSERT INTO Log (SCTID, LogDateTime, Type, Message, Visible)" +
    "VALUES (?, ?, ?, ?, ?);";

OleDbCommand insertCommand = new OleDbCommand(statement, connection);

// Add parameters to the command            
insertCommand.Parameters.AddWithValue("@SCTID", OleDbType.Integer).Value = SCTID;
insertCommand.Parameters.AddWithValue("@LogDateTime", OleDbType.DBTime).Value = dateTime;
insertCommand.Parameters.AddWithValue("@Type", OleDbType.Integer).Value = (int)logType;
insertCommand.Parameters.AddWithValue("@Message", OleDbType.BSTR).Value = message;
insertCommand.Parameters.AddWithValue("@Visible", OleDbType.Boolean).Value = visible;

insertCommand.ExecuteNonQuery();

当我注释掉 LogDateTime 行时,它的其余部分就起作用了。我的问题是,无论我对 DateTime 类型使用什么,它都不起作用。我试过了:

OleDbType.Date, OleDbType.DBDate, OleDBType.DBTimeStamp, DbType.Date, DbType.DateTime, DbType.DateTime2

我也试过了:

insertCommand.Parameters.AddWithValue("@LogDateTime", dateTime);

它也不起作用。我没有通过 Google 或 SO 阅读任何内容。另外,请注意,我确实需要日期和时间,而不仅仅是日期。

【问题讨论】:

数据库中的LogDateTime列是什么类型? 尝试将 dateTime 转换为字符串。 Access 中的 LogDateTime 列的类型是什么? LogDateTime 是数据库中的日期/时间。 dateTime 的值是多少?我认为 .NET 和 Access 有不同的最小值和最大值。 【参考方案1】:
insertCommand.Parameters.AddWithValue("@SCTID", OleDbType.Integer).Value = SCTID;
...

这是使用AddWithValue 的一种非常奇怪的方式。它的第二个参数不是类型 - 它是您希望它具有的值。如给定的那样,您最终只使用枚举成员OleDbType.Integer 的整数值,然后立即通过分配给Value 属性来覆盖它。它应该是:

insertCommand.Parameters.AddWithValue("@SCTID", SCTID);

或:

insertCommand.Parameters.Add("@SCTID", OleDbType.Integer).Value = SCTID;

关于语句本身 - 为什么在命令文本中使用 ? 作为占位符,但在向集合中添加参数时使用名称?

关于实际问题 - 看起来是known bug,解决方法是在分配之前截断DateTime 值中的毫秒数,并使用OleDbType.Date

【讨论】:

啊,是的,原谅我奇怪的参数。我发现的第一个关于参数化的教程就是这样做的,虽然我有一种感觉很奇怪,但我还没有开始改变它们。非常感谢您的提示。另外,我会试一试截断毫秒,似乎它可能有效。

以上是关于在参数化的 OleDbCommand 中使用 DateTime 的异常的主要内容,如果未能解决你的问题,请参考以下文章

在 OleDbCommand 的插入语句中指定函数

asp.net oledbcommand 返回所有行

我一直在使用 OleDbConnection 和 OleDbCommand 插入记录而崩溃

c#如何使用OleDbCommand在指定列名下的Excel工作表的下一个可用行中添加指定值

使用 oledbcommand.executeNonQuery() 更新 MS Access 记录时出现问题,结果未更新

带有更新查询的 OleDbCommand 导致 OleDbException