C# 奇怪的行为。oracle数据库中日期列的参数

C# 奇怪的行为。oracle数据库中日期列的参数,c#,.net,oracle,frameworks,C#,.net,Oracle,Frameworks,我在Oracle12中遇到了这种奇怪的行为。我正在VisualStudio 2019中使用oracle.managed.dataAccess 这里的情况如下: 我正在使用一个参数变量,默认情况下它是一个字符串,我没有得到任何结果。语句本身没有错误,但由于日期参数的原因,我没有返回任何db条目。 date_列是数据库中的date类型 字符串sql=select*从c_id=:myC_id and date_column>的表中选择到日期:myDate,'yyyy-mm-dd hh24:mi:ss'

我在Oracle12中遇到了这种奇怪的行为。我正在VisualStudio 2019中使用oracle.managed.dataAccess

这里的情况如下: 我正在使用一个参数变量,默认情况下它是一个字符串,我没有得到任何结果。语句本身没有错误,但由于日期参数的原因,我没有返回任何db条目。 date_列是数据库中的date类型

字符串sql=select*从c_id=:myC_id and date_column>的表中选择到日期:myDate,'yyyy-mm-dd hh24:mi:ss'; OracleCommand cmd=新的OracleCommand; cmd.Connection=connectionstring; cmd.CommadnText=sql; cmd.Parameters.Addnew OracleParametermyC_id,myC_id; cmd.Parameters.Addnew OracleParametermyDate,myDate; 我尝试将参数作为字符串、日期和所有内容。来回转换,仍然不工作。但是,如果我将日期硬编码为下面的字符串,它就可以工作了。我正在得到结果和数据

string sql = "select * from Table where c_id = :myC_id and date_column > to_date('2021-03-30 09:00:00', 'yyyy-mm-dd hh24:mi:ss')";
如果我像下面这样将字符串变量连接到sql字符串,我也会得到数据

string myDate = "'" + "2021-03-30 09:00:00" + "'";
string sql = "select * from Table where c_id = :myC_id and date_column > to_date({myDate}, 'yyyy-mm-dd hh24:mi:ss')";

但是它不能与参数一起工作,有人能告诉我为什么,以及我是如何使它工作的吗?

下面的示例应该对您有所帮助

设置

范例

输出

您说过date_列是db中的date类型,您的输入值myDate是一个字符串。 我建议在C中将myDate转换为DateTime。为了进行解析,必须定义一个格式提供程序。看

您的日期字符串看起来像fr-fr

在您的示例中,您在SQl语句中使用参数:myC_id,并将myC_id用作OracleParameter名称。你必须使用相同的名字


我建议设置属性cmd.BindByName=true。默认值为false,参数由位置而不是名称绑定。By positions意味着代码中cmd.Parameters.Add的顺序和数量必须与SQL语句中的bind参数的顺序相同。

我不知道您使用的工具,但这肯定是错误的。我猜/希望这是一个输入错误:yyyy-mm-dd-hh23:mi:ssasuming-to_-date将字符串日期解析为数据库日期类型,而C中的myDate是DateTime,为什么在第一个示例中将:myDate视为字符串?这不是date_column>:myDate吗?请将您的问题包含在C代码中,在C代码中定义变量并为其赋值。输入错误?hh23而不是HH24是否需要截断时分和秒?你需要>=而不是>>吗?谢谢你的回答,一天后我用几件事解决了这个问题。使用OracleDbType.date将字符串date解析为DateTime,并将BindByName设置为true。
create table tableX (id number(10), c_id number(10), date_column date );

insert into tableX (id, c_id,date_column) values (1,1,to_date('2021-09-09 08:00:00', 'yyyy-mm-dd hh24:mi:ss'));
insert into tableX (id, c_id,date_column) values (2,1,to_date('2021-03-30 08:00:00', 'yyyy-mm-dd hh24:mi:ss'));
insert into tableX (id, c_id,date_column) values (3,2,to_date('2021-09-09 08:00:00', 'yyyy-mm-dd hh24:mi:ss'));
insert into tableX (id, c_id,date_column) values (4,2,to_date('2021-03-30 08:00:00', 'yyyy-mm-dd hh24:mi:ss'));

Commit;
using var con = new OracleConnection(conString);
using var cmd = con.CreateCommand();
con.Open();

int myC_id = 2;

var dateAsString = "2021-03-30 09:00:00";
var culture = CultureInfo.CreateSpecificCulture("fr-FR");
var styles = DateTimeStyles.AssumeLocal;

DateTime myDate = DateTime.Parse(dateAsString, culture, styles);

//DateTime myDate = new DateTime(2021, 3, 30, 9, 0, 0); //2021-03-30 09:00:00

cmd.CommandText = "select id, c_id, date_column from tableX where c_id = :myC_id and date_column > :myDate";

cmd.BindByName = true;
cmd.Parameters.Add(new OracleParameter(":myC_id", OracleDbType.Int32, myC_id, System.Data.ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter(":myDate", OracleDbType.Date, myDate, System.Data.ParameterDirection.Input));

OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    Console.WriteLine($"Found Row: ID={reader.GetInt32(0)}, C_ID={reader.GetInt32(1)}, DATE_COLUMN={reader.GetDateTime(2)}");
}
Found Row: ID=3, C_ID=2, DATE_COLUMN=09.09.2021 08:00:00