2013-06-25 69 views
0

我有兩個值的日期格式爲dd/MM/yyyy,並且試圖獲取這兩個值之間的日期。這些值在一個和兩個變量中看起來像這些(17/06/2013)。然後我從asp發送到oracle程序來執行查詢,並且我得到的ORA-01843不是一個有效的月份。我找到了這個錯誤,但沒有一個解決方案似乎爲我工作。問題在於,這段代碼曾經工作過,我沒有改變這些代碼上的任何東西,現在它由於某種原因不起作用。不是一個有效的月份asp.net/oracle

這裏是我的ASP代碼:

ONE = fromDate.Value 
TWO = toDate.Value 
Generic.searchBetweenDates(ONE, TWO, dt) 


Public Function searchBetweenDates(ByVal PFROMDATE As String, ByVal PTODATE As String, ByRef PUSERINFO As DataTable) 
     Dim myDataTable As New DataTable 
     Dim myDataAdapter As New OracleDataAdapter 

     Dim oraCmd As New OracleCommand("cantine_test.searchbetweendates") 
     oraCmd.CommandType = System.Data.CommandType.StoredProcedure 
     oraCmd.Parameters.Add(New OracleParameter("PFROMDATE", OracleType.VarChar, 30)).Value = PFROMDATE 
     oraCmd.Parameters.Add(New OracleParameter("PTODATE", OracleType.VarChar, 300)).Value = PTODATE 
     oraCmd.Parameters.Add(New OracleParameter("PUSERINFO", OracleType.Cursor)).Direction = ParameterDirection.Output 

     Dim oConn As New OracleConnection(ConnectionString) 
     Try 
      oConn.Open() 
      oraCmd.Connection = oConn 
      cleanParams(oraCmd.Parameters) 

      myDataAdapter.SelectCommand = oraCmd 
      myDataAdapter.Fill(myDataTable) 
      If Not myDataTable Is Nothing Then 
       PUSERINFO = myDataTable 'return reference using byref param 
      End If 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     Finally 
      oraCmd.Dispose() 
      oConn.Close() 
      myDataAdapter.Dispose() 
     End Try 
     Return PUSERINFO 
    End Function 

這裏是從我的Oracle過程代碼:

PROCEDURE searchbetweendates 
    (PFROMDATE IN VARCHAR2, PTODATE IN VARCHAR2, PUSERINFO OUT SYS_REFCURSOR) 
    AS 

BEGIN 
    OPEN PUSERINFO FOR 

     SELECT ORDERDATE,ORDERID,ORDERTIME,ORDERLIST,QUANTITY,ITEMPRICE,ORDERPRICE,LOCATION 
     FROM ORDERSDETAIL 
     WHERE ORDERDATE >= to_date(PFROMDATE, 'dd/MM/yyyy') 
     AND ORDERDATE <= to_date(PTODATE,'dd/MM/yyyy'); 

END; 

任何想法?

+0

您確定fromDate.Value會以正確的格式爲您提供日期嗎?調試並檢查傳遞給Oracle的字符串格式。 – GTG

+0

還有一件奇怪的事情。 Generic.searchBetweenDates(fromDate.Value,toDate.Value,dt)這給了我一個不同的格式'#6/17/2013#{Date}'當它到達另一個類時:Public Function searchBetweenDates(ByVal PFROMDATE As String ,ByVal PTODATE As String,ByRef PUSERINFO As DataTable)PFROMDATE和PTODATE具有正確的值,如'17/06/2013'。我嘗試從Date.Value和ONE兩者發送,並修改了我的過程,但結果仍然相同。 –

回答

0

甲骨文擲出ORA-01843當我們通過一個字符串,它不符合指定的日期格式:例如當字符串有美國格式和格式掩碼不:

SQL> select to_date('01/13/2013', 'dd/mm/yyyy') from dual 
    2/
select to_date('01/13/2013', 'dd/mm/yyyy') from dual 
       * 
ERROR at line 1: 
ORA-01843: not a valid month 


SQL> 

所以,最可能的解釋是你傳遞了你認爲具有共同格式但實際上不是的值。當「日期」以字符串形式存儲時,這非常常見。換句話說,這是一個調試問題。

雖然有一種想法發生:ORDERSDETAIL.ORDERDATE本身是DATE數據類型。


#6/17/2013#{Date}是排序字符串,這肯定會導致ORA-1843錯誤。所以你需要跟蹤你的代碼來發現它的來源。

「我應該如何檢查,如果在我的列值是正確的」

調試點網是不是我的強項。然而,傳統上有兩種方法。一個是在調試工具中遍歷代碼。如果你使用Visual Studio或類似的IDE,你應該可以做到這一點。另一個建議是在你的代碼中嵌入日誌命令並寫入跟蹤消息,例如到一個文件。

哪種方法最適合你?只有你可以告訴。

+0

謝謝你的回覆m8。任何建議如何檢查我的列中的值是否正確?它們看起來是正確的,但正如你所說的那樣,但從後面看不正確。 –

相關問題