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

來源:互聯網
上載者:User
ado 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的有些進階超作我們以後再討論。

下次我們構建一個項目——個人通訊錄(單使用者版本)。在這個項目中我們將用到前面討論的所有知識,同時在這個項目裡面我將盡量是這個項目符合多層體繫結構標準。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。