遍歷資料閱讀器中的記錄
當ExecuteReader方法返回DataReader物件時,當前游標的位置在第一條記錄的前面。
必須呼叫閱讀器的Read方法把游標移動到第一條記錄,然後,第一條記錄將變成當前記錄。
如果資料閱讀器所包含的記錄不止一條,Read方法就返回一個Boolean值true。
想要移到下一條記錄,需要再次呼叫Read方法。重複上述過程,直到最後一條記錄,那時Read方法將返回false。
經常使用while迴圈來遍歷記錄:
while(reader.Read())
{
//讀取資料
}
只要Read方法返回的值為true,就可以訪問當前記錄中包含的欄位。
訪問欄位中的值
ADO.NET提供了兩種方法訪問記錄中的欄位。
第一種是Item屬性,此屬性返回由欄位索引或欄位名指定的欄位值。
第二種方法是Get方法,此方法返回由欄位索引指定欄位的值。
DataReader類有一個索引符,可以使用常見的陣列語法訪問任何欄位。
使用這種方法,既可以通過指定資料列的名稱,也可以通過指定資料列的編號來訪問特定列的值。
第一列的編號是0,第二列編號是1,依次類推。例如:
Object value1=myDataReader["學號"];
Object value1=myDataReader[0];
Item屬性
每一個DataReader類都定義了一個Item屬性,此屬性返回一個程式碼欄位屬性的物件。
Item屬性是DataReader類的索引。
需要注意的是Item屬性總是基於0開始編號的:
object FieldValue=reader[FieldName];
object FieldValue=reader[FieldIndexl;
可以把包含欄位名的字串傳入Item屬性,也可以把指定欄位索引的32位整數傳遞給Item屬性。
例如,如果命令是SQL select查詢:
Select ID, cName from course
使用下面任意一種方法,都可以得到兩個被返回欄位的值:
object ID=reader ["ID"]
object cName=reader ["cName"];
或者:
object ID=reader[0];
object cName=reader [1];
另外需要注意的是,在使用資料時需要自己負責型別轉換,如下所示:
int ID=(int)reader[0];
String cName=(string)reader[1];
注意:如果型別轉換錯誤,例如將非數字型別轉化為整型,將會在執行時丟擲異常。
Get方法
除了通過索引訪問資料外,DataReader類還有一組型別安全的訪問方法可以用於讀取指定列的值。
這些方法是以Get開頭的,並且它們的名稱具有自我解釋性。
例如GetInt32()、GetString()等。
這些方法都帶有一個整數型引數,用於指定要讀取列的編號。
每一個DataReader類都定義了一組Get方法,那些方法將返回適當型別的值。
例如,GetInt32方法把返回的欄位值作為32位整數。
每一個Get方法都接受欄位的索引,
例如在上面的例子中,使用以下的程式碼可以檢索ID欄位和cName欄位的值:
int ID=reader. Getint32 (0);
string cName=reader. GetString(1);
例項演示DataReader
在這個例子中,將讀取所有的學生資訊並將其顯示出來。
(1)啟動Visual Studio,新建一個名為DataReaderTest的WindowsApplication專案。
(2)在Forml.cs的空白處雙擊滑鼠,進入Page—Load事件。Page_Load事件在頁面載入時執行。
(3)首先在Forml.cs中新增SqlClient的名稱空間:
using System. Data. SqlClient;
(4)在Page_Load事件中新增如下程式碼:
using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace DataReaderTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //定義輸出訊息 string message=""; //新建連線物件 SqlConnection conn=new SqlConnection(); conn.ConnectionString="Data Source=(local);Initial Catalog=Student;Integrated Security=SSPI"; //拼接命令字串 string selectQuery="select ID, sName,sGrade,sSex from studentInfo"; //新建命令物件 SqlCommand cmd=new SqlCommand(selectQuery, conn); conn.Open( ); //關閉閱讀器時將自動關閉資料庫連線 SqlDataReader reader=cmd. ExecuteReader(CommandBehavior.CloseConnection); //迴圈讀取資訊 while (reader.Read()) { message+="學號:"+reader[0].ToString()+" "; message+="姓名:"+reader["sName"].ToString()+" "; message+="班級:"+reader.GetString(2)+ " "; message+="性別:"+reader.GetString(3)+" "; message+="\n"; } //關閉資料閱讀器 //無需關閉連線,它將自動被關閉 reader.Close(); //測試資料連線是否已經關閉 if(conn.State==ConnectionState.Closed) { message+="資料連線已經關閉\n"; } MessageBox.Show(message); } } }