Преобразование из типа "DBNull" в тип "String" недействительно

Я получаю эту проблему

Преобразование из типа DBNull для типа 'String' недопустимо.

Строка 501: hfSupEmail.Value = dt.Rows(0) ( "SupEmail" )

Я очень новичок в этом, я не совсем уверен, что такое точная проблема может ли кто-нибудь меня вести?

Большое спасибо

Ответы

Ответ 1

Быстрое и грязное исправление:

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

Это очень хорошо работает, когда ваша конечная цель и исходные данные уже являются строками. Это связано с тем, что любой дополнительный вызов .ToString() для чего-то, что уже строка, как правило, оптимизируется джиттером в бездействие, и если оно равно NULL, то получающееся выражение DBNull.Value.ToString() создает пустую нужную строку.

Однако, если вы работаете со нестроковыми типами, вы можете выполнить значительную дополнительную работу, особенно с чем-то вроде DateTime или числовым значением, где вы хотите конкретное форматирование. Помните, что проблемы интернационализации означают, что синтаксический анализ и составление значений даты и числа на самом деле являются удивительно дорогими операциями; выполнение "дополнительной" работы, чтобы избежать этих операций, часто более чем стоит.

Ответ 2

Надеюсь, эта помощь....  dt.Rows(0)("SupEmail") возвращает null

Чтобы избежать этого chcek перед назначением

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

Ответ 3

По-видимому, ваш dt.Rows(0)("SupEmail") приходит как NULL из БД и вы не можете назначить NULL для свойства string. Попробуйте заменить эту строку следующим образом:

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

Код проверяет, является ли значение NULL, а если оно - заменяет его пустой строкой, в противном случае используется исходное значение.

Ответ 4

Вы должны обрабатывать его непосредственно на уровне запросов БД.

instead of "select name from student", use "select IsNull(name,'') as name from student"

Таким образом, DB будет обрабатывать ваше значение NULL.

Ответ 5

Чтобы обработать его из кода, здесь приведен небольшой метод расширения

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

Ответ 6

Вы можете использовать метод Field of the Datarow в сочетании с If Оператор, чтобы проверить значение Null в одной строке, как это. Если оно равно null, вы можете заменить его пустой строкой (или другой строкой по вашему выбору):

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

Ответ 7

Самый простой способ - это просто связать его с пустой строкой:

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

Ответ 8

Помогите пожалуйста Преобразование из типа 'DBNull' в тип 'String' не

        Computer_Name = Me.DataGridView1.Rows(i).Cells(1).Value
        Computer_Serial_Number = Me.DataGridView1.Rows(i).Cells(2).Value
        Monitor_Serial_Number = Me.DataGridView1.Rows(i).Cells(3).Value
        Department = Me.DataGridView1.Rows(i).Cells(4).Value
        System_Manufacture = Me.DataGridView1.Rows(i).Cells(5).Value
        User_Name = Me.DataGridView1.Rows(i).Cells(6).Value.ToString