2011-07-14 46 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