2009-02-18 4 views
4

Ce code lance une NullReferenceException quand il appelle ExecuteScalar:ExecuteScalar lance NullReferenceException

selectedPassengerID = 0; 

//SqlCommand command = GenericDataAccess.CreateCommand(); 


// 2nd test 
string connectionString = ""; 
SqlConnection conn; 

connectionString = ConfigurationManager. 
    ConnectionStrings["ConnST-MHM"].ConnectionString; 
conn = new SqlConnection(connectionString); 
SqlCommand command = new SqlCommand(); 
command.CommandType = CommandType.StoredProcedure ; 
command.Connection = conn; 
command.CommandText = "SearchForPassenger"; 

SqlParameter param; 

param = command.CreateParameter(); 
param.ParameterName = "@name"; 
param.Value = pName; // Session[""]; 
param.DbType = DbType.String; 
command.Parameters.Add(param); 

param = command.CreateParameter(); 
param.ParameterName = "@flightDate"; 
param.Value = date; 
param.DbType = DbType.String; 
command.Parameters.Add(param); 

param = command.CreateParameter(); 
param.ParameterName = "@ticketNo"; 
param.Value = ticketNumber; 
param.DbType = DbType.Int32; 
command.Parameters.Add(param); 

int item; 

command.Connection.Open(); 
item = (int)command.ExecuteScalar(); 

Répondre

12

J'encapsulé la plupart de ma logique SQL dans un DAL. Une de ces méthodes DAL tire Ints scalaires en utilisant la logique suivante. Il peut travailler pour vous:

object temp = cmnd.ExecuteScalar(); 
    if ((temp == null) || (temp == DBNull.Value)) return -1; 
    return (int)temp; 

Je sais que vous avez entré beaucoup de code ci-dessus mais je pense que cela est vraiment l'essence de votre problème. Bonne chance!

+0

vérification de DBNull est essentiel car il vous aidera beaucoup si vous pouvez nulluable types. +1 –

6

ExecuteScalar renvoie null si aucun enregistrement n'a été renvoyé par la requête (par exemple, lorsque votre procédure stockée SearchForPassenger ne renvoie aucune ligne).

donc cette ligne:

item = (int) command.ExecuteScalar(); 

tente de jeter null à un int dans ce cas. Cela soulèvera un NullReferenceException.

Comme par Mark's answer qui vient poppped, vous devez vérifier null:

object o = command.ExecuteScalar(); 
item = o == null ? 0 : (int)o; 
+0

merci, Pourquoi null? J'ai vérifié que dans ssms et cela a fonctionné, aide s'il vous plaît – LastBye

+0

Qu'est-ce que votre proc stocké retourne, compte tenu des mêmes paramètres que votre programme l'appelle? –

Questions connexes