我收到了这个问题
将类型 'DBNull' 转换为类型 'String' 不是有效的。
第501行:hfSupEmail.Value = dt.Rows(0)("SupEmail")
我非常新手,不太确定确切的问题是什么。有人可以指导我吗?
非常感谢。
快速且简单的解决方法:
hfSupEmail.Value = dt.Rows(0)("SupEmail").ToString()
或者对于C#:
hfsupEmail.Value = dt.Rows[0]["SupEmail"].ToString();
如果你的最终目标和源数据已经是字符串,那么这种方法非常有效,因为对于已经是字符串的任何额外的.ToString()
调用很可能会被JIT编译器优化为no-op,而如果它为NULL,则产生的DBNull.Value.ToString()
表达式将生成所需的空字符串。
然而,如果你正在使用非字符串类型,你可能会做出重大的额外工作,特别是对于一些需要特定格式的DateTime
或数值类型。请记住,国际化问题意味着解析和组合日期和数字值实际上是非常昂贵的操作;为避免这些操作而进行“额外”工作往往是非常值得的。
希望这能有所帮助...
dt.Rows(0)("SupEmail")
返回 null
为了避免这种情况,在分配之前进行检查。
If Not IsDBNull(dt.Rows(0)("SupEmail")) Then
hfSupEmail.Value = dt.Rows(0)("SupEmail")
End If
你应该在数据库查询层面进行处理。
而不是使用"select name from student",应该使用"select IsNull(name,'') as name from student"
这样做,数据库将会处理你的 NULL 值。
显然,你从数据库中获取的dt.Rows(0)("SupEmail")
为空,你无法将NULL赋值给字符串属性。尝试用以下代码替换该行:
hfSupEmail.Value = If(IsDbNull(dt.Rows(0)("SupEmail")), String.Empty, dt.Rows(0)("SupEmail").ToString)
为了从代码中处理它,这里有一个小的扩展方法
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)()
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
最简单的方法可能就是将其与空字符串连接起来:
hfSupEmail.Value = dt.Rows(0)("SupEmail") & ""