将C#datetime值传递给Oracle DB Query

时间:2016-01-22 17:07:59

标签: c# sql oracle

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

我无法将C#datetime变量" PROCESS_DATE"传递到我的应用程序中的查询中。我没有得到任何记录。如果我将查询复制到我的oracle开发人员工具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

3 个答案:

答案 0 :(得分:1)

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

如果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

答案 1 :(得分:1)

除非我完全误解了你的问题,否则我认为你可能会比实际需要更难。 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
}

答案 2 :(得分:0)

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

OracleDataReader dataReader = mDataAccess.SelectSqlRows ( oracleConnection, oracleCommand, sqlCommand, parameters );

        while ( dataReader.Read ( ) )
        {
                groupEntityFacilityRptList.Add ( ReadRecord ( dataReader ) );
        }

其次,要让ProcessDate工作,我需要从我的View中获取字符串,将其转换为日期时间,然后将其格式化为字符串。它可能不是最佳实践,但它有效。

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
    };
}