2016-01-22 118 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 
}