Преобразование из типа '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") & ""

Другие вопросы по тегам