Dan*_*don 4 .net sql string null dbnull
我正在寻找一些我正在研究的.net程序的代码.该程序的前一位作者在一年多前向我提供了代码.突然间,我看到一个我没有触及的代码抛出的异常:
if ((string)row["LevelName"] != "ABC")
Run Code Online (Sandbox Code Playgroud)
例外情况是"无法将类型为'System.DBNull'的对象强制转换为'System.String'.
我认为该字符串是一个可以为空的数据类型,所以我怎么可能得到这个异常?
我相信你要找的是:
if ((row["LevelName"] as String) != "ABC")
Run Code Online (Sandbox Code Playgroud)
DBNull和String之间没有隐式转换.
它之前可能有用,因为数据库中该列恰好没有NULL.也许有些数据已损坏,或有人在表上更改了NOT NULL约束.
基本上,如果您明确地投射某些内容,最好确保它们具有兼容的动态类型,否则会抛出异常.该as运营商基本上说:"如果可能的话,投射到这一点,否则,逻辑值是零." 显然,as运算符仅适用于引用类型,因为结构不能为null.
DBNull是它自己的类,它在一个名为Value的属性中包含它自己的单例实例.DBNull.Value不等于null,因为它是对此类的实例的引用.
大多数(如果不是全部)数据库包装器将返回DBNull.Value而不是null没有值时返回.其中一个原因是因为返回一个实数null可能意味着根本没有行,而不仅仅是列中的空值(它取决于您使用哪些对象来获取值).
通常,as运算符非常有用,DBNull并且可以与任何可空类型(包括string)一起使用.
string str = reader["Name"] as string;
int? i = reader["Age"] as int?;
Run Code Online (Sandbox Code Playgroud)
也许值得一提的是?? 当你需要一个不可为空的值类型时,运算符在这里也很有用(虽然看起来不太漂亮).
int i = reader["Age"] as int? ?? -1;
Run Code Online (Sandbox Code Playgroud)
在LINQ select子句中,我发现它非常方便,只是一个简单的实例.