Преобразование типа «DBNull» в тип «Integer» недопустимо в конструкторе

У меня есть код ниже в классе Entity. Он выдает исключение в Entity.Designer.vb, говоря, что значение Amount в Table Patient равно DbNull.

    If _patientDetails.ID > 0 Then
        If _patientDetails.Amount = EntityEnums.Patient.Existing
            Then                          
               _patientDetails.SetAmountNull()
        End If
    Catch ex As Exception
        _patientDetails.SetAmountNull()
    End Try

End If

Он переходит к строке «Возврат», как показано ниже, и выдает исключение.

Public Property Amount() As Integer
    Get
        Try 
            Return CType(Me(Me.tablePatient.AmountIDColumn),Integer)
        Catch e As Global.System.InvalidCastException
            Throw New Global.System.Data.StrongTypingException("The value for column 'AmountIDColumn' in table 'Patient' is D"& _ 
                    "BNull.", e)
        End Try
    End Get
    Set
        Me(Me.tablePatient.AmountIDColumn) = value
    End Set
End Property

Сведения об исключении

Возникло первое случайное исключение типа «System.InvalidCastException» в Microsoft.VisualBasic.dll.

Дополнительная информация: Преобразование типа «DBNull» в тип «Integer» недопустимо.


person Jasmine    schedule 30.12.2015    source источник
comment
Ваш первый блок кажется неполным/глупым.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 31.12.2015
comment
@Plutonix: Привет, Plutonix, я просто изменил несколько имен, вот и все. Это ошибка, что dbnull для целочисленного приведения. Везде у них это есть, но я боюсь, что только в этом месте выдает ошибку, потому что я использовал эту колонку. Любые предложения, пожалуйста, решить?   -  person Jasmine    schedule 31.12.2015
comment
@Plutonix: исправил   -  person Jasmine    schedule 31.12.2015
comment
Нет. Блок If для If _patientDetails.Amount имеет неправильный формат. Строки не начинаются с Then   -  person Ňɏssa Pøngjǣrdenlarp    schedule 31.12.2015
comment
@Plutonix: это то, что есть в моем проекте. И, как вы подозреваете, это именно то место, где он выдает исключение, но когда управление переходит к блоку First If. Очевидно, что он пытается получить доступ к этому свойству и в этом свойстве выдает исключение.   -  person Jasmine    schedule 31.12.2015
comment
@Plutonix: исправил   -  person Jasmine    schedule 31.12.2015


Ответы (2)


В конечном счете, действительно: вы не можете преобразовать DBNull в целое число. Вам нужно будет проверить DBNull и указать все, что вы хотите, чтобы произошло в этом сценарии. Возможно, обработайте его как 0 или -1, возможно, сделайте что-то другое: это знаете только вы.

Если бы это был С#, я бы использовал:

var val = tablePatient.AmountIDColumn;
if(val is DBNull) {
    // special-case; return 0, perhaps
} else {
    // cast, etc
    return (int)val; // or Convert.ChangeType, if it is something exotic
}

(у меня VB-foo слабенький, поэтому оставлю перевод в качестве упражнения для читателя)

person Marc Gravell    schedule 30.12.2015

Попробуй это:

    If _patientDetails.ID > 0 Then
        If (Not _patientDetails.IsAmountNull) AndAlso (_patientDetails.Amount = EntityEnums.Patient.Existing) Then
            _patientDetails.SetAmountNull()
        End If
    End If          

    Catch ex As Exception
        _patientDetails.SetAmountNull()
    End Try
person shadow    schedule 31.12.2015