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

首頁 > 編程 > .NET > 正文

ado.net詳細研究(三) —— DataReader(二)

2024-07-10 13:03:40
字體:
來源:轉載
供稿:網友


datareader類

1. 創建datareader對象

前面提到過沒有構造函數創建datareader對象。通常我們使用command類的executerader方法來創建datareader對象:

sqlcommand cmd = new sqlcommand(commandtext,connectionobject)

sqldatareader dr = cmd.executereader();

datareader類最常見的用法就是檢索sql查詢或者存儲過程返回的記錄。它是連接的只向前和只讀的結果集,也就是使用它時,數據庫連接必須保持打開狀態,另外只能從前往后遍歷信息,不能中途停下修改數據。

注意:datareader使用底層的連接,連接是它專有的,這意味這datareader打開時不能使用對應連接進行去他操作,比如執行另外的命令等。使用完datareader后一定記得關閉閱讀器和連接。

2. 使用命令行為指定datareader的特征

前面我們使用cmd.executereader()實例化datareader對象,其實這個方法有重載版本,接受命令行參數,這些參數應該時commandbehavior枚舉:

sqldatarader dr = cmd.executereader(commandbehavior.closeconnection);

上面我們使用的是commandbehavior.closeconnection,作用是關閉datareader的時候自動關閉對應的connectionobject。這樣可以避免我們忘記關閉datareader對象以后關閉connection對象。別告訴我你不喜歡這個參數,你能保證你記得關閉連接。萬一你忘記了呢?又或者你使用你的partner開發的組件來進行開發呢?這個組件并不一定讓你有關閉連接的權限哦。另外commandbehavior.singlerow可以使結果集返回單個行,commandbehavior.singleresult返回結果為多個結果集的第一個結果集。當然commandbehavior枚舉還有其他值,請參見msdn。

3. 遍歷datareader中的記錄

當executereader方法分會datareader對象時,當前光標的位置時第一條記錄的前面。必須調用數據閱讀器的read方法把光標移動到第一條記錄,然后第一條記錄就是當前記錄。如果閱讀器包含的記錄不止一條,read方法返回一個bool值true。也就是說read方法的作用是在允許范圍內移動光標位置到下一記錄,有點類似rs.movenext,不是嗎?如果當前光標指示著最后一條記錄,此時調用read方法得到false。我們經常這樣做:

while(dr.reader())

{

//do something with the current record

}

注意,如果你對每一條記錄的操作可能花費比較長的時間,那么意味著閱讀器將長時間打開,那么數據庫連接也將維持長時間的打開狀態。此時使用非連接的dataset或許更好一些。

4. 訪問字段的值

有2種方法。第一種是item屬性,此屬性返回字段索引或者字段名字對應的字段的值。第二種是get方法,此方法返回有字段索引指定的字段的值。有點難以理解,不是嗎?不要緊,看例子就ok了。

item屬性

每個datareader類都定義一個item屬性。比如現在我們有一個datareader實例dr,對應的sql語句是select fid,fname from friend,則我們可以使用下面的方法取得返回的值:

object id = dr[“fid”];

object name = dr[“fname”];

或者:

object id = dr[0];

object name = dr[0];

注意索引總是從0開始的。另外也許您發現了我們使用的是object來定義對id和name,是的,item屬性返回的值是object型,但是您可以強制類型轉換。

int id = (int)dr[“fid”];

string name = (string)dr[“fname”];

記?。捍_保類型轉換的有效性是您自己的責任,否則您將得到異常。

get方法

起始我們在第一篇文章里面已經使用過改方法了。每個datareader都定義了一組get方法,比如getint32方法把返回的字段值作為.net clr 32位證書。同上面的例子一樣我們用如下方式訪問fid和fname的值:

int id = dr.getint32(0);

string name = dr.getstring(1);

注意雖然這些方法把數據從數據源類型轉化為.net數據類型,但是他們不執行其他的數據轉換,比如他們不會把16位整數轉換為32位的。所以您必須使用正確的get方法。另外get方法不能使用字段名來訪問字段,也就是說上面的沒有:

int id = dr.getint32(“fid”); //錯誤

string name = dr.getstring(“fname”); //錯誤

顯然上面這個缺點在某些場合是致命的,當你的字段很多的時候,或者說你過了一段時間以后再來看你這些代碼,你會覺得很難以理解!當然我們可以使用其他方法來盡量解決這個問題。一個可行的辦法是使用const:

const int fidindex = 0;

const int nameindex = 1;

int id = dr.getint32(fidindex);

string name = dr.getstring(nameindex);

這個辦法并不怎么好,另外一個好一些的辦法:

int nameindex = dr.getordinal(“fname”); //取得fname對應的索引值

string name = dr.getstring(nameindex);

這樣似乎有點麻煩,但是當須要遍歷閱讀器種大量的結果集的時候,這個方法很有效,因為索引只需執行一次。

int fidindex = dr.getordinal(“fid”);

int nameindex = dr.getordinal(“fname”);

while(dr.read())

{

int id = dr.getint32(fidindex);

string name = dr.getint32(nameindex);

}



到目前為止,我們已經討論了datareader的基本操作了。至于datareader的有些高級超作我們以后再討論。

下次我們構建一個項目——個人通訊錄(單用戶版本)。在這個項目中我們將用到前面討論的所有知識,同時在這個項目里面我將盡量是這個項目符合多層體系結構標準。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兰西县| 景宁| 沾益县| 建德市| 贵南县| 连州市| 浦东新区| 晋江市| 措美县| 乌鲁木齐县| 孝感市| 丰都县| 永春县| 祥云县| 中山市| 临汾市| 卓尼县| 皋兰县| 柘荣县| 张家界市| 宁阳县| 曲水县| 长春市| 沭阳县| 苍溪县| 通江县| 大渡口区| 溆浦县| 周宁县| 舒城县| 临潭县| 沅江市| 和平县| 凤山县| 新丰县| 常州市| 若尔盖县| 新晃| 大石桥市| 达孜县| 临泽县|