如何处理从“DBNull”类型到“String”类型的转换无效
题
我需要一些关于如何处理以下问题的期望建议:-我有一个数据字段misc_text_2,其类型为varchar(25)并允许NULL。现在如果我使用以下语法
<asp:Label ID="lblPrinter" runat="server" Text='<%# iif(eval("misc_text_2") is dbnull.value, "", iif(eval("misc_text_2") like "NA", "None", iif(eval("misc_text_2") like "KP1", "Kitchen Printer 1", iif(eval("misc_text_2") like "KP2", "Kitchen Printer 2", iif(eval("misc_text_2") like "KP3", "Kitchen Printer 3", iif(eval("misc_text_2") like "BP1", "Bar Printer 1", iif(eval("misc_text_2") like "BP2", "Bar Printer 2", iif(eval("misc_text_2") like "BP3", "Bar Printer 3", Eval("misc_text_2")))))))))%>'></asp:Label>
我不断收到错误异常详细信息:System.InvalidCastException:从类型“DBNull”到类型“String”的转换无效。
我知道我错过了一些东西,但是……
提前致谢
解决方案
您可以在SQL查询中使用ISNULL(MISC_TEXT_2,'')返回EN空字符串而不是DBNULL。
其他提示
您必须明确检查 DBNull.Value
并自己进行转换。
换句话说,构建一种将为您进行转换的方法 DBNull.Value
考虑到。
不是回答您的问题,而是:您应该真正创建一个可以进行转换的方法背后的代码。这将使代码更易于理解和调试,并将有可能重复使用代码。
每次使用评估时,您都必须以某种方式进行懒惰评估。为此,请替换每个实例:
iif(eval("misc_text_2") like ...
和
iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...
这 OrElse
将防止任何尝试将dbnull转换为布尔值。但是,从更基本的角度来看,Bang是最校正的。这些都应完成代码,可能是在itemDatabound(或RowDatabound)事件处理程序中完成的。
进一步反思...
OP也可能利用 Convert.ToString()
他的代码中的方法将将dbnulls转换为string.empty。
由于我们有一个用于MS-Dynamics(所罗门)设置的旧数据库,因此我们处理nulls的方法是将其转换为ASP或VB.NET代码中的null字符串。 IE
Trim$(misc_text_2 & " ")
摆脱任何版本的VB问题。
如果您使用数据集设计器,消除此错误的最简单方法是更改相关列的属性。
NullValue 异常为“空”而不是“抛出异常”。
希望这会对大家有所帮助。
对于转换DBNULL或ISDBNULL,您可以尝试这种方法:
将dbnull转换为空字符串
(dbnullobj)。
创建DBNULL转换器功能
公共函数转换dbnulltoString(dbnullobj作为对象)为字符串
如果是isdbnull(dbnullobj),则
返回 ””
万一
返回dbnullobj
结束功能
正如SpiritumTP所建议的那样,如果您使用的是数据集设计器,请将数据列室从“抛出异常”更改为“空”或“ nothing”。我选择了后者,它解决了问题。我现在什么都没有检查(如果没有(columnfax),那么...)