gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:43:43 41 4
gpt4 key购买 nike

我正在尝试使用 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);

也不行。我通过谷歌或 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/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com