La Conversion de type DBNull de type 'Date' n'est pas valide
Je reçois cette exception suivante VB.NET code pour seulement certains mois:
System.InvalidCastException: Conversion from type 'DBNull' to type 'Date' is not valid.
Il arrive sur la ligne:
If CDate(dRow("CompleteDate")).ToString("d") = arrWeekYear(i, 1).ToString("d") Then
Si je comprends bien, le problème c'est que je suis en train de comparer des valeurs NULL pour CompleteDate à une valeur non NULLE.
Comment puis-je résoudre ce problème? Pour certaines dates, le code ci-dessus fonctionne parfaitement. Cependant, pour certains des plus récents enregistrements, il ne le fait pas. Mais je suis en mesure d'obtenir la sortie de la requête T-SQL avec la même plage de date et il n'y a pas d'erreurs; il s'exécute rapidement aussi. Et j'ai examiné cette requête T-SQL pour les deux "Date_Completed" et "Review_Date" les valeurs NULL, mais de toute façon, "CompleteDate" a toujours été = valeur NON Null. Donc je ne comprends pas comment cela se passe.
Voici mon VB.NET requête:
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"
Quand j'ai ajouter cette ligne au-dessus de l'erreur causant la ligne ci-dessus, mon rapport pour ces mois. Alors, que faire?
If Not dRow("CompleteDate") Is System.DBNull.Value Then
Il est vrai, avec ce code, vous pouvez facilement sql injectée !!!
Dans votre requête, est
EXCEL
le schéma, ou vous joindre à l'encontre d'une feuille excel en quelque sorte? Ou avons-nous affaire à SQL?Quel est le type de données de l'CompleteDate de la colonne?
+1 à David pour expliquer pourquoi c'est mauvais!!!
OriginalL'auteur user371819 | 2011-07-14
Vous devez vous connecter pour publier un commentaire.
vérifier la valeur null à la dRow.IsNull("CompleteDate") avant de demander la valeur.
Ou si c'est "censé être" impossible, de changer votre requête de ne jamais retourner les lignes où il peut être null.
IsNull
. Si c'était un objet DataReader, vous avez raison, il seraitIsDBNull
.Vous êtes à la droite de ma faute 🙁
Merci Joel, mais cela ne fonctionne pas. IsNull n'est pas reconnu VB.NET fonction. Et j'ai essayé IsDBNull, mais cela a provoqué une erreur de compilation car c'est pas le bon type de données. Seule façon que je vois que je peux utiliser IsDBNull est de faire des "Si" déclaration comme je l'ai expliqué ci-dessus. Mais c'est le moment sur moi. Toutes les autres suggestions?
qu'est-ce que la drow? Un DataRow? C'est la méthode dont je parle: msdn.microsoft.com/en-us/library/3fwatee0.aspx
oui, c'est un DataRow
OriginalL'auteur agent-j
- Je utiliser un sous (différents pour chaque type de données) pour obtenir des données à partir d'un Datareader, à l'aide de l'index à la place du nom:
OriginalL'auteur Martin