【发布时间】:2021-01-09 08:29:33
【问题描述】:
我有一个查询,我以下面给出的格式传递值,它在 oracle pl/sql 中工作
Select ASE_ID
from ASE_DTLS a
where TO_CHAR(CRT_ON,'YYYY-MM-DD')
between '2020-09-01' and '2020-09-23'
上面的查询给出了输出。但是当我试图以下面给定的格式通过 c# 查询传递它时,它没有返回值。
Select ASE_ID
from ASE_DTLS a
where TO_CHAR(CRT_ON,'YYYY-MM-DD')
between :CRT_ON and :CRT_ON";
从 '01-09-2020 00:00:00' 和 '23-09-2020 00:00:00' 格式的 fieldval[0] 中的 post 方法接收值。
command.Parameters.Add(":CRT_ON", fieldval[0].From.ToString("yyyy-MM-dd"));
command.Parameters.Add(":CRT_ON", fieldval[0].To.ToString("yyyy-MM-dd"));
通过 ExecuteReader 读取它时获得 0 条记录。 From & To 与 c# 中的定义相同
public DateTime From { get; set; }
public DateTime To { get; set; }
和 CRT_ON 在 oracle 中作为日期。
【问题讨论】:
-
日期没有格式,它们是二进制值,在 .NET 和 Oracle 中都是如此。 不要将它们作为字符串传递给数据库。请改用日期类型的参数。
TO_CHAR是个大bug,导致数据库无法使用索引 -
command.Parameters.Add(":CRT_ON", SqlDbType.DateTime).Value = fieldval[0].From; -
还有其他严重的错误,比如在 .NET 和查询中两次使用 same 参数名称 这不会抛出吗?充其量,查询将返回错误的结果
-
SQL 查询应该类似于
select ... where CRT_ON between :CRT_FROM and :CRT_TO。在 .NET 中,参数应命名为:CRT_FROM和:CRT_TO -
您不需要将每个参数都转换为字符串。
标签: c# sql asp.net-mvc oracle ado.net