c# – 在参数化SQL字符串中使用.Net DateTime的正确方法

前端之家收集整理的这篇文章主要介绍了c# – 在参数化SQL字符串中使用.Net DateTime的正确方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
关于在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和1的最后一天之间

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

解决方法

(根据评论……)

看起来在这种情况下,参数的顺序很重要……尽管你给它们起了名字.我不会想到这一点,这是一个有点破碎的驱动程序的标志,但是将代码更改为:

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

应该解决它. (顺便说一下,这不一定是构建参数的方式,但这在某种程度上并不重要.)

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

猜你在找的C#相关文章