今天一個查詢需要通過 excutereader 返回結(jié)果集,同時又想輸出參數(shù),剛開始的時候一直得不到輸出參數(shù)的值,以為存儲過程出錯,但是在查詢分析器里面測試是正確的,而且輸出參數(shù)確實已經(jīng)賦值。
更加讓人百思不得其解的是,對出輸出強制類型轉(zhuǎn)換丟出異常之后,確又可以得到了,難道是ado.net 的bug,想象頁不可能啊,這么常用的api,不可能出這種錯吧,我的代碼類似一下場景:
try {
using (sqldatareader dr = cmd.executereader(commandbehavior.closeconnection)) {
int val = (int)cmd.parameters[1].value; // 現(xiàn)在還是空值
// more
}
}
catch(exception exp) {
throw new applicationexception("輸出參數(shù)值:" + cmd.parameters[1].value, exp); // 現(xiàn)在可以得到輸出值了
}
真是郁悶慘,足足調(diào)試跟蹤一個小時
終于還是在msdn中找到了答案:
當(dāng)您將 command 對象用于存儲過程時,可以將 command 對象的 commandtype 屬性設(shè)置為 storedprocedure。當(dāng) commandtype 為 storedprocedure 時,可以使用 command 的 parameters 屬性來訪問輸入及輸出參數(shù)和返回值。無論調(diào)用哪一個 execute 方法,都可以訪問 parameters 屬性。但是,當(dāng)調(diào)用 executereader 時,在 datareader 關(guān)閉之前,將無法訪問返回值和輸出參數(shù)。
ref:http://msdn2.microsoft.com/zh-cn/library/tyy0sz6b.aspx
原來如此啊,覺得又被ms忽悠了,想來,誰叫自己學(xué)藝不經(jīng)啊,而且早改查文檔
回到自己的代碼環(huán)境,還是可以解釋的。
因為當(dāng)catch到expception 的時候已經(jīng)跳出 using 范圍了,datareader已經(jīng)自動被關(guān)閉了,自然可以得到 輸出參數(shù)的值。
當(dāng)然,如果把try catch 放到 using中還是得不到的,因為還在 using范圍內(nèi),datareader并沒有被關(guān)閉。
另外,msdn中說只有關(guān)閉datareader才可以訪問,其實不然。
經(jīng)過測試,可以總結(jié)如下:
1。對于executereader而言,output parm 和 returnvalue 作為一個結(jié)果集返回datareader,并且改結(jié)果集總是在最后一個。
2。根據(jù)1,當(dāng)有結(jié)果集時,要訪問輸出參數(shù)和返回值,需要調(diào)用 nextresult 到輸出參數(shù)和返回值對應(yīng)的結(jié)果集位置
3。根據(jù)1 ,當(dāng)execute沒有返回結(jié)果集時,就可以直接訪問(注意,無需調(diào)用read())
4。特別注意的對于返回多個結(jié)果集的,需要調(diào)用多次nextresult;如果結(jié)果集個數(shù)又是動態(tài)的,那么當(dāng)nextresult()的返回值為 false就是了。
5。即使對executereader指定了選項commandbehavior.singleresult(返回單個結(jié)果集,其實是返回批處理的第一個結(jié)果集),輸出參數(shù)也作為一個結(jié)果集返回。
6。關(guān)閉datareader(close()),會填充輸出參數(shù),因此可以訪問。
7。由于datareader是只讀向前的,因此,即使是通過在關(guān)閉datareader之前通過nextresult方問到了輸出參數(shù),之前的結(jié)果集都無法在訪問了(某些情況,可能想通過輸出參數(shù)來動態(tài)控制結(jié)果集的訪問)。
8。為解決6中的問題,可以將不使用輸出參數(shù),直接將輸出參數(shù)作為第一個結(jié)果返回(select @parmname)
以上只是,自己的總結(jié),希望沒有出入,對初學(xué)者也許有幫助。
ref:
http://www.bigcircleboy.net/583a194f-2c2c-4662-9036-4e2f0eb262396084313157728108.html
新聞熱點
疑難解答
圖片精選