0

我有两个值,其中的日期格式为 dd/MM/yyyy,我试图获取这两个值之间的日期。一个和两个变量中的值看起来像这些(17/06/2013)。然后我从我的 asp 发送到一个 oracle 程序来执行一个查询,我得到 ORA-01843 不是一个有效的月份。我已经搜索过这个错误,但似乎没有一个解决方案对我有用。问题是这段代码曾经可以工作,我没有对这些代码进行任何更改,现在由于某种原因它不起作用。

这是我的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;

有任何想法吗?

4

1 回答 1

0

当我们传递一个与指定日期格式不匹配的字符串时,Oracle 会抛出 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 错误的字符串。因此,您需要跟踪您的代码以发现它的来源。

“我应该如何检查我的列中的值是否正确”

调试 dot Net 不是我的强项。然而,传统上有两种方式。一种是在调试工具中单步调试代码。如果您使用的是 Visual Studio 或类似的 IDE,您应该能够做到这一点。另一个建议是在您的代码中嵌入日志记录命令并将跟踪消息写入文件,例如。

哪种方法最适合您?只有你能说出来。

于 2013-06-25T10:00:25.490 回答