将类型为“DBNull”的值转换为类型为“String”是无效的。

27

我收到了这个问题

将类型 'DBNull' 转换为类型 'String' 不是有效的。

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

我非常新手,不太确定确切的问题是什么。有人可以指导我吗?

非常感谢。

8个回答

34

快速且简单的解决方法:

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

或者对于C#:

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

如果你的最终目标和源数据已经是字符串,那么这种方法非常有效,因为对于已经是字符串的任何额外的.ToString()调用很可能会被JIT编译器优化为no-op,而如果它为NULL,则产生的DBNull.Value.ToString()表达式将生成所需的空字符串。

然而,如果你正在使用非字符串类型,你可能会做出重大的额外工作,特别是对于一些需要特定格式的DateTime或数值类型。请记住,国际化问题意味着解析和组合日期和数字值实际上是非常昂贵的操作;为避免这些操作而进行“额外”工作往往是非常值得的。


感谢您的帮助和解释!现在应用程序运行良好。 - user3571305

7

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

为了避免这种情况,在分配之前进行检查。

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

4

你应该在数据库查询层面进行处理。

而不是使用"select name from student",应该使用"select IsNull(name,'') as name from student"

这样做,数据库将会处理你的 NULL 值。


在应用程序层完成这项工作通常更加高效。 - Joel Coehoorn
有任何特定的原因吗?在我看来,最好在数据库层面处理它,而不是在应用程序层面处理它,因为在应用程序中,您需要再次启动应用程序服务器来处理请求。 - Amnesh Goel
不是“再次”:您将其作为同一承诺的一部分执行。应用程序服务器(或应用程序本身直接)与DB建立联系,并将其作为该过程的一部分处理。与应用程序服务器相比,DB服务器的许可证通常很昂贵,即使使用免费的数据库引擎,相对于应用程序服务器,它们通常很难进行性能调整或扩展,因此应用程序服务器上的CPU时间和RAM非常便宜,而在DB服务器上的处理时间则很长。 - Joel Coehoorn
Joel @ 请也看一下http://programmers.stackexchange.com/questions/36428/how-will-you-handle-null-values-in-your-application这个可以有不同的观点。它取决于具体情况。所以你也是正确的。 - Amnesh Goel

2

显然,你从数据库中获取的dt.Rows(0)("SupEmail")为空,你无法将NULL赋值给字符串属性。尝试用以下代码替换该行:

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

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

1

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

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)()

1
你可以使用数据行的 Field 方法If 操作符 结合在一行中检查是否为 Null 值。如果为 Null,你可以将其替换为一个空字符串(或其他你选择的字符串)。
hfSupEmail.Value = If(dt.Rows(0).Field(Of String)("SupEmail"), "")

0
        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

1
你好,Naasir,请编辑你的问题以遵守这些规则:https://stackoverflow.com/help/how-to-ask。 - panoskarajohn

0

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

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

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