2009-02-18 50 views
4

此代码抛出一个NullReferenceException当它调用ExecuteScalar的ExecuteScalar引发的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(); 

回答

12

我已经封装了我的大部分SQL逻辑在DAL。其中一个DAL方法使用以下逻辑来提取标量Ints。它可能适用于你:

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

我知道你已经输入了很多代码,但我认为这真的是你的问题的本质。祝你好运!

+0

检查的DBNull是至关重要的,因为它会帮助你很多,如果你可以到nulluable类型。 +1 – 2010-10-18 22:27:42

6

ExecuteScalar如果查询没有返回任何记录,则返回null(例如,当您的SearchForPassenger存储过程不返回任何行时)。

所以这行:

item = (int) command.ExecuteScalar(); 

试图投nullint在这种情况下。这会产生NullReferenceException

按照刚刚poppped了Mark's answer,你需要检查null

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

谢谢, 为什么null? 我检查了在ssms中,它的工作, 请帮助 – LastBye 2009-02-18 02:53:29

相关问题