2013-04-29 5 views
0

Mon code est basiquement ceci:Récupération quelque chose qui pourrait être nul à partir d'une base de données

//get connection 
//make connection string which returns one value 
//open connection 
string picture = command.ExecuteScalar().ToString(); 
//close connection 

La possibilité que la requête retourne null est là. Alors, comment puis-je savoir si son null et ensuite le stocker dans ma chaîne? Ce que j'ai utilisé ci-dessus ne fonctionne pas parce que la chaîne jette une exception. Puis-je temporairement stocker la valeur dans quelque chose puis la renvoyer à la chaîne? Je ne veux pas exécuter deux ExecuteScalars pour savoir si son null d'abord, puis le stocker.

+1

bases de données doivent * pas * contenir des valeurs nulles. Lire sur la normalisation de la table. – christopher

+0

Ce n'est pas le la table contient une valeur nulle c'est que la relation n'existe pas. –

+0

@ChrisCooney: Pourquoi les bases de données ne doivent pas contenir de valeurs NULL? NULL a été conçu pour exprimer "des informations manquantes et des informations inapplicables", il est tout à fait logique de les utiliser le cas échéant. – CodeZombie

Répondre

0

que je fais habituellement ceci:

string picture = null; 
object picTemp = command.ExecuteScalar(); 
if (picTemp != null && picTemp != System.DBNull.Value) { 
    picture = (string)picTemp; 
} 

picTemp sera null si aucun résultat n'a été retourné. Ce sera System.DBNull.Value si un résultat a été renvoyé mais la valeur du résultat est null.

+0

Un grand merci. J'ai essayé d'utiliser un objet avant mais j'ai oublié d'enlever .ToString() sur ma commande -_-. –

0

Tout ce que vous devez faire est de vérifier null:

string picture = command.ExecuteScalar() as string; 
if(picture == null) 
{ 
    // Handle the NULL case 
} 

// Do something with picture... 

Comme ce que je peux voir de la documentation, vous n'avez pas de vérifier System.DBNull.Value car il ne doit pas être retourné par ExecuteScalar().

Valeur de retour
Type: System.Object
La première colonne de la première ligne de le jeu de résultats, ou une référence null (Nothing en Visual Basic) si le jeu de résultats est vide. Renvoie un maximum de 2033 caractères.

De http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

+0

Je peux me tromper sur cela parce que je vais de la mémoire, mais "plain old' null' "est pour les requêtes qui ne renvoient aucun résultat. Exemple: 'SELECT * FROM DUAL WHERE 1 = 2'. Pas de lignes, pas de colonnes; 'ExecuteScalar' renvoie' null'. D'un autre côté, considérons 'SELECT NULL FROM DUAL'. Cela a un jeu de résultats: une ligne, une colonne et la valeur de la colonne est null. 'ExecuteScalar' renverra' System.DBNull.Value' ici. –

Questions connexes