如何处理类型转换错误:“从类型 'DBNull' 转换为类型 'String' 不是有效的”?

8

我需要一些有关如何处理以下问题的建议:我有一个数据字段misc_text_2,它是varchar(25)类型并允许为空。现在,如果我使用以下语法:

<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”。

我知道我漏掉了什么,但是是什么呢...

提前致谢。


那是什么语言/环境?我猜测是ASP。您能否提及并相应地标记问题? - Joachim Sauer
8个回答

13

你必须明确地检查DBNull.Value并自己进行转换。

换句话说,构建一个方法来执行转换,并考虑到DBNull.Value的情况。


3

虽然不是回答你的问题,但是: 你应该创建一个代码后端方法来进行转换。这将使代码更易于理解和调试,并且可以重复使用代码。


3
每次使用 Eval 时,都需要以某种方式进行惰性求值。为此,请将每个实例替换为:
``` iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ... ```
`OrElse` 将防止任何尝试将 DbNull 转换为布尔值。然而,从更基本的角度来看,bang 是最正确的。这应该在代码后台完成,可能是在 ItemDataBound(或 RowDataBound)事件处理程序中。
经过进一步思考...
O.P. 还可以在代码中使用 `Convert.ToString()` 方法,它将 DBNull 转换为空字符串。

Convert.ToString() 救了我! - leo

0
正如spiritUMTP所建议的,如果您正在使用数据集设计器,请将DataColumn.NullValue从“Throw exception”更改为“empty”或“Nothing”。 我选择了后者,它解决了问题。 现在我只需检查是否为Nothing(如果IsNothing(columnFax)则...)。

0

转换 DBNull 或 IsDBNull 有以下方法:

  1. 将 DBNull 转换为空字符串

    (DBNullObj).ToString

  2. 创建一个 DBNull 转换函数

    Public Function ConvertDBNullToString(DBNullObj As Object) as string

    if IsDBNull(DBNullObj) then

    return ""

    end if

    return DBNullObj

    End Function


0

由于我们有一个为MS-Dynamics(Solomon)设置的遗留数据库,我们处理空值的方法是在ASP或VB.NET代码中将它们转换为null字符串。

Trim$(misc_text_2 & " ")

解决任何版本VB的问题。


如果你使用 "" 而不是 " ",那么就不需要使用 Trim - CJ7
仍然使用 trim,因为 Dynamics 仅使用固定大小的字段,这些字段是填充为空白的。 - Dave

0
如果您正在使用数据集设计器,摆脱此错误的最简单方法是更改受到尊重列的属性。 将NullValue异常改为“空”而不是“抛出异常”。
希望这可以帮助大家。

-1

在你的 SQL 查询中,可以使用 isNull(misc_text_2, '') 来返回空字符串而不是 DBNull。


16
不要在空值的位置返回空字符串,这会降低数据集的可移植性并误代数据模型。如果是空值就是空值,让用户界面层自行决定如何显示它。 - Adam Ralph
1
那是你的观点。 返回一个空字符串解决了他的问题,对吧? - Sani Huttunen
6
“Empty”与“null”是不同的。这不是一种观点,而是一个事实。 - Leandro Bardelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接