OracleCommand StoredProcedure返回" null"而不是DBNull

时间:2015-08-07 17:48:27

标签: vb.net string oracle odp.net oraclecommand

我有一个存储过程,在某些情况下返回null。当我ToString()时,它返回" null"作为字符串而不是空字符串,但如果我不使用.ToString()方法,则会导致错误。

Public Function ReturnValue(ByVal lngId As Long) As String
    Dim adoCmd As New OracleCommand
    Dim strReturn As String = ""

    With adoCmd

        .CommandText = "BUS_TEST.ReturnValue"
        .CommandType = CommandType.StoredProcedure

        .Parameters.Add("return", OracleDbType.Char, 256, strReturn, ParameterDirection.ReturnValue)
        .Parameters.Add("lngId", OracleDbType.Double, lngId, ParameterDirection.Input)
    End With

    objSalUtil.ExecFunc(ocEWBConnection, adoCmd, "ReturnValue")

    Return adoCmd.Parameters(0).Value.ToString

End Function

上面的代码返回" null"

Public Function ReturnValue(ByVal lngId As Long) As String
    Dim adoCmd As New OracleCommand
    Dim strReturn As String = ""

    With adoCmd

        .CommandText = "BUS_TEST.ReturnValue"
        .CommandType = CommandType.StoredProcedure

        .Parameters.Add("return", OracleDbType.Char, 256, strReturn, ParameterDirection.ReturnValue)
        .Parameters.Add("lngId", OracleDbType.Double, lngId, ParameterDirection.Input)
    End With

    objSalUtil.ExecFunc(ocEWBConnection, adoCmd, "ReturnValue")

    Return adoCmd.Parameters(0).Value

End Function

上面的代码导致InvalidCastException:从类型' OracleString'转换输入' String'无效。

Public Function ReturnValue(ByVal lngId As Long) As String
    Dim adoCmd As New OracleCommand
    Dim strReturn As String = ""

    With adoCmd

        .CommandText = "BUS_TEST.ReturnValue"
        .CommandType = CommandType.StoredProcedure

        .Parameters.Add("return", OracleDbType.Char, 256, strReturn, ParameterDirection.ReturnValue)
        .Parameters.Add("lngId", OracleDbType.Double, lngId, ParameterDirection.Input)
    End With

    objSalUtil.ExecFunc(ocEWBConnection, adoCmd, "ReturnValue")

    Return strReturn

End Function

最后,上面的代码返回一个正确的空字符串,但无论是否应该返回某些内容,它都会在所有情况下都这样做。

我过去经常使用这样的存储过程,但是他们总是在所有情况下返回一个值。我不太确定如何处理这个null。我不想检查包含" null"的字符串。首先,因为这有点hacky,我想知道将来我做错了什么。

2 个答案:

答案 0 :(得分:1)

我认为,您正在使用ODP.NET。在这种情况下,而不是这个

Return adoCmd.Parameters(0).Value

你这样做

Dim oraStr As OracleString = CType(adoCmd.Parameters(0).Value, OracleString)
Return oraStr.Value ' return .net string

发生了什么事,adoCmd.Parameters(0).Value会给你Oracle null。如果将返回值转换为Oracle Type,现在可以访问.Net类型的值。当您使用adoCmd.Parameters(0).Value.ToString()时,您将获得ToString的Oracle实现,这只会返回一些单词null

当你使用odp.net Oracle参数,存储过程或带有返回值的参数化查询时,这是要记住的事情 - 并不重要,比如这里

Dim sql as String = "insert into table ...) returning fld1 into :1"
  

有趣的观察SqlClient这是非法的Parameters(0).Value = Nothing。它想要DBNull.Value。在ODP.NET中不是问题。它需要任何 - Nothing或/和DBNull.Value

当您使用OracleReader时,尤其是通过IDataReader - 这不是问题。 Reader("fld1")将返回.net类型。

Dim r As IdataReader = cmd.ExecuteReader...
Dim i As Integer = reader("fld1")

您需要注意的是将Oracle DB Type与.NET匹配。问题是,他们不匹配。如果您声明表字段Number(9),它将返回.net Integer,但Number(9)不足以容纳Integer.MaxValue。如果您声明表字段Number(10),则Reader("fld1")将返回Long。因此,.net Integer介于Number(9)Number(10)之间。你需要使用转换

 Dim i As Integer = convert.ToInt32(reader("fld1"))

答案 1 :(得分:0)

事实证明,将这一行添加到两个参数之间解决问题。

adoCmd.Parameters(0).DbType = DbType.String