• DataReader


    Datareader对象不能关使用new关键字创建。但可以使用ExecuteReader()方法创建。

    DataReader是一行一行的读取记录的。当记录中有数据时Read()返回TRUE,当到记录集底部时返回FALSE。

    重要属性:

    FieldCount:获取当前行中的列数。

    HasRows:获取一个值,该值指示 SqlDataReader 是否包含一行或多行。

     NextResul:当执行的是sql存储程序,或是可返回多个结果集的批处理sql语句时,该方法将当前行指针移到下一个结果集

    该操作将当前行指针从第一行的一个行集移到下一个行集)。

    重要方法:

    GetInt16(),GetString(),GetDataTime()使用这些方法可以读取行中某列的值,并以相应的.Net类型返回。

    GetValue():可以读取行中某列的值,不过返回的是object类型的值。

    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及以上版本设计的优化类型方法,所以我们使用了GetSqlInt32、GetSqlString、GetSqlDateTime等优化方法,更为通用的是GetInt32、GetString、GetDateTime等。 

    GetSqlInt32、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}	Name:{1}	PhoneNum:{2},	Address:{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}	PhoneNum:{1}	Address:{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}	PhoneNum:{1}	Address:{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() + "个记录集内容如下:
    ");
       while(reader.Read())
       {
        Console.WriteLine(reader[0].ToString() + "	");
       }
       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("
    ********************************************************************
    ");
     }
     
     public static void Main(string [] args)
     {
      SqlReader sqlreader = new SqlReader();
      
      sqlreader.basicReader();
      
      sqlreader.hasParamReader();
      
      sqlreader.hasOledbParamReader();
      
      sqlreader.outParamShow();
      
      sqlreader.multiResult();
      
      sqlreader.getSchema();
     } 
    }
  • 相关阅读:
    Access, SQL Server, and Oracle数据类型的对应关系
    [转]SQL Server 2005 从差异备份还原数据库
    疲惫
    关于在cmd命令里的路径包含空格的问题
    导Excel时的科学计数法问题
    [转]SQL SERVER 2005 备份与恢复简介
    [转]用C#创建Windows Service
    [转] vb.net option
    [转]sql server profiler only TrueType fonts are supported. this is not a truetype font
    进程、线程、协程之概念理解[转帖]
  • 原文地址:https://www.cnblogs.com/mane/p/4582426.html
Copyright © 2020-2023  润新知