在参数化的 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 的异常的主要内容,如果未能解决你的问题,请参考以下文章
我一直在使用 OleDbConnection 和 OleDbCommand 插入记录而崩溃
c#如何使用OleDbCommand在指定列名下的Excel工作表的下一个可用行中添加指定值
使用 oledbcommand.executeNonQuery() 更新 MS Access 记录时出现问题,结果未更新