J'ai eu l'erreur ci-dessus dans mon application. Voici le code original
public string GetCustomerNumber(Guid id)
{
string accountNumber =
(string)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidmyApp,
CommandType.StoredProcedure,
"GetCustomerNumber",
new SqlParameter("@id", id));
return accountNumber.ToString();
}
J'ai remplacé par
public string GetCustomerNumber(Guid id)
{
object accountNumber =
(object)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidCRM,
CommandType.StoredProcedure,
"spx_GetCustomerNumber",
new SqlParameter("@id", id));
if (accountNumber is System.DBNull)
{
return string.Empty;
}
else
{
return accountNumber.ToString();
}
}
Y a-t-il un meilleur moyen de contourner cela?
Réponses:
Un formulaire plus court peut être utilisé:
EDIT: Je n'ai pas fait attention à ExecuteScalar. Il renvoie vraiment null si le champ est absent du résultat renvoyé. Alors utilisez plutôt:
la source
null
, si la ligne sélectionnée aNULL
dans cette colonne, la valeur de retour estSystem.DBNull
.Avec une simple fonction générique, vous pouvez rendre cela très facile. Faites juste ceci:
en utilisant la fonction:
la source
ExecuteScalar retournera
Si vous savez que la première colonne du jeu de résultats est une chaîne, alors pour couvrir toutes les bases, vous devez vérifier à la fois null et DBNull. Quelque chose comme:
Le code ci-dessus repose sur le fait que DBNull.ToString renvoie une chaîne vide.
Si accountNumber était un autre type (par exemple, un entier), vous auriez besoin d'être plus explicite:
Si vous savez avec certitude que votre jeu de résultats aura toujours au moins une ligne (par exemple, SELECT COUNT (*) ...), vous pouvez ignorer la vérification de null.
Dans votre cas, le message d'erreur «Impossible de convertir un objet de type« System.DBNull »en type« System.String »» indique que la première colonne de votre jeu de résultats est une valeur DBNUll. C'est de la distribution à la chaîne sur la première ligne:
Le commentaire de Marc_s selon lequel vous n'avez pas besoin de vérifier DBNull.Value est faux.
la source
Vous pouvez utiliser l'opérateur de fusion nul de C #
la source
Il existe un autre moyen de contourner ce problème. Que diriez-vous de modifier la procédure de votre boutique? en utilisant la fonction SQL ISNULL (votre champ, ""), vous pouvez renvoyer une chaîne vide si la valeur de retour est nulle.
Ensuite, vous avez votre code propre en version originale.
la source
C'est la méthode générique que j'utilise pour convertir tout objet qui pourrait être un DBNull.Value:
usage:
plus court:
la source
Je suppose que vous pouvez le faire comme ceci:
Si accountNumber est nul, cela signifie qu'il était DBNull et non une chaîne :)
la source
return (accountNumber as string) ?? string.Empty;
, avec accountNumber étant toujours unobject
. Si vous préférez garder votre appel de base de données sur sa propre ligne.String.Concat transforme les valeurs DBNull et null en une chaîne vide.
Cependant, je pense que vous perdez quelque chose sur la compréhensibilité du code
la source
return "" + accountNumber;
?Depuis que j'ai une instance qui n'est pas nulle et si je la compare à DBNULL, j'ai
Operator '==' cannot be applied to operands of type 'string' and 'system.dbnull'
exception, et si j'essayais de changer pour comparer à NULL, cela ne fonctionnait tout simplement pas (puisque DBNull est un objet) même c'est la réponse acceptée.J'ai décidé d'utiliser simplement le mot-clé «est». Le résultat est donc très lisible:
data = (item is DBNull) ? String.Empty : item
la source
J'utilise une extension pour éliminer ce problème pour moi, qui peut ou non être ce que vous recherchez.
Ça va comme ça:
Remarque:
Cette extension ne renvoie pas de
null
valeurs! Si l'élément estnull
ou DBNull.Value , il renverra une chaîne vide.Usage:
la source
Convertissez-le comme
la source