【问题标题】:Passing C# datetime value to Oracle DB Query将 C# 日期时间值传递给 Oracle 数据库查询
【发布时间】:2016-01-22 17:07:58
【问题描述】:

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

我无法将 C# 日期时间变量“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 循环。如果我使用原始查询,它会执行但不返回任何数据。

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

1/16/2016 12:00:00 AM

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

1/16/2016

【问题讨论】:

  • 您是否尝试过调试程序以查看您的“.​​ToShortDateString()”是否为您提供了数据库所需的“1/16/2016”?有时可能会出现与其他时间格式(CultureInfo 等)有关的错误。
  • 是的,它以我需要的格式:2016 年 1 月 16 日。问题似乎在于将其传递到查询中。
  • 您是否将“SqlConnection”类与 DataSource 等一起使用?如果您使用 SqlConnection,也请使用“SqlCommand”类。这允许您使用 i.E. 添加参数。 cmd.Parameters.Add("@Date", varDate);并像这样执行你的操作:“SELECT * FROM ... WHERE Date = @Date”,所以这些值真的不可能搞砸了。
  • 你可以试试TRUNC(TO_DATE(:pPROCESS_DATE,'MM-DD-YYYY HH:MI:SS AM'))
  • @AbdulHameed 我的月份无效。一月显示在“1”而不是“01”会不会有问题?谢谢

标签: c# sql oracle


【解决方案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】:

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

    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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多