簡體   English   中英

即使在command.executeReader()期間發生SQL異常,如何從查詢中獲取結果?

[英]How can I grab results from a query even if an SQL exception occurs during command.executeReader()?

我有這段代碼有時有效,有時無效。 正在執行的查詢不是我自己編寫的,但是我被告知,我要做的就是對數據庫運行該查詢以獲得所需的結果。 這是我的代碼:

try {
  using (SqlDataReader dr = cmd.ExecuteReader()) {
    while (dr.Read()) {
      try {
        list.Add(dr.GetString(3) + " " + dr.GetInt32(4).ToString() + " " + dr.GetString(5) + " " + dr.GetDecimal(8).ToString());
      } catch (Exception e) {
        list.Add("fail");
      }
    }
  }
} catch (SqlException sqlException) {
  Debug.WriteLine(sqlException.Message);
}

有時會收到錯誤消息,因為我沒有權限或該表不存在,所以無法刪除該表。 其他時候查詢執行沒有任何問題,我能夠檢索結果並將其存儲在列表中。

當我在SQL Server 2008中運行查詢時,有時確實會出現錯誤,但是結果仍然顯示出來,並且是我所期望的。 所以我的問題是:無論感覺何時出現錯誤,如何都能獲得這些結果?

這是引起我麻煩的一小部分查詢:

IF  EXISTS (SELECT * from tempdb..sysobjects where name like '#TABLE%')  
DROP #TABLE

我正在運行的查詢中有許多此類if語句,並且無法預測哪個將導致錯誤。 所以我現在所做的就是將DROP #TABLE包圍在try-catch塊中,以便至少我仍然可以在Silverlight程序中檢索結果。 我會站起來,問他為什么查詢會自發返回這些錯誤。

編輯

沒關系,我看到了問題。 我忘記了臨時表名稱后面會附加其他字符,以防止不同進程之間的命名沖突(例如#TABLE___...___0000000064E2 )。

我的猜測是,在某些情況下,存儲的proc將創建一個名為“ #TABLE”的臨時表,並且您發布的SQL代碼的一部分是用來執行清理的。 單獨運行時,這可能工作正常。

當存儲的proc由多個客戶端同時運行時,或者如果先前的查詢之一以某種方式無法執行清除(可能是由於途中的錯誤),問題可能開始出現。 在這種情況下,會創建一個誤報(存儲的proc認為有必要進行清理,但實際上看到的是由另一個進程創建的temp表)。 然后,您會收到錯誤消息,因為當前進程沒有關聯的#TABLE。

無論如何,將語句包裝在try-catch中似乎是一種不錯的方法。 更好的方法是對代碼進行徹底檢查,也許設置某種標志以幫助指示需要進行清理,或者使用公用表和某種事務鍵(刪除與當前事務關聯的所有記錄,而不是刪除)桌子)。

您可能還需要考慮使用表變量而不是臨時表。

看到:
http://social.msdn.microsoft.com/Forums/zh-CN/sqltools/thread/02337dd5-5cfd-40d8-b529-12dc557d6a7e/

或者,您也可以考慮完全跳過DROP語句:
臨時表范圍?


要回答您的原始問題,無論如何,我都不知道從SQL查詢引發異常后就無法通過.NET程序集檢索結果的任何方法。 SQL Server Management Studio使用一些重型的,定制的API,這可能不值得您學習和使用。


忽略以下內容
(供參考)

如果可以,請嘗試將SQL查詢更改為

IF  EXISTS (SELECT * from tempdb..sysobjects where name = '#TABLE')
DROP #TABLE

= '#TABLE' like '#TABLE%'更改為= '#TABLE' like '#TABLE%' = '#TABLE'

like聲明沒有任何意義......如果有開頭 “#TABLE”其他表沒關系......你只是想知道是否有一個名為正是 “#TABLE”表。

我的猜測是,這是邏輯發生改變的情況之一,但是只是中途改變了,也許是兩個不同的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM