Dealing with System.DBNull in PowerShell
I think you're taking a wrong approach here. As documented, the DBNull
class represents a non-existing value, so comparisons like -gt
or -lt
don't make any sense. A value that doesn't exist is neither greater nor less than any given value. The Value
field has an Equals()
method, though, which allows you to check if a value is or isn't DBNull
:
PS C:> ([DBNull]::Value).Equals(23)FalsePS C:> ([DBNull]::Value).Equals([DBNull]::Value)True
Simplest way is $var -isnot [DBNull]
.
I've tested this in my own scripts and it works as expected.
What I usually end up doing is this:
[String]::IsNullOrWhiteSpace($Val.ToString())
Or this:
[String]::IsNullOrEmpty($Val.ToString())
Or this:
$Val.ToString() -eq [String]::Empty
This often works just fine since [System.DBNull]::Value.ToString()
returns an empty string, so both [String]::IsNullOrWhiteSpace([System.DBNull]::Value)
and [System.DBNull]::Value.ToString() -eq [String]::Empty
evaluate to True.
Obviously, these are not logically equivalent since your data may legitimately have empty strings, or may be a data type that doesn't make sense as an empty string (such as an integer). However, since you often want to treat DBNulls the exact same way as empty strings and whitespace-only strings, it can be useful if you know your data well enough.
If you actually want to know if the value is a DBNull, of course, then use [DBNull]::Value.Equals($Value)
.