国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 17:03:23
字體:
來源:轉載
供稿:網友

今天一個查詢需要通過 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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 名山县| 崇信县| 吕梁市| 高雄市| 卢氏县| 都江堰市| 福清市| 永胜县| 博乐市| 西畴县| 肥西县| 枣强县| 隆化县| 无棣县| 平邑县| 武宣县| 墨江| 高碑店市| 修武县| 衡阳县| 抚远县| 当涂县| 赫章县| 永年县| 恩平市| 柞水县| 宜阳县| 西畴县| 扬中市| 皮山县| 冀州市| 乐亭县| 陵水| 河津市| 吉木乃县| 凉山| 浙江省| 乌恰县| 微山县| 郴州市| 红安县|