2011-07-14 47 views
3

我正在從以下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的值爲一個非NULL值的CompleteDate。

我該如何解決這個問題?對於某些日期,上面的代碼完美運行。但是對於一些更新的記錄,事實並非如此。但是我能夠從具有相同日期範圍的T-SQL查詢中獲得輸出,並且沒有錯誤;它也很快運行。我檢查了這個「Date_Completed」和「Review_Date」NULL值的T-SQL查詢,但無論如何,「CompleteDate」總是= NON-Null值。所以我不明白這是怎麼發生的。

這裏是我的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 
+3

NOOOO!不要使用字符串連接來將值替換爲查詢! **不要這樣做!** –

+3

他是對的,有了這段代碼,你可以很容易地注入sql! – David

+0

在您的查詢中,是「EXCEL」模式,還是您以某種方式加入Excel表單?或者我們只處理SQL? –

回答

3

在詢問數值之前,檢查是否有dRow.IsNull(「CompleteDate」)。

或者,如果這是'不應該'是不可能的,請將您的查詢更改爲永不返回可能爲空的行。

+0

@Joel,我認爲OP使用的是DataRow,所以正確的函數是'IsNull'。如果它是一個DataReader,你是對的,它會是'IsDBNull'。 –

+0

你是對的 - 我的錯:( –

+0

)感謝Joel,但這不起作用。IsNull不是公認的VB.NET函數,而且我嘗試了IsDBNull,但是這導致了編譯錯誤,因爲它不是正確的數據類型。請參閱我可以使用IsDBNull是做單獨的「如果」陳述,因爲我上面解釋。但是,這是超時對我。其他建議? – user371819

0

我用一個子(每種數據類型不同),以從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