提问人:WSC 提问时间:3/28/2020 最后编辑:WSC 更新时间:3/30/2020 访问量:1302
在不进行 ToString 转换的情况下检查 OracleParameter.Value 是否为 Null
Checking if OracleParameter.Value is Null without doing ToString conversion
问:
我有一个存储过程,其中包含一些参数。在 .NET 方面,我对如何在将其转换为 .NET 之前检查参数是否为 null 感到困惑。我以前在几个不同的项目中做过很多这种事情,但我以前从未遇到过这个问题......OUT
Double?
这是我尝试过的所有组合:
Command.Parameters.Add("PparStsValue", OracleDbType.Decimal).Direction = ParameterDirection.Output
PparStsValue = If(IsDBNull(Command.Parameters("PparStsValue").Value) OrElse
IsNothing(Command.Parameters("PparStsValue").Value) OrElse
Command.Parameters("PparStsValue").Value.ToString = "",
Nothing,
CDbl(Command.Parameters("PparStsValue").Value.ToString))
我做过的另一件事确实有效,但检查一下似乎很荒谬:
Command.Parameters("PparStsValue").Value.ToString = "null"
这计算结果为,因此我可以识别空值......但是为什么 null 值会转换为字符串呢?这似乎与通常转换为 .True
"null"
""
撇开这一点不谈,主要问题是为什么不返回 true?IsDBNull
IsNothing
答:
1赞
T.S.
3/29/2020
#1
使用 ODP 时,参数不会自动返回 CLR 类型,而是返回 oracle 类型。所以对数字的方法是这样的OracleParameter
Dim oraDec as OracleDecimal =
DirectCast(Command.Parameters("PparStsValue").Value, OracleDecimal)
Dim dbl as Double
If Not oraDec.IsNull Then
dbl = Convert.ToDouble(oraDec.Value)
End If
评论
0赞
WSC
3/30/2020
这确实有效,谢谢。我仍然不明白为什么我以前从未这样做过,但哦,好吧。
0赞
T.S.
3/30/2020
@WSC很好。当你说“之前”时。你是什么意思?你以前做过什么?也许,以前,有些不同?不同的提供程序,不同的参数使用等?
0赞
WSC
3/30/2020
我的原始代码曾经只是这样,这奏效了。我现在在想,我可能已经更新了 .NET Framework 版本或 ODP.NET 版本,因为它正在工作,并且其中一个更改了将 null 值转换为而不是 .IsNothing(Command.Parameters("PparStsValue").Value) OrElse Command.Parameters("PparStsValue").Value.ToString = ""
ToString
"null"
""
0赞
T.S.
3/30/2020
井。我们可以开始你不应该使用,因为......这就是它“工作”的原因。因为为您提供了一个值类型。或。因此,在你之前的情况下,你可能会检索到一个 ,这将给你 .这从一开始就是一种糟糕的方法 - 除非它是字符串,否则调用您的返回值。如果您的代码特定于调用,则您确切地知道预期的类型。涵盖所有类型的代码,应检查等IsNothing
parameter.value
Value
DbNull.value
DbNull.Value
DbNull.Value.ToString() = String.Empty
ToString()
if dbnull, if is nothing, if oracleDate, if oraclestring
0赞
T.S.
3/30/2020
@WSC但不要使用 .这是 VB 兼容性函数。使用 或 .当您最终最终转换为 c 时,将为您提供帮助#IsNothing
is nothing
isnot nothing
评论