Преобразование из типа 'DBNull' в тип 'Date' недопустимо - PullRequest
3 голосов
/ 14 июля 2011

Я получаю это исключение из следующего кода VB.NET только на определенные месяцы:

System.InvalidCastException: Conversion from type 'DBNull' to type 'Date' is not valid.

Это происходит на линии:

If CDate(dRow("CompleteDate")).ToString("d") = arrWeekYear(i, 1).ToString("d") Then

Если я правильно понимаю, проблема в том, что я пытаюсь сравнить некоторые значения NULL для CompleteDate со значением, отличным от NULL.

Как мне это исправить? Для некоторых дат этот код выше работает отлично. Однако для некоторых более поздних записей это не так. Но я могу получить вывод из запроса T-SQL с тем же диапазоном дат, и нет никаких ошибок; это бежит также быстро. И я исследовал этот запрос T-SQL для значений NULL «Date_Completed» и «Review_Date», но в любом случае «CompleteDate» всегда был = NON-нулевое значение. Поэтому я не понимаю, как это происходит.

Вот мой запрос VB.NET:

            commandstring = "SELECT Batch_Records.Part_Number, Batch_Records.Lot_Number, Batch_Records.Date_Received, " & _
                "IsNull([Date_Completed], [Review_Date]) AS [CompleteDate], Batch_Records.Error, " & _
                "Batch_Records.[Group], Batch_Records.MFG, Batch_Records.MFG2, Batch_Records.QC, Batch_Records.QC2, " & _
                "QC_CODES.CODE_DESC, DATEADD(DD, 1 - DATEPART(DW, Batch_Records.Date_Received), Batch_Records.Date_Received) AS SundayDate " & _
                "FROM EXCEL.Batch_Records LEFT JOIN EXCEL.QC_CODES ON Batch_Records.Part_Number = QC_CODES.CODE_ID " & _
                "WHERE (Batch_Records.[Group]" & TheGroup & " AND Batch_Records.Date_Received > '" & FirstWeek & "' AND Batch_Records.Date_Received < dateadd(Day, 1, '" & LastWeek & "'))" & _
                   "ORDER BY Batch_Records.Date_Received"

Когда я добавляю эту строку выше строки, вызывающей ошибки, мой отчет истекает в течение этих месяцев. Так что же делать?

If Not dRow("CompleteDate") Is System.DBNull.Value Then

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

проверьте значение null с помощью dRow.IsNull («CompleteDate»), прежде чем запрашивать значение.

Или, если это «предполагается», изменить свой запрос, чтобы он никогда не возвращал строки, в которых он может быть.нуль.

0 голосов
/ 15 июля 2011

Я использую подпрограмму (различную для каждого типа данных), чтобы получить данные из Datareader, используя индекс вместо имени:

#If Access Then
<Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
Friend Function GetDbStringValue(ByVal Dr As OleDbDataReader, ByVal nr As Integer) As String
#Else
<Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
Friend Function GetDbStringValue(ByVal Dr As MySqlDataReader, ByVal nr As Integer) As String
#End If
    If IsDBNull(Dr.Item(nr)) Then
        Return ""
    Else
        Return Dr.GetString(nr).TrimEnd
    End If
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...