2011-07-08 28 views
2

我有一個很大的存儲過程,我運行。最後,它應該選擇一個單一的值來說明它的成功與否,所以我運行查詢爲ExecuteScalar和SqlDataAdapter.Fill對於相同的查詢行爲不同

Dim Command As New SqlCommand(SqlString, Conn) 
Return Command.ExecuteScalar() 

哪個工作。但是,我的存儲過程中有一個錯誤。我知道它會導致錯誤,因爲存儲過程中的邏輯會回滾事務,並且在調用Execute Scalar之後,我的事務計數降至0,並且我的數據沒有更改。但是沒有生成SQL異常。

奇怪的部分是,我更改了代碼以獲取SP中的所有結果集,以查看是否可以獲取更多信息。於是我打電話給同一個SP這樣的,

Dim DAObj As SqlDataAdapter = New SqlDataAdapter 
    Dim CommandObj As SqlCommand = New SqlCommand(SQLString, Conn) 
    DAObj.SelectCommand = CommandObj 
    Dim DS As New DataSet() 
    DAObj.Fill(DS) 

當我像以前一樣運行此,具有完全相同的SQL,執行完全相同的存儲過程,這一次我得到,因爲我嵌套SP調用一個SQL異常缺少必需的參數。

那麼可能會導致這種情況?爲什麼會以一種方式運行它會產生錯誤,另一種方式會產生錯誤,但不會報告它?目標上的差異,還是ADO.Net中某種模糊的錯誤?

+0

可能的重複[爲什麼SqlCommand.ExecuteNonQuery拋出的SqlException包含所有PRINTs爲錯誤?](http://stackoverflow.com/questions/2178164/why-does-a-sqlexception-thrown-by-sqlcommand -executenonquery-contain-all-the-prin) – gbn

+0

@gbn,它的問題絕對不是同一個問題,但它可能的兩個問題都有相關的原因。 – Kratz

+0

同樣的原因,是的,錯誤和內部處理。 – gbn

回答

3

DataAdaptor使用從客戶端返回的所有數據集。數據集也是一個例外。

ExecuteScalar僅消耗第1行,第1列,第1數據集。

  • 不要使用的ExecuteScalar
  • 保持消費的DataReader,直到你不再回來
  • 使用DataAdaptor.Fill(數據集)。它會跳過例外填充數據表太
+0

有趣,現在有更多的意義。所以我的存儲過程在出現錯誤之前創建了一個結果,所以即使錯誤發生,它也會被忽略。 – Kratz

+0

@Kratz:確實如此。我們針對ExecuteScalar(更改爲outpit參數),ExecuteReader(更改爲消耗,直至不再有DataReaders)和DataAdaptor/DataTable(更改爲使用DataSet)發生同樣的錯誤。它很差,真的... – gbn

1

.ExecuteScalar()返回第一個返回值,是從你的存儲過程中的值,或存儲過程中產生的錯誤代碼。 fill命令期望返回數據,並且sql中的錯誤會引發異常。

相關問題