关于在Sql语句中使用.Net DateTime的问题有几个,但是没有一个问题解决了我的问题。

我正在使用以下代码来查询Oracle数据库:

private DataTable QueryByIdAndDate(string id, DateTime fdate, DateTime tdate) {
    string query = "SELECT * FROM table WHERE ID = :id AND DATE_TIME BETWEEN :from AND :to"
    DbCommand cmd = db.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = query;

    DbParameter fromDate = CreateDateParameter(cmd, fdate);
    fromDate.ParameterName = "from";
    DbParameter toDate = CreateDateParameter(cmd, tdate);
    toDate.ParameterName = "to";
    DbParameter idParam = CreateStringParameter(cmd, id);
    idParam.ParameterName = "id";

    cmd.Parameters.AddRange(new DbParameter[] { fromDate, toDate, idParam });
    return db.ExecuteQuery(cmd);
}

private DbParameter CreateDateParameter(DbCommand cmd, DateTime date) {
    DbParameter param = cmd.CreateParameter();
    param.DbType = DbType.DateTime;
    param.Direction = ParameterDirection.Input;
    param.Value = date;
    return param;
}

但是它不能正常工作。当像这样尝试代码时:
DataTable result = QueryByIdAndDate("12345", DateTime.Now, DateTime.Now.AddDays(1));

它给出以下错误:
ORA-01847:月份的日期必须在1到月份的最后一天之间

我假设它与格式化DateTime的方式有关,但是我不知道以可靠的方式解决此问题的正确方法。

最佳答案

(根据评论...)

看起来在这种情况下,参数的顺序很重要...尽管您已经给它们指定了名称。我不会想到这一点,这是驱动程序有些破损的迹象,但是将您的代码更改为:

cmd.Parameters.AddRange(new DbParameter[] { idParam, fromDate, toDate });

应该修复它。 (顺便说一下,这不一定是您构造参数的方式,但这在这里并不重要。)

不要开始将日期/时间值指定为字符串。引入比您需要的更多的字符串转换是一个非常糟糕的主意。

10-05 18:42