【问题标题】:How do I handle Conversion from type 'DBNull' to type 'String' is not valid如何处理从“DBNull”类型到“String”类型的转换无效
【发布时间】:2009-02-11 10:16:16
【问题描述】:

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

我知道我错过了一些东西,但是……

提前致谢

【问题讨论】:

  • 那是什么语言/环境?我猜是ASP。您能否提及这一点并相应地标记问题?

标签: asp.net dbnull


【解决方案1】:

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

换句话说,构建一个为您进行转换的方法,将DBNull.Value 考虑在内。

【讨论】:

    【解决方案2】:

    不回答您的问题,但是: 您应该真正创建一个代码隐藏方法来进行转换。这将使代码更易于理解和调试,并使代码重用成为可能。

    【讨论】:

      【解决方案3】:

      每次使用 Eval 时,都必须以某种方式填充惰性求值。为此,请替换以下每个实例:

      iif(eval("misc_text_2") like ...

      iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...

      OrElse 将阻止任何尝试将 DbNull 转换为布尔值。但是,从更基本的角度来看,bang 是最正确的。这一切都应该在代码隐藏中完成,可能在 ItemDataBound(或 RowDataBound)事件处理程序中。

      经过进一步思考......

      O.P. 也可能在他的代码中使用Convert.ToString() 方法,它将 DBNulls 转换为 String.Empty。

      【讨论】:

      • Convert.ToString() 救了我!
      【解决方案4】:

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

      Trim$(misc_text_2 & " ")
      

      消除任何版本的 VB 的问题。

      【讨论】:

      • 如果您使用"" 而不是" ",则不需要Trim
      • 仍然使用修剪,因为 Dynamics 只使用空白填充的固定大小字段。
      【解决方案5】:

      如果您使用的是数据集设计器,消除此错误的最简单方法是更改​​尊重列的属性。

      “空”而不是“抛出异常”的 NullValue 异常。

      希望对大家有所帮助。

      【讨论】:

        【解决方案6】:

        对于转换 DBNull 或 IsDBNull,您可以尝试以下方式:

        1. 将 DBNull 转换为空字符串

          (DBNullObj).ToString

        2. 创建一个 DBNull 转换函数

          公共函数 ConvertDBNullToString(DBNullObj As Object) as string

          如果 IsDBNull(DBNullObj) 那么

          返回“”

          如果结束

          返回 DBNullObj

          结束函数

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • 永远不要返回空字符串来代替空值,这会降低数据集的可移植性,并且会歪曲数据模型。如果它为空,则为空。让 UI 层操心如何显示。
            • 这是您的意见。返回一个空字符串就解决了他的问题,对吧?
            • “空与空不同”。这不是意见,而是事实。
            猜你喜欢
            • 2014-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-03
            • 2023-03-07
            • 2015-06-07
            • 1970-01-01
            • 2012-11-19
            相关资源
            最近更新 更多