use*_*613 6 .net c# sql oracle 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;
}
Run Code Online (Sandbox Code Playgroud)
但它不能正常工作.当像这样尝试代码时:
DataTable result = QueryByIdAndDate("12345", DateTime.Now, DateTime.Now.AddDays(1));
Run Code Online (Sandbox Code Playgroud)
它给出以下错误:ORA-01847:月中的日期必须介于1和月的最后一天之间
我假设它与DateTime格式化的方式有关,但我不知道以可靠的方式解决这个问题的正确方法.
Jon*_*eet 11
(根据评论......)
看起来在这种情况下,参数的顺序很重要......尽管你给它们起了名字.我不会想到这一点,这是一个有点破碎的驱动程序的标志,但是将代码更改为:
cmd.Parameters.AddRange(new DbParameter[] { idParam, fromDate, toDate });
Run Code Online (Sandbox Code Playgroud)
应该解决它.(顺便说一下,这不一定是构建参数的方式,但这在某种程度上并不重要.)
难道不是开始为字符串指定的日期/时间值.引入比您需要的更多字符串转换是一个非常糟糕的主意.