ASP.NET DataReader的介紹



一、DataReader含義


DataReader相比於DataSet,DataReader是一個抽象類,所以不能用DataReader DR = new DataReader(),來構造函數創建對象,如果要創建一個DataReader對象,必須通過command對象的ExecuteReader方法。

DataReader對象訪問數據的方式,只能順序讀取數據,而且不能寫入數據(這點DataSet佔據絕對的優勢),所謂的順序讀取數據是將數據表中的行從頭至尾一次讀出。DataReader被創建時,紀錄指針在表的最前端,可以使用Read方法每次從表中讀取一條紀錄。

DataSet存的是二維數組,而DataReader存的是一維數組。而且DataSet採用的是非連接的傳輸模式訪問數據源,一旦用戶所請求的數據讀入DataSet,與數據庫的連接就關閉,而DataReader則要時刻保持與數據庫連接狀態。

 


二、重要屬性


FieldCount: 只讀,表示紀錄中有多少字段
HasMoreResults: 表示是否有多個結果,本屬性和SQL Script 搭配使用。
HasMoreRows: 只讀,表示是否還有資料未讀取
IsClosed: 只讀,表示DataReader 是否關閉
Item: 只讀,本對象是集合對象,以鍵值(Key)或索引值(Index)的方式取得紀錄中某個字段的數據
RowFetchCount: 用來設定一次取回多少筆記錄,預設值爲1 筆

 


三、常用方法


Close():關閉DataReader對象

GetValue(col):獲取序號爲col的列的值


GetValues(values)

獲取所有字段的值,並將字段值存放到values數組中。

GetValues(values)方法原來我不會用,特別是對於這個values數組是哪裏來的,以及如果自定義該定義爲什麼類型呢,後來百度就知道了,用這個方法之前,Object[] values = new Object[sqlrd.FieldCount];這個是定義values數組的方法前提。


Read()

讀取下一條紀錄,返回布爾型,返回true,則表示有下一條紀錄。一般這個方法與while()循環一起用。是DataReader對象最重要的一個方法。


GetDataTypeName(col) :獲取序號爲col的列的來源數據類型名

GetFieldType(col) :獲取序號爲col的列的數據類型,一般顯示會是System.**

GetName(col): 獲取序號爲col的列的字段名

GetOrdinal(name) :獲取字段名爲name的列的序號


四、DataReader實例


using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb; 

class SqlReader
{
 const string connStr = "data source=table;user id=sa;password=dddd;initial catalog=contract";
 SqlConnection conn; 


 public SqlReader()
 {
  conn = new SqlConnection(connStr);
 }
 
 //**************************************
 //*演示DataReader的兩種取值方法
 //**************************************
 public void basicReader()
 {
  string sql="select * from friend";
  SqlCommand cmd; 
  cmd = conn.CreateCommand();
  cmd.CommandText = sql;
  conn.Open();
  SqlDataReader reader = cmd.ExecuteReader();
  while(reader.Read())
  {
   Console.WriteLine("No:{0}\\tName:{1}\\tPhoneNum:{2},\\tAddress:{3}",reader.GetInt32(0).ToString(),reader.GetString(1),reader[2].ToString(),reader["Faddress"].ToString());
  }
  showSplit();
  reader.Close();
  conn.Close();
 }
 
 //**************************************
 //*演示帶參數查詢的操作,使用SqlCilent
 //**************************************
 public void hasParamReader()
 {
  SqlCommand cmd; 
  cmd = conn.CreateCommand();
  string sql = "select Fname,Fphone,Faddress from friend where Fid > @Fid";
  cmd.CommandText = sql;
  SqlParameter param = new SqlParameter("@Fid",SqlDbType.Int,4);
  param.Value = 15;
  cmd.Parameters.Add(param);
  conn.Open();
  //當關閉reader的時候同時關閉數據庫連接
  SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  while(reader.Read())
  {
   Console.WriteLine("Name:{0}\\tPhoneNum:{1}\\tAddress:{2}",reader.GetString(0),reader.GetString(1),reader.GetString(2));
  }
  showSplit();
  //無需關閉conn,系統會自動調用這個方法來關閉conn的。
  reader.Close(); 
 }
 
