将 C# 日期时间值传递给 Oracle DB Query

本文关键字:Oracle DB Query 值传 日期 时间 | 更新日期: 2023-09-27 18:31:26

我有一个SQL查询,我正在将C#变量传递到我的Oracle DB。

我在将 C# 日期时间变量"PROCESS_DATE"传递到应用程序中的查询时遇到问题。 我没有取回任何记录。 如果我将查询复制到我的预言机开发人员工具 TOAD 中,它工作正常,我会得到多条记录。

这是我在应用程序中使用的查询:

String SelectAllSQL = "SELECT * FROM REALMS_AUDIT.R2_GROUP_QUERY_RPT WHERE PROCESS_DATE = :pPROCESS_DATE";

我还尝试将 datetime 变量转换为 shortDateString(),以便它与数据库完全匹配,然后我使用了 TO_DATE 函数,如果我直接在 TOAD 中查询日期,我必须使用它,没有任何运气。 shortDateString() 将我的日期更改为:1/16/2016,这是我所需要的,但 OracleDataReader 不喜欢它。 这里是带有TO_DATE函数的查询:

String SelectAllSQL = "SELECT * FROM REALMS_AUDIT.R2_GROUP_QUERY_RPT WHERE PROCESS_DATE = TO_DATE(:pPROCESS_DATE, 'MM-DD-YYYY'";

:pROCESS_DATE 是传入的日期时间变量。

C# 和 Oracle 之间必须有一个与处理日期时间变量相关的细分。 我正在使用Oracle DataReader来处理查询。

OracleDataReader dataReader = mDataAccess.SelectSqlRows ( oracleConnection, oracleCommand, sqlCommand, parameters );
        while ( dataReader.Read ( ) )
        {
                groupEntityFacilityRptList.Add ( ReadRecord ( dataReader ) );
        }

如果我使用 TO_DATE 函数,应用程序将不会单步执行 while 循环。 如果我使用原始查询,它会返回,但不返回任何数据。

日期时间变量 PROCESSDATE 如下所示:

1/16/2016 12:00:00 AM

我注意到它上面有一个时间戳,所以我不确定这是否是问题所在。
Oracle 中的数据如下所示:

1/16/2016

将 C# 日期时间值传递给 Oracle DB Query

除非我完全误解了你的问题,否则我认为你可能会让这件事变得比它需要的更难。 ODP.net 为您处理所有这些肮脏的工作。 如果 PROCESS_DATE 是 Oracle 中实际的DATE数据类型,则只需向其传递一个实际的 C# DateTime 变量,然后 ODP.net 完成繁重的工作。 无需进行任何类型的转换,前提是您传递的是实际日期:

DateTime testDate = new DateTime(2015, 7, 16);
OracleCommand cmd = new OracleCommand(
    "SELECT * FROM REALMS_AUDIT.R2_GROUP_QUERY_RPT WHERE PROCESS_DATE = :pPROCESS_DATE",
    conn);
cmd.Parameters.Add(new OracleParameter("pPROCESS_DATE", OracleDbType.Date));
cmd.Parameters[0].Value = testDate;
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    object o = reader.IsDBNull(0) ? null : reader.GetValue(0);
}
reader.Close();

如果你在 C# 中的数据不是日期,我建议在尝试之前先把它定为日期:

DateTime testDate;
if (DateTime.TryParse(testDateString, out testDate))
{
   // run your query
}

根据我的评论,请在下面尝试并查看此解决方案。

TRUNC(TO_DATE(:pPROCESS_DATE,'MM-DD-YYYY HH:MI:SS AM'))格式是否pROCESS_DATE 1/16/2016 12:00:00 AM

TRUNC(TO_DATE(:pPROCESS_DATE,'DD-MM-YYYY HH:MI:SS AM')) pROCESS_DATE格式是否为 16/1/2016 12:00:00 AM .

首先,我了解到我的代码不会进入下面的代码,除非我真的有记录返回给我。

OracleDataReader dataReader = mDataAccess.SelectSqlRows ( oracleConnection, oracleCommand, sqlCommand, parameters );
        while ( dataReader.Read ( ) )
        {
                groupEntityFacilityRptList.Add ( ReadRecord ( dataReader ) );
        }

其次,要使 ProcessDate 正常工作,我需要获取来自我的视图的字符串,将其转换为日期时间,然后将其格式化为字符串。 这可能不是最佳实践,但它奏效了。

public JsonResult GetGroupReportData ( String reportDate )
{
  DateTime processDate = DateTime.Parse ( reportDate );
  var monthlyReport = SelectAllGroupRprt (processDate.ToString("MM/dd/yyyy");
  return new JsonResult ( )
    {
      Data = monthly,
      MaxJsonLength = Int32.MaxValue
    };
}