DataReader

Datareader對象不能關使用new關鍵字建立。但可使用ExecuteReader()方法建立。html

 

DataReader是一行一行的讀取記錄的。當記錄中有數據時Read()返回TRUE,當到記錄集底部時返回FALSE。sql

 

重要屬性:數據庫

FieldCount:獲取當前行中的列數。安全

HasRows:獲取一個值,該值指示 SqlDataReader 是否包含一行或多行。服務器

 NextResul:當執行的是sql存儲程序,或是可返回多個結果集的批處理sql語句時,該方法將當前行指針移到下一個結果集ide

該操做將當前行指針從第一行的一個行集移到下一個行集)。性能

重要方法:優化

GetInt16(),GetString(),GetDataTime()使用這些方法能夠讀取行中某列的值,並以相應的.Net類型返回。ui

 

GetValue():能夠讀取行中某列的值,不過返回的是object類型的值。spa

GetName():返回行中某列的列名。

 

 

示例(轉載): 

來源:http://www.cnblogs.com/chengbo/articles/87671.html

當咱們鏈接到數據庫,進行了想要的查詢之後,就能夠在網頁上顯示它們。使用DataReader是一個比較節省服務器資源的選擇。DataReader提供了一種只讀的、只向前的數據訪問方法,所以在訪問比較複雜的數據,或者只是想顯示某些數據時,DataReader再適合不過了。 

DataReader是一個抽象類,所以不能直接實例化,要經過Command對象的ExecuteReader方法來創建。 

下面是個例子: 

private void Page_Load(object sender, System.EventArgs e) 
{ 
      SqlConnection Conn = new SqlConnection("server=.;database=northwind;uid=sa;pwd=chengbo;"); 
      SqlCommand Comm = new SqlCommand("SELECT EmployeeID, LastName, BirthDate FROM Employees", Conn); 
 
      try 
      { 
        Conn.Open(); 
        SqlDataReader reader = Comm.ExecuteReader(); 
        while(reader.Read()) 
        { 
          //此處使用序數索引器 
          Response.Write("<P>" + reader[0] + "&nbsp;" + reader[1] + "&nbsp;" + reader[2] + "</P>"); 
        } 
        reader.Close(); 
      } 
      catch(SqlException ex) 
      { 
        Response.Write(ex.Message); 
      } 
      finally 
      { 
        Conn.Close(); 
      } 
 
}

上面的代碼使用的是序數索引器,還可使用列名索引器: 

Response.Write("<P>" + reader["EmployeeID"] + "&nbsp;" + reader["LastName"] + "&nbsp;" + reader["BirthDate"] + "</P>");

此外,還可使用類型訪問方法:

Response.Write("<P>" + reader.GetSqlInt32(0).ToString() + "&nbsp;" + reader.GetSqlString(1).ToString() + "&nbsp;" + reader.GetSqlDateTime(2).ToString() + "</P>");

三種方法最終的結果都同樣,可是哪一種方法性能更好,速度更快呢?

答案是 

類型訪問 > 序數索引器 > 列名索引器 

序數索引是經過列的序數來訪問列值的,這種方法沒必要從行中查找列,而是直接跳到指定的列中進行訪問,於是比較省資源,速度較快。 

列名索引是經過列的名稱來訪問列值的,這種方法雖然速度通常,可是它使得代碼更易讀,於是更易維護,下降了成本。 

類型訪問和序數索引比較相像,它也包含序數,但它同時指定了數據類型,減小了額外的工做,於是使速度更快,類型更安全。 

這裏要提到的是,因爲咱們使用的是MSDE(SQL Server 2000),而.Net Framework提供了專門爲SQL Server 7.0及以上版本設計的優化類型方法,因此咱們使用了GetSqlInt3二、GetSqlString、GetSqlDateTime等優化方法,更爲通用的是GetInt3二、GetString、GetDateTime等。 

GetSqlInt3二、GetSqlString、GetSqlDateTime等方法返回的是SqlTypes對象,好比,GetSqlInt32方法返回的是System.Data.SqlTypes.SqlInt32類型而不是System.Int32對象,後者纔是GetInt32方法返回的對象,因此咱們在每一個方法後再調用了ToString方法進行轉換,這樣才能使用"+"鏈接,而後輸出。 

下面是System.Data.SqlTypes 命名空間爲 SQL Server 內的本機數據類型提供類。這些類提供了一種較之其餘數據類型更安全、更快捷的方法。在可能丟失精度的狀況下,在此命名空間中使用這些類有助於防止產生類型轉換錯誤。因爲其餘數據類型在幕後與 SqlTypes 進行相互轉換,因此在此命名空間內顯式建立和使用對象將會使代碼更快。

 

 

 

 

示例2:

來源:http://www.cnblogs.com/wiseman/archive/2004/11/26/69249.html

演示DataReader的各項操做
//***********************************************************
//*名稱:一個程序詳細研究DataReader,同時顯示Command用法
//*功能:演示DataReader的各項操做。
//***********************************************************
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;

class SqlReader
{
 const string connStr = "data source=bineon;user id=sa;password=87345587;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(); 
 }
 
 //**************************************
 //*演示帶參數查詢的操做,使用OleDb
 //**************************************
 public void hasOledbParamReader()
 {
  SqlCommand cmd; 
  cmd = conn.CreateCommand();
  string sql = "select Fname,Fphone,Faddress from friend where Fid > ?";
  string oledbConnStr = "Provider=sqloledb;" + connStr;
  OleDbConnection oleConn = new OleDbConnection(oledbConnStr);
  OleDbCommand oleCmd = new OleDbCommand(sql,oleConn);
  oleCmd.Parameters.Add("nothing",15);
  oleConn.Open();
  OleDbDataReader oleReader = oleCmd.ExecuteReader();
  while(oleReader.Read())
  {
   Console.WriteLine("Name:{0}\tPhoneNum:{1}\tAddress:{2}",oleReader.GetString(0),oleReader.GetString(1),oleReader.GetString(2));
  }
  showSplit();
  oleReader.Close();
  oleConn.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();
 } 
}
相關文章
相關標籤/搜索