我需要一些关于如何处理以下内容的建议: - 我有一个数据字段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'的转换无效。
我知道我错过了什么,但是......
提前致谢
答案 0 :(得分:13)
您必须明确检查DBNull.Value
并自行进行转换。
换句话说,构建一个方法,为您进行转换,并考虑DBNull.Value
。
答案 1 :(得分:3)
没有回答你的问题,但是: 您应该真正创建一个执行转换的代码隐藏方法。这将使代码更易于理解和调试,并且可以重用代码。
答案 2 :(得分:3)
每次使用Eval时,都必须以某种方式进行延迟评估。为此,请替换以下每个实例:
iif(eval("misc_text_2") like ...
带
iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...
OrElse
将阻止尝试将DbNull转换为布尔值。然而,从更基本的角度来看,爆炸是最正确的。这应该都是代码隐藏完成的,可能是在ItemDataBound(或RowDataBound)事件处理程序中。
进一步反思......
O.P.也可能在他的代码中使用Convert.ToString()
方法,它将DBNulls转换为String.Empty。
答案 3 :(得分:0)
由于我们有一个为MS-Dynamics(Solomon)设置的遗留数据库,我们处理空值的方法是将它们转换为ASP或VB.NET代码中的空字符串。 即
Trim$(misc_text_2 & " ")
解决任何版本的VB的问题。
答案 4 :(得分:0)
如果您使用数据集设计器,摆脱此错误的最简单方法是更改受尊重列的属性。
NullValue异常为“Empty”而不是“Throw exception”。
希望这对大家有所帮助。
答案 5 :(得分:0)
对于转换DBNull或IsDBNull,您可以尝试这种方式:
将DBNull转换为空字符串
(DBNullObj)的ToString
创建DBNull转换器函数
Public Function ConvertDBNullToString(DBNullObj As Object)as string
如果是IsDBNull(DBNullObj)那么
返回“”
结束如果
返回DBNullObj
结束职能
答案 6 :(得分:0)
正如spiritTTP建议的那样,如果您使用的是数据集设计器,请将DataColumn.NullValue从“Throw exception”更改为“empty”或“Nothing”。我选择后者,它解决了问题。我现在只检查Nothing(If IsNothing(columnFax)然后......)
答案 7 :(得分:-1)
您可以在sql查询中使用isNull(misc_text_2,'')返回空字符串而不是DBNull。