2016-01-22 121 views
-2

我有一个SQL查询,它将一个C#变量传递到我的Oracle数据库中。将C#日期时间值传递给Oracle DB查询

我无法在我的应用程序中将C#datetime变量“PROCESS_DATE”传递到我的查询中。我没有收到任何记录。如果我将查询复制到我的oracle开发人员工具TOAD中,它工作正常,并且我得到多个记录。

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

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

我也尝试了日期时间变量转换成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循环。如果我使用原始查询,它会返回任何数据。

DateTime变量PROCESSDATE看起来像这样:

1/16/2016 12:00:00 AM 

我注意到它上有一个时间戳,所以我不知道如果是这样的问题或没有。
Oracle中的数据是这样的:

1/16/2016 
+0

您是否尝试过调试您的程序以查看您的“.​​ToShortDateString()”是否可以获得数据库所需的“1/16/2016”?有时可能会有其他时间格式错误(CultureInfo等)。 –

+0

是的,它把它放在这样的格式:1/16/2016像我需要的。这个问题似乎是将它传递给查询。 – coggicc

+0

你是否在DataSource等中使用了类“SqlConnection”?如果你使用SqlConnection,也可以使用类“SqlCommand”。这允许您使用i.E添加参数。 cmd.Parameters.Add(“@ Date”,varDate);并执行你的操作,如下所示:“SELECT * FROM ... WHERE Date = @Date”,所以真的没有机会让这些值变得混乱。 –

回答

0

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

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

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

其次,让ProcessDate工作,我需要采取从我的浏览传来的字符串,将其转换为datetime,然后我格式化回为一个字符串。这可能不是最佳实践,但它的工作。

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

按我的意见,请尝试以下,看看这样做解决了。

TRUNC(TO_DATE(:pPROCESS_DATE,'MM-DD-YYYY HH:MI:SS AM')) if pROCESS_DATE format is 1/16/2016 12:00:00 AM

TRUNC(TO_DATE(:pPROCESS_DATE,'DD-MM-YYYY HH:MI:SS AM')) if pROCESS_DATE format is 16/1/2016 12:00:00 AM

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 
}