如何处理从“DBNull”类型到“String”类型的转换无效

时间:2009-02-11 10:16:17

标签: asp.net dbnull

我需要一些关于如何处理以下内容的建议: - 我有一个数据字段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'的转换无效。

我知道我错过了什么,但是......

提前致谢

8 个答案:

答案 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,您可以尝试这种方式:

  1. 将DBNull转换为空字符串

    (DBNullObj)的ToString

  2. 创建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。