 //**************************************
 //*演示存儲過程的輸出參數
 //**************************************
 public void outParamShow()
 {
  SqlCommand cmd; 
  cmd = conn.CreateCommand();
  cmd.CommandText = "GetInfo";
  cmd.CommandType = CommandType.StoredProcedure;
  SqlParameter param = cmd.Parameters.Add("@Fid",16);
  param = cmd.Parameters.Add("@Fname",SqlDbType.VarChar,8);
  param.Direction = ParameterDirection.Output;
  param = cmd.Parameters.Add("@Fphone",SqlDbType.VarChar,8);
  param.Direction = ParameterDirection.Output;
  conn.Open();
  cmd.ExecuteNonQuery();
  string Fname = cmd.Parameters["@Fname"].Value.ToString();
  string Fphone = cmd.Parameters["@Fphone"].Value.ToString();
  Console.WriteLine(Fname + "  " + Fphone);
  conn.Close();
  showSplit();
 }
 
 //**************************************
 //*演示讀取多個無關記錄集
 //************************************** 
 public void multiResult()
 {
  SqlCommand cmd; 
  cmd = conn.CreateCommand();
  string sqla = "select Fname from friend";
  string sqlb = "select Fphone from friend";
  cmd.CommandText = sqla + ";" + sqlb;
  conn.Open();
  SqlDataReader reader= cmd.ExecuteReader();
  int i = 1;
  do
  {
   Console.WriteLine("第" + i.ToString() + "個記錄集內容如下:\\n");
   while(reader.Read())
   {
    Console.WriteLine(reader[0].ToString() + "\\t");
   }
   i++;
  }while(reader.NextResult()); //NextResult()移動到下一個記錄集
  reader.Close();
  conn.Close();
  showSplit();
 }
 
 //**************************************
 //*使用DataReader獲得數據庫模式信息
 //************************************** 
 public void getSchema()
 {
  SqlCommand cmd; 
  cmd = conn.CreateCommand();
  string sql = "select Fid,Fname,Fphone from friend";
     cmd.CommandText = sql;
     conn.Open();
     SqlDataReader reader = cmd.ExecuteReader();
     DataTable SchemaTable = reader.GetSchemaTable();
     
     DataRowCollection SchemaColumns = SchemaTable.Rows;
     DataColumnCollection SchemaProps = SchemaTable.Columns;   
     foreach(DataRow SchemaColumn in SchemaColumns)
     {
      foreach(DataColumn SchemaColumnProp in SchemaProps)
      {
       Console.WriteLine(SchemaColumnProp.ColumnName + "=" + SchemaColumn[SchemaColumnProp.ColumnName].ToString());
      }
     }
     reader.Close();
     conn.Close();
     showSplit();
 }
 
 //**************************************
 //*從數據庫讀取二進制數據的代碼段
 //*該代碼段只是讀取二進制的片斷,不是
 //*整個程序,所以不能執行,你可以把它
 //*集成到你的WinForm項目裏面。
 //************************************** 
 public void getBinary()
 {
  /**//*
  System.IO.MemoryStream stream = new System.IO.MemoryStream();
  System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);   
  int BufferSize = 1024;
  byte[] Buffer = new Byte[BufferSize];
  long Offset = 0;
  long BytesRead = 0;
  do
  {
   BytesRead = reader.GetBytes(2,Offset,Buffer,0,BufferSize);
   writer.Writer(Buffer,0,(int)BytesRead);
   writer.Flush();
   Offset += BytesRead;
  }
  while(BytesRead == BufferSize);
  */
 }
 
 //添加輸出分隔
 private void showSplit()
 {
  Console.WriteLine("\\n********************************************************************\\n");
 }
 
 public static void Main(string [] args)
 {
  SqlReader sqlreader = new SqlReader();
  
  sqlreader.basicReader();
  
  sqlreader.hasParamReader();
  
  sqlreader.hasOledbParamReader();
  
  sqlreader.outParamShow();
  
  sqlreader.multiResult();
  
  sqlreader.getSchema();
 } 
} 



參考資料: DataReader用法  http://www.studyofnet.com/news/693.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章