c# - 在参数化 OleDbCommand 中使用 DateTime 时出现异常

标签 c# ms-access datetime oledb

我正在尝试使用 C# 中的参数化 OleDbCommand 将 System.DateTime 插入 Access 数据库。但是,它会引发条件表达式中的数据类型不匹配异常。

这是我的代码:

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 读过的内容都不起作用。另外,请注意,我确实需要日期和时间,而不仅仅是日期。

最佳答案

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

关于c# - 在参数化 OleDbCommand 中使用 DateTime 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3808012/

相关文章:

c# - 如何在 C# 中使用 XPath 检索最后一个节点?

c# - Azure Web 作业/队列 - DecoderFallbackException

sql - 如果 SQL 或 Access 查询中的逻辑

vba - 隐藏数据表中的列

c# - 错误 500 Web 请求无法抓取网站

sql - Excel Vba - 在 sql 字符串中使用撇号

php - 使用 strtotime 获取一个月中的第一个工作日

php - 从 SQL 日期时间转换为 PHP DateTime,使用

javascript - Date.prototype.toLocaleTimeString() 中的 hourCycle 选项有什么区别

c# - makepri.exe 是如何集成到 MSBuild 中的?