代码之家  ›  专栏  ›  技术社区  ›  C Walker

参数化OLEDBCommand中使用datetime时出现异常

  •  2
  • C Walker  · 技术社区  · 15 年前

    我正在尝试使用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 行,其余部分工作。我的问题是,无论我对日期时间类型使用什么,它都不起作用。我试过了:

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

    我也尝试过:

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

    它也不起作用。我没有通过谷歌阅读过任何东西。另外,请注意,我确实需要日期和时间,而不仅仅是一个单独的日期。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Pavel Minaev    15 年前
    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 .