2010-02-09 7 views
4

Certaines tables auxquelles j'ai affaire ont des valeurs nulles et sont des erreurs de lancement. Jusqu'à présent, j'ai essayé quelques solutions pour traiter les nulls sans succès.SQLDataReader: Traitement des valeurs nulles

Voici les exemples de code de mes efforts jusqu'ici;

If (r("datemodified").Equals(DBNull.Value)) Then 
       datemodified = String.Empty 
      Else 
       datemodified = (r("datemodified")) 
      End If 

et;

If r.HasRows Then 
       datemodified = (r("datemodified")) 
      Else 
       datemodified = String.Empty 
      End If 

et;

If r("datemodified") = Nothing Then 
       datemodified = String.Empty 
      Else 
       datemodified = (r("datemodified")) 
      End If 

et;

If r.IsDBNull("datemodified") Then 
       datemodified = String.Empty 
      Else 
       datemodified = (r("datemodified")) 

et via sql;

Select isnull(datemodified, '') 

Le résultat final est une exception IndexOutOfRangeException.

voici le sql;

select datemodified, maintainedby, email, hitcount from grouping where id = @footid 

ps, ​​j'ai couru la requête et il fonctionne ok (ie tous les cols existent)

+0

'IOORE' _where_? –

+0

datemodified (si je commente cette ligne, alors elle en jette immédiatement une autre sur la ligne suivante qui est maintenue par) La raison pour les NULL est quand les gens mettent à jour les pages qu'ils ne remplissent pas toujours les détails. Personnellement, je refuserais les nulls, mais le db est un héritage. – Phil

+0

Pouvez-vous ajouter votre SQL que vous utilisez à votre question? – Kamal

Répondre

5

Pour gérer la valeur NULL dans le code que vous pouvez utiliser la méthode IsDBNull:

Dim index As Integer = r.GetOrdinal("datemodified") 
If r.IsDBNull(index) Then 
    datemodified = String.Empty 
Else 
    datemodified = r(index) 
End If 

pour gérer la valeur nULL dans SQL vous devez donner le champ un nom, pour être en mesure d'y accéder par son nom dans le lecteur de données:

select datemodified = isnull(datemodified, '') 
+0

Merci pour l'aide. Après avoir essayé ces deux méthodes, le problème persiste. – Phil

+1

Ensuite, le problème est ailleurs ... Appelez-vous Read avant d'essayer d'obtenir des données du lecteur de données? Vérifiez la valeur de r.FieldCount pour voir si vous avez réellement des colonnes dans le résultat, et r.GetOrdinal ("datemodified") pour voir si le champ est l'un d'entre eux. – Guffa

+0

Merci Guffa, Son travaille maintenant. Merci beaucoup pour l'aide! – Phil

2

L'exception IndexOutofRangeException de la colonne à laquelle vous essayez d'accéder n'existe pas dans le jeu de résultats. Lorsque vous accédez à l'ordinal ou à la colonne via SqlDataReader, vous devez spécifier l'index de la colonne ou le nom de la colonne. Dans votre scénario, vous devez spécifier un alias pour le retour de la colonne SQL.

SELECT ISNULL(datemodified, '') AS [datemodified] 
+0

Merci pour l'aide. Après avoir édité j'ai; sélectionnez ISNULL (datemodified, '') AS datemodifié, maintenu par, email, hitcount du groupement où id = @footid. Malheureusement, l'exception est toujours en cours. – Phil