Преобразование из типа 'DBNull' в тип 'String' недопустимо
Я получаю эту проблему
Преобразование из типа 'DBNull' в тип 'String' недопустимо.
Строка 501: hfSupEmail.Value = dt.Rows(0)("SupEmail")
я очень новичок в этом, я не совсем уверен, в чем именно заключается проблема, может ли кто-то направить меня?
Большое спасибо
7 ответов
Быстрое и грязное исправление:
hfSupEmail.Value = dt.Rows(0)("SupEmail").ToString()
Это работает очень хорошо, когда ваша конечная цель и исходные данные уже являются строками. Это потому, что любой дополнительный .ToString()
вызов чего-то, что уже является строкой, обычно оптимизируется джиттером в неоперативный режим, и если он равен NULL, то результирующий DBNull.Value.ToString()
выражение создает пустую строку, которую вы хотите.
Однако, если вы работаете со нестроковыми типами, вы можете выполнить дополнительную работу, особенно с чем-то вроде DateTime, если вам нужно определенное форматирование.
Надеюсь, что это поможет.... dt.Rows(0)("SupEmail")
возвращает ноль
Чтобы избежать этого ччек перед назначением
If Not IsDBNull(dt.Rows(0)("SupEmail")) Then
hfSupEmail.Value = dt.Rows(0)("SupEmail")
End If
Вы должны обрабатывать это на самом уровне запросов к БД.
вместо "выберите имя из студента", используйте "выберите IsNull(имя,'') как имя из студента"
Таким образом, DB будет обрабатывать ваше значение NULL.
Видимо твой dt.Rows(0)("SupEmail")
приходит как NULL из БД, и вы не можете присвоить NULL строковому свойству. Попробуйте заменить эту строку на:
hfSupEmail.Value = If(IsDbNull(dt.Rows(0)("SupEmail")), String.Empty, dt.Rows(0)("SupEmail").ToString)
Код проверяет, является ли значение NULL и, если оно есть, заменяет его пустой строкой, в противном случае используется исходное значение.
Чтобы справиться с этим из кода, вот небольшой метод расширения
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)()
Вы можете использовать метод поля Datarow в сочетании с оператором If, чтобы проверить нулевое значение в одной строке, как эта. Если оно пустое, вы можете заменить его пустой строкой (или другой строкой по вашему выбору):
hfSupEmail.Value = If(dt.Rows(0).Field(Of String)("SupEmail"), "")
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") & ""