2009-02-18 45 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

相關問題