C#與資料庫訪問技術總結(十二)資料閱讀器(DataReader)2

[0]發表於2014-11-03

遍歷資料閱讀器中的記錄

當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);
        }
    }
}

 

相關文章