2011-01-18 81 views
0

我已經做了一些研究,然後發佈這個問題,我意識到這樣的事實,當沒有數據返回時,ExecuteScalar會拋出一個System.NullReferenceException。這就是爲什麼我修改我的存儲過程到「返回1」,所以保證了返回值。不過,我仍然得到NULL引用異常。ExecuteScalar拋出NullReferenceException當調用一個存儲過程,返回1

於是,我就使用SqlCommand查詢有數據表:

 SqlCommand sqlCommand = new SqlCommand("SELECT * FROM ATableThatHasValues", conn) 

當我跑了執行標我是能夠拿起一個值,所以我知道我有權限查詢數據庫。我懷疑這是我錯過的一些特定的存儲過程權限設置?

我真的很感激任何意見/建議,因爲我一直堅持這一天了一天。 :(

我的代碼如下所示:

 using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
     { 
      sqlConnection.Open(); 
      using (SqlCommand sqlCommand = new SqlCommand("GetSomeValue", sqlConnection)) 
      { 
       sqlCommand.CommandType = CommandType.StoredProcedure; 
       //sqlCommand.Parameters.Add(new SqlParameter("@Id", this.ID)); 
       //sqlCommand.Parameters.Add(new SqlParameter("@State", 1 /* active */)); 

       byte retValue = (byte)sqlCommand.ExecuteScalar(); 
       return retValue; 
      } 
     } 

THANKS

+3

哪一行會引發懷疑?堆棧跟蹤在哪裏? – asawyer

+0

你確實理解了'ExecuteScalar'的目的,對吧?它返回第一行數據的第一列,其他所有內容都被忽略。是否有一個原因,你使用它與'SELECT *'一起使用? –

回答

2

隨機猜測

您使用RETURN所以沒有數據集讀取列1,第1行的! ExecuteScalar

使用SELECT或OUTPUT參數

編輯:其實,沒有那麼隨意

RETURN 1不是一個結果集:這是一個「特殊」的參數

sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue 
+0

謝謝!這工作。我的原始存儲過程實際上返回一個結果集,但出於調試目的,我改變了它認爲它會幫助我調試,但它實際上完全使我脫軌。我非常沮喪,錯過了原始存儲過程中的一個明顯的小錯字,它啓動了整個調試過程。 :(無論如何,再次感謝! – Bryan

3

我只是去闡述什麼@gbn說。當您執行SQL代碼時,您可以通過三種不同的方式返回信息,即OUTPUT參數,表格數據和/或單個RETURN值。像@gbn所說的,RETURN的值本質上是專門的OUTPUT參數。 ExecuteScalar只能看到來自表格數據的信息,即第一行的第一列。如果在撥打ExecuteScalar時未收到表格數據,則返回空值。如果你試圖用這個空值來做某件事,那麼顯然你會得到一個NRE。

+0

很好的解釋,謝謝 – gbn

相關問題