J'essaie d'exécuter une procédure stockée, puis d'utiliser une instruction if pour vérifier les valeurs nulles. Je suis un type VB, alors veuillez supporter si je commets une erreur de syntaxe d'écolier.
objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
rsData = objCmd.ExecuteReader();
rsData.Read();
if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value)))
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
Cela me permettrait-il de vérifier si la connexion SQL ne renvoie qu'une valeur et, le cas échéant, de renseigner ma chaîne?
Je suis habitué à pouvoir vérifier ci-dessous si une valeur est renvoyée et je ne suis pas sûr de le faire correctement avec C #
Si pas IsDBNull (rsData ("usr.ursrdaystime"))
Toute aide serait appréciée!
Cela devrait marcher.
if (rsData["usr.ursrdaystime"] != System.DBNull.Value))
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
il faut aussi ajouter une déclaration using, comme ci-dessous:
using (var objConn = new SqlConnection(strConnection))
{
objConn.Open();
using (var objCmd = new SqlCommand(strSQL, objConn))
{
using (var rsData = objCmd.ExecuteReader())
{
while (rsData.Read())
{
if (rsData["usr.ursrdaystime"] != System.DBNull.Value)
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
}
}
}
}
cela va automatiquement disposer (fermer) les ressources en dehors du bloc {..}.
La manière idiomatique est de dire:
if(rsData["usr.ursrdaystime"] != DBNull.Value) {
strLevel = rsData["usr.ursrdaystime"].ToString();
}
Ce:
rsData = objCmd.ExecuteReader();
rsData.Read();
Cela donne l'impression que vous lisez exactement une valeur. Utilisez IDbCommand.ExecuteScalar
à la place.
L'équivalent le plus proche de votre VB serait ( see this ):
Convert.IsDBNull()
Mais il y a plusieurs façons de le faire, et la plupart sont liées à partir d'ici
Oui, juste un problème de syntaxe. Essayez ceci à la place:
if (reader["usr.ursrdaystime"] != DBNull.Value)
.Equals()
vérifie si deux instances d'objet sont identiques .
Considérer:
if(rsData.Read()) {
int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime"
if(rsData.IsDBNull(index)) {
// is a null
} else {
// access the value via any of the rsData.Get*(index) methods
}
} else {
// no row returned
}
Aussi: vous avez besoin de plus de using
; p
J'utilise souvent String.IsNullorEmpty. Cela fonctionnera parce que lorsque DBNull est défini sur .ToString, il renvoie vide.
if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){
strLevel = rsData["usr.ursrdaystime"].toString();
}
if(!rsData.IsDBNull(rsData.GetOrdinal("usr.ursrdaystime")))
{
strLevel = rsData.GetString("usr.ursrdaystime");
}
http://msdn.Microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx
http://msdn.Microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx
L'opérateur ternaire devrait bien faire ici: condition? first_expression: second_expression;
strLevel =! Convert.IsDBNull (rsData ["usr.ursrdaystime"])? Convert.ToString (rsData ["usr.ursrdaystime"]): null