程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 在 ExcuteReader 中使用輸出參數的問題

在 ExcuteReader 中使用輸出參數的問題

編輯:.NET實例教程

今天一個查詢需要通過 ExcuteReader  返回結果集,同時又想輸出參數,剛開始的時候一直得不到輸出參數的值,以為存儲過程出錯,但是在查詢分析器裡面測試是正確的,而且輸出參數確實已經賦值。
更加讓人百思不得其解的是,對出輸出強制類型轉換丟出異常之後,確又可以得到了,難道是ado.Net 的bug,想象頁不可能啊,這麼常用的API,不可能出這種錯吧,我的代碼類似一下場景:

 try {
            using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) {
                int val = (int)cmd.Parameters[1].Value; // 現在還是空值
                // more 
            }
        }
        catch(Exception exp) {
            throw new ApplicationException("輸出參數值:" + cmd.Parameters[1].Value, exp); // 現在可以得到輸出值了
        }

真是郁悶慘,足足調試跟蹤一個小時

終於還是在MSDN中找到了答案:
當您將 Command 對象用於存儲過程時,可以將 Command 對象的 CommandType 屬性設置為 StoredProcedure。當 CommandType 為 StoredProcedure 時,可以使用 Command 的 Parameters 屬性來訪問輸入及輸出參數和返回值。無論調用哪一個 Execute 方法,都可以訪問 Parameters 屬性。但是,當調用 ExecuteReader 時,在 DataReader 關閉之前,將無法訪問返回值和輸出參數。


ref:http://msdn2.microsoft.com/zh-CN/library/tyy0sz6b.ASPx

原來如此啊,覺得又被MS忽悠了,想來,誰叫自己學藝不經啊,而且早改查文檔

回到自己的代碼環境,還是可以解釋的。
因為當catch到Expception 的時候已經跳出 using 范圍了,DataReader已經自動被關閉了,自然可以得到 輸出參數的值。
當然,如果把try catch 放到 using中還是得不到的,因為還在 using范圍內,DataReader並沒有被關閉。

另外,MSDN中說只有關閉DataReader才可以訪問,其實不然。
經過測試,可以總結如下:
1。對於ExecuteReader而言,Output parm 和 returnvalue 作為一個結果集返回DataReader,並且改結果集總是在最後一個。
2。根據1,當有結果集時,要訪問輸出參數和返回值,需要調用 NextResult 到輸出參數和返回值對應的結果集位置
3。根據1 ,當Execute沒有返回結果集時,就可以直接訪問(注意,無需調用Read())
4。特別注意的對於返回多個結果集的,需要調用多次NextResult;如果結果集個數又是動態的,那麼當nextResult()的返回值為 false就是了。
5。即使對ExecuteReader指定了選項CommandBehavior.SingleResult(返回單個結果集,其實是返回批處理的第一個結果集),輸出參數也作為一個結果集返回。
6。關閉DataReader(Close()),會填充輸出參數,因此可以訪問。
7。由於DataReader是只讀向前的,因此,即使是通過在關閉DataReader之前通過NextResult方問到了輸出參數,之前的結果集都無法在訪問了(某些情況,可能想通過輸出參數來動態控制結果集的訪問)。
8。為解決6中的問題,可以將不使用輸出參數,直接將輸出參數作為第一個結果返回(SELECT @parmname)

以上只是,自己的總結,希望沒有出入,對初學者也許有幫助。

ref:
http://www.bigcircleboy.Net/583a194f-2c2c-4662-9036-4e2f0eb262396084313157728108.Html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved