gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:51:46 24 4
gpt4 key购买 nike

关于在 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 });

应该修复它。 (顺便说一句,这不一定是您应该构建参数的方式,但这在这里有些无关紧要。)

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

关于c# - 在参数化 SQL 字符串中使用 .Net DateTime 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10305161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com