使用DataReader高效地访问数据库

当我们连接到数据库,进行了想要的查询以后,就可以在网页上显示它们。使用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 进行相互转换,所以在此命名空间内显式创建和使用对象将会使代码更快。
  下表将 System.Data.SqlTypes 命名空间的成员映射到 Microsoft SQL Server 数据类型及 SqlDbType 枚举的成员。
  
  本机 SQL Server  .NET Framework SqlTypes  .NET Framework SqlDbType


    binary        SqlBinary             Binary
    Bigint        SqlInt64             BigInt
    Char        SqlString             Char
    datetime      SqlDateTime           DateTime
    decimal      SqlDecimal            Decimal
    Float        SqlDouble             Float
    image        SqlBinary             Image
    Int          SqlInt32             Int
    Money        SqlMoney           Money
    nchar        SqlString            NChar
    Ntext        SqlString             NText
    nvarchar      SqlString           NVarChar
    Numeric        SqlDecimal         Numeric
    Real          SqlSingle           Real
    smalldatetime    SqlDateTime         SmallDateTime
    smallint        SqlInt16           SmallInt
    smallmoney      SqlMoney         SmallMoney
    sql_variant      Object           Variant
    sysname        SqlString           VarChar
    text          SqlString             Text
    timestamp      SqlBinary         TimeStamp
    tinyint        SqlByte           TinyInt
    varbinary        SqlBinary         VarBinary
    varchar        SqlString         VarChar
    uniqueidentifier      SqlGuid         UniqueId

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值