作者m339606 (mize)
看板C_Sharp
標題Re: [問題] Datareader的限制問題
時間Sun Jun 1 23:42:40 2014
※ 引述《wind681201 (阿風~~)》之銘言:
: 在msdn上面有說,在connection裡,只能存在一個datareader,
: 這一句話,我一直是看不懂,我的疑問是。
: 一、一個connection裡只能存在一個Datareader?
: 二、只要是連線相同的資料庫,只能有一個datareader?
: 三、關閉datareader就好,還是連sqlcommand也要一起關了,才可以用呢?
: 狀況一:
: 在a.aspx網頁裡有一個connection連b資料庫,在這裡只能有一個datareader?
: 那在b.aspx網頁中有一個connection連b資料庫,就無法使用datareader?
: 也就是說,整個網站,多人使用一個datareader?
: 狀況二:
: A class裡,有conneciotn連資料庫b,若我
: dim a1 as new a : dim b1 as new a
: 那是個存在一個datareader嗎?還是說a1 b1都有自己的datareader可用呢?
: 狀況三:
: 同樣的連線中,跑槽狀迴圈,就不能用datareader因為只能有一個,可能
: 外層的datareader沒關,就不能用在內層?
: 研究很久了,還是不清楚
一個Reader被建立出來後在尚未關閉或消滅之前connection都是保持著open
所以同樣的connection實體再去做其他Command會丟出Exception
狀況二不明白你說的意思
狀況三
Reader是順向而且不可逆的資料讀取
你需要在後面大量程式碼使用到的資料請讀入DataTable
--------------------------------------------------
在想狀況的時候實際把狀況寫出程式碼來自己Run應該可以減少許多類似問題
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.223.37.85
※ 文章網址: http://www.ptt.cc/bbs/C_Sharp/M.1401637364.A.F22.html
※ 編輯: m339606 (61.223.37.85), 06/01/2014 23:43:30
推 wind681201:第二是說,同樣的物件裡都有dr,那分別用二個去new 06/02 14:11
→ wind681201:也算在同一個conn裡嗎? 06/02 14:11
推 Ammenze:你在class有new connection的話,new的時候就是新的 06/02 18:02
→ Ammenze:Dr也就不會是同ㄧ個 06/02 18:03
這問題圍繞在"實體"的認知上
一個Reader實體依存在一個Conn的實體上
你可以同時new兩個Conn實體來取得兩個Reader實體
但你沒辦法用一個Conn實體來取得兩個Reader實體
物件要區分出兩個狀況
1.靜態物件
2.非靜態物件
靜態物件在程式初始化時就已經建立了,那靜態物件裡面的靜態Conn實體就只存在一個
只存在一個所以受限於基礎的限制
非靜態物件你在new出來時才會建立出一個實體物件,你每次new都是不同的實體物件
裡面的Conn則理所當然的屬於不同的物件實體
※ 編輯: m339606 (61.223.164.237), 06/02/2014 18:19:00
推 wind681201:所以若是靜態的話,整個系統只能存在一個Dr 06/02 18:31
→ wind681201:而動態的話,就是本身物件一個dr,是分開的 06/02 18:31
根據你的陳述沒辦法說是對的
我上面的陳述一直在強調"實體"
我可以在一個Class中宣告N個Conn實體取得N個Reader
但是根據你的陳述比較類似於,我整個程式運作只能存在一個Reader
或是
一個物件只能存在一個Reader
※ 編輯: m339606 (61.223.164.237), 06/02/2014 20:39:58
推 wind681201:所以應該是說,一個conn一個dr,是看有幾個conn? 06/02 21:41
→ m339606:1個conn配一個Reader沒錯 06/03 20:59