Valeur de retour à l'aide de la Chaîne de résultat=Commande.ExecuteScalar() erreur se produit lorsque le résultat renvoie la valeur null
Je veux extraire la 1ère ligne 1ère valeur de la cellule de base de données, il fonctionne bien avec le code ci-dessous . Mais quand il n'y a pas de résultat, il lève une Exception.
Comment gérer DBNull
.
Dois-je changer ma requête ? de retour de la valeur si leur pas de record ?
Système.NullReferenceException: la référence d'Objet n'est pas définie à une instance d'un objet.
Code:
public string absentDayNo(DateTime sdate, DateTime edate, string idemp)
{
string result="0";
string myQuery="select COUNT(idemp_atd) absentDayNo from td_atd where ";
myQuery +=" absentdate_atd between '"+sdate+"' and '"+edate+" ";
myQuery +=" and idemp_atd='"+idemp+"' group by idemp_atd ";
SqlCommand cmd = new SqlCommand(myQuery, conn);
conn.Open();
//System.NullReferenceException occurs when their is no data/result
string getValue = cmd.ExecuteScalar().ToString();
if (getValue != null)
{
result = getValue.ToString();
}
conn.Close();
return result;
}
- Où il jette exception ??
- Exception jette
string getValue = cmd.ExecuteScalar().ToString();
moyenne erreur se produit lors de leur est le résultat - btw, c'est un vraiment mauvaise façon de construire une requête; claire et flagrante de l'injection sql trou, il y a aussi une internationalisation problème, et certains inutiles intermédiaire des chaînes de caractères. J'espère que ce n'est pas comment vous faites sql normalement...
- Sry pour mon mauvais pratiquant habbit , et oui la prochaine fois je prends soin de
sqlInjection
, par l'utilisation de paramétrer des requêtes - comme pour mon édité réponse: vous pouvez réellement résoudre les deux problèmes d'un seul coup... juste pour dire...
Vous devez vous connecter pour publier un commentaire.
Il n'est pas nécessaire de continuer à l'appeler
.ToString()
commegetValue
est déjà une chaîne de caractères.Part ça, cette ligne pourrait éventuellement être votre problème:
Si il n'y a pas de lignes
.ExecuteScalar
sera de retournull
de sorte que vous besoin de faire quelques vérifications.Par exemple:
Convert.ToString(cmd.ExecuteScalar());
- cela vous permettra deString.Empty
si la valeur estnull
.Si la première cellule retournée est un
null
, le résultat .NET seraDBNull.Value
Si pas de cellules sont retournés, le résultat .NET sera
null
; vous ne pouvez pas appelerToString()
sur unnull
. Bien sûr, vous pouvez capturer ceExecuteScalar
les retours et les processus de lanull
/DBNull
/d'autres cas séparément.Puisque vous êtes regroupement etc, vous avez sans doute pourrait avoir plus d'un groupe. Franchement, je ne suis pas sûr
ExecuteScalar
est votre meilleure option ici...Supplémentaire: le sql dans la question qui est mauvais dans de nombreuses façons:
Je vous suggère fortement de paramétrer; peut-être avec quelque chose comme "dapper" pour le rendre facile:
tous les problèmes ont été résolus, y compris les "lignes" du scénario. Les dates sont transmises sous forme de dates (pas de chaînes de caractères); l'injection de l'orifice est fermé par l'utilisation d'un paramètre. Vous obtenez des plans de requête ré-utiliser comme un bonus supplémentaire, trop. Le
group by
ici est redondant, BTW - si il n'y a qu'un seul groupe (via la condition d'égalité), vous pourriez tout aussi bien sélectionnerCOUNT(1)
.dapper
, apprendre de nouvelles aujourd'huiEssayer celui-ci
Vous pouvez utiliser comme suit
Valeur n'est pas nulle, mais DBNull.Valeur.
essayez ceci :
Cela devrait fonctionner:
Aussi, je suggère l'utilisation de Paramètres dans votre requête, quelque chose comme (juste une suggestion):
Utiliser SQL server fonction isnull
Il y a une avance fonctionnalité de c#, de l'utilisation qu' '?.' .
string getValue = cmd.ExecuteScalar()?.ToString(); thants tous.
De travailler avec NpgsqlCommand ou de la norme sqlCommand utilisation:
Essayer celui-ci, si la valeur est null 0, ou quelque chose