J'utilise un SQLdatareader pour créer des POCO à partir d'une base de données. Le code fonctionne sauf lorsqu'il rencontre une valeur nulle dans la base de données. Par exemple, si la colonne FirstName de la base de données contient une valeur nulle, une exception est levée.
employee.FirstName = sqlreader.GetString(indexFirstName);
Quelle est la meilleure façon de gérer les valeurs nulles dans cette situation?
c#
sqldatareader
DenaliHardtail
la source
la source
int colIndex = reader.GetOrdinal(fieldname);
et surcharger facilement laSafeGetString
fonction de @ marc_s .Vous devez utiliser l'
as
opérateur combiné avec l'??
opérateur pour les valeurs par défaut. Les types de valeurs devront être lus comme nullables et donnés par défaut.L'
as
opérateur gère le casting, y compris la vérification de DBNull.la source
sqlreader[indexAge] as string ?? ""
, vous obtiendrez toujours""
. Déterminez si vous voulez vraiment à la(int?)sqlreader[indexAge] ?? defaultValue
place, donc si votre SQL change, vous obtenez des exceptions au lieu de mauvaises valeurs. @ Stevo3000: la valeur par défaut (int) est 0, pas -1. @Chris: Assurez-vous que vous utilisez celui que vous voulez vraiment.Pour une chaîne, vous pouvez simplement transtyper la version de l'objet (accessible à l'aide de l'opérateur de tableau) et terminer avec une chaîne nulle pour null:
ou
Pour les entiers, si vous transtypez en un entier nullable, vous pouvez utiliser GetValueOrDefault ()
ou l'opérateur de coalescence nulle (
??
).la source
null
mais plutôt un objet DBNull. La différence entre les deux instructions est que la première échouera s'il ne s'agit pas d'une chaîne, tandis que la seconde renverra simplement null si ce n'est pas une chaîne.IsDbNull(int)
est généralement beaucoup plus lent que d'utiliser des méthodes tellesGetSqlDateTime
que puis comparer àDBNull.Value
. Essayez ces méthodes d'extension pourSqlDataReader
.Utilisez-les comme ceci:
la source
Une façon de le faire est de vérifier les valeurs nulles db:
la source
reader.IsDbNull(ColumnIndex)
fonctionne comme beaucoup de réponses le disent.Et je tiens à mentionner que si vous travaillez avec des noms de colonne, la simple comparaison des types peut être plus confortable.
la source
Je ne pense pas qu'il y ait une valeur de colonne NULL , lorsque les lignes sont retournées dans un datareader en utilisant le nom de la colonne.
Si vous le faites,
datareader["columnName"].ToString();
il vous donnera toujours une valeur qui peut être une chaîne vide (String.Empty
si vous avez besoin de comparer).J'utiliserais ce qui suit et ne m'inquiéterais pas trop:
la source
Cette solution dépend moins du fournisseur et fonctionne avec un lecteur SQL, OleDB et MySQL:
la source
Ce que j'ai tendance à faire, c'est de remplacer les valeurs nulles de l'instruction SELECT par quelque chose de approprié.
Ici, je remplace chaque null par une chaîne vide. Votre code ne générera pas d'erreur dans ce cas.
la source
Vous pouvez écrire une fonction générique pour vérifier Null et inclure la valeur par défaut lorsqu'elle est NULL. Appelez cela lorsque vous lisez Datareader
Lors de la lecture de l'utilisation de Datareader
la source
Vérifiez
sqlreader.IsDBNull(indexFirstName)
avant d'essayer de le lire.la source
En influençant la réponse de getpsyched , j'ai créé une méthode générique qui vérifie la valeur de la colonne par son nom
Usage:
la source
comment créer des méthodes d'assistance
Pour chaîne
Usage
Pour Int
Usage
Pour la date
Usage
Remarque: pour DateTime, déclarez varialbe comme
la source
En complément de la réponse de marc_s, vous pouvez utiliser une méthode d'extension plus générique pour obtenir des valeurs du SqlDataReader:
la source
Je pense que vous voudriez utiliser:
la source
Nous utilisons une série de méthodes statiques pour extraire toutes les valeurs de nos lecteurs de données. Dans ce cas, nous appellerions
DBUtils.GetString(sqlreader(indexFirstName))
L'avantage de créer des méthodes statiques / partagées est que vous n'avez pas à faire les mêmes vérifications encore et encore et encore ...La ou les méthodes statiques contiendraient du code pour vérifier les valeurs nulles (voir les autres réponses sur cette page).
la source
Vous pouvez utiliser l'opérateur conditionnel:
la source
Il y a beaucoup de réponses ici avec des informations utiles (et des informations erronées) répandues, j'aimerais rassembler tout cela.
La réponse courte à la question est de vérifier DBNull - presque tout le monde est d'accord sur ce bit :)
Plutôt que d'utiliser une méthode d'aide pour lire les valeurs nullables par type de données SQL, une méthode générique nous permet de résoudre ce problème avec beaucoup moins de code. Cependant, vous ne pouvez pas avoir une seule méthode générique pour les types de valeur nullable et les types de référence, cela est longuement discuté dans le type Nullable comme paramètre générique possible? et contrainte de type générique C # pour tout ce qui peut être annulé .
Donc, à la suite des réponses de @ZXX et @getpsyched, nous nous retrouvons avec cela, 2 méthodes pour obtenir des valeurs Nullable et j'ai ajouté une 3ème pour les valeurs non Null (elle complète l'ensemble basé sur la dénomination des méthodes).
J'utilise généralement des noms de colonnes, modifiez-les si vous utilisez des index de colonnes. Sur la base de ces noms de méthode, je peux dire si je m'attends à ce que les données soient nulles ou non, ce qui est très utile lorsque l'on regarde du code écrit il y a longtemps.
Conseils;
Enfin, en testant les méthodes ci-dessus sur tous les types de données SQL Server, j'ai découvert que vous ne pouvez pas obtenir directement un char [] d'un SqlDataReader, si vous voulez un char [], vous devrez obtenir une chaîne et utiliser ToCharArray ().
la source
J'utilise le code répertorié ci-dessous pour gérer les cellules nulles dans une feuille Excel qui est lue dans une table de données.
la source
la source
et / ou utiliser un opérateur ternaire avec affectation:
remplacer la valeur par défaut (lorsqu'elle est nulle) comme appropriée pour chaque type de propriété ...
la source
Cette méthode dépend de indexFirstName qui doit être l'ordinal de colonne de base zéro.
Si vous ne connaissez pas l'index des colonnes mais que vous ne voulez pas vérifier un nom, vous pouvez utiliser cette méthode d'extension à la place:
Et utilisez la méthode comme ceci:
la source
Vieille question mais peut-être que quelqu'un a encore besoin d'une réponse
en vrai j'ai travaillé autour de cette question comme ça
Pour int:
de même pour la chaîne, il suffit de retourner "" au lieu de 0 car "" est une chaîne vide
vous pouvez donc l'utiliser comme
et
très flexible pour que vous puissiez insérer n'importe quelle requête pour lire n'importe quelle colonne et elle ne reviendra jamais avec une erreur
la source
Voici une classe d'assistance que les autres peuvent utiliser s'ils en ont besoin en fonction de la réponse de @marc_s:
la source
Convertissez les poignées DbNull de manière sensible.
la source
vous pouvez également vérifier cela
la source
SqlDataReader