我有一个存储过程,在某些情况下返回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,我想知道将来我做错了什么。
答案 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