【问题标题】:Conversion from type 'DBNull' to type 'String' is not valid从“DBNull”类型到“String”类型的转换无效
【发布时间】:2014-06-10 14:12:24
【问题描述】:

我收到了这个问题

从“DBNull”类型到“String”类型的转换无效。

第 501 行:hfSupEmail.Value = dt.Rows(0)("SupEmail")

我对此很陌生,我不确定确切的问题是什么 有人可以指导我吗?

非常感谢

【问题讨论】:

    标签: asp.net vb.net string dbnull


    【解决方案1】:

    快速而肮脏的修复:

    hfSupEmail.Value = dt.Rows(0)("SupEmail").ToString()
    

    或者对于 C#:

    hfsupEmail.Value = dt.Rows[0]["SupEmail"].ToString();
    

    当您的最终目标和源数据已经是字符串时,这非常有效,因为任何额外的 .ToString() 调用可能会被抖动优化为无操作,如果它是 NULL生成的 DBNull.Value.ToString() 表达式会生成您想要的空字符串。

    但是,如果您使用的是非字符串类型,您最终可能会做 重要 额外的工作,尤其是像 DateTime 或需要特定格式的数值之类的东西。请记住,国际化问题意味着解析和组合日期和数值实际上是非常昂贵的操作;为避免这些操作而做“额外”工作通常是非常值得的。

    【讨论】:

    • 感谢您的帮助和解释!现在应用程序运行正常
    【解决方案2】:
            con.Open()
            cmd = New SqlCommand
            cmd.CommandText = " select  sum (Income_Amount)  from Income where Income_Month= '" & ComboBox1.Text & "' and Income_year=" & txtyearpro.Text & ""
            cmd.Connection = con
            dr = cmd.ExecuteReader
            If dr.Read = True Then
                txtincome1.Text = dr(0).ToString  ' ToString  converts null values into string '
    
            End If
    

    【讨论】:

    【解决方案3】:

    最简单的方法可能就是将它与一个空字符串连接起来:

    hfSupEmail.Value = dt.Rows(0)("SupEmail") & ""
    

    【讨论】:

      【解决方案4】:

      您可以将Field method of the DatarowIf Operator 结合使用来检查一行中的Null 值,如下所示。如果为 null,您可以将其替换为空字符串(或您选择的其他字符串):

      hfSupEmail.Value = If(dt.Rows(0).Field(Of String)("SupEmail"), "")
      

      【讨论】:

        【解决方案5】:

        希望这个帮助.... dt.Rows(0)("SupEmail") 返回 null

        在分配之前避免这个检查

        If Not IsDBNull(dt.Rows(0)("SupEmail")) Then
            hfSupEmail.Value = dt.Rows(0)("SupEmail")
        End If
        

        【讨论】:

          【解决方案6】:

          要从代码中处理,这里有一个小的扩展方法

          Imports Microsoft.VisualBasic
          Imports System.Runtime.CompilerServices
          
          Public Module HTMLExtensionMethods
              <Extension()> _
              Public Function DefaultIfDBNull(Of T)(ByVal obj As Object) As T
                  Return If(Convert.IsDBNull(obj), CType(Nothing, T), CType(obj, T))
              End Function
          End Module
          

          这样称呼它。

          hfSupEmail.Value = dt.Rows(0)("SupEmail").DefaultIfDBNull(Of String)()
          

          【讨论】:

            【解决方案7】:

            您应该在数据库查询级别本身处理它。

            代替“从学生中选择姓名”,使用“从学生中选择 IsNull(name,'') as name

            这样,DB 会处理你的 NULL 值。

            【讨论】:

            • 在应用层执行这项工作通常效率更高。
            • 有什么具体原因吗?在我看来,最好在数据库级别处理而不是在应用程序级别处理它,因为在应用程序中,您正在再次使用应用程序服务器来处理请求。
            • 不是“再次”:您这样做是同一次参与的一部分。应用程序服务器(或应用程序本身)直接参与数据库,并将其作为该过程的一部分进行处理。与应用程序服务器相比,数据库服务器的许可成本通常很高,即使使用免费的数据库引擎,它们通常也很难相对于应用程序服务器进行性能调整或横向扩展,因此与处理相比,应用程序服务器上的 CPU 时间和 RAM 非常便宜数据库服务器上的时间。
            • Joel @ 请也看看programmers.stackexchange.com/questions/36428/… 可以对此进行辩论。这取决于用例的用例。所以你也是对的。
            【解决方案8】:

            显然你的dt.Rows(0)("SupEmail") 是来自数据库的NULL,你不能将NULL 分配给字符串属性。尝试将该行替换为:

            hfSupEmail.Value = If(IsDbNull(dt.Rows(0)("SupEmail")), String.Empty, dt.Rows(0)("SupEmail").ToString)
            

            代码检查 value 是否为 NULL,如果是 - 将其替换为空字符串,否则使用原始值。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-08-03
              • 2023-03-07
              • 2015-06-07
              • 1970-01-01
              • 2012-11-19
              • 2011-10-05
              • 1970-01-01
              相关资源
              最近更新 更多