【发布时间】:2012-05-05 12:25:29
【问题描述】:
关于在 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 的格式化方式有关,但我不知道以可靠方式解决此问题的正确方法。
【问题讨论】:
-
你不会碰巧在一个月的第 30 天运行它,只有 30 天吗?
-
不。我使用 DateTime.Now 和 DateTime.Now.AddDays(1); 展示的示例失败了
-
你的驱动肯定支持命名参数吗?如果它试图按位置使用它们,它最终会使用“id”值作为“to”部分,这可能会被破坏。您使用的是哪个驱动程序?
-
@JonSkeet 哇,你猜对了。我正在使用 Oracle.DataAccess,它必须按位置使用它们,因为我在将参数放入数组时更改了参数的顺序,现在它正在工作。搞砸了一个小时后,这是多么令人讨厌的结果。把它作为答案,你就赢了,谢谢!
-
@user12345613:很高兴看到心理调试经常起作用:)
标签: c# .net sql oracle datetime