使用DataReader高效地访问数据库

当我们连接到数据库,进行了想要的查询以后,就可以在网页上显示它们。使用DataReader是一个比较节省服务器资源的选择。DataReader提供了一种只读的、只向前的数据访问方法,因此在访问比较复杂的数据,或者只是想显示某些数据时,DataReader再适合不过了。

DataReader是一个抽象类,因此不能直接实例化,要通过Command对象的ExecuteReader方法来建立。

下面是个例子:

None.gif private   void  Page_Load( object  sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      SqlConnection Conn 
= new SqlConnection("server=.;database=northwind;uid=sa;pwd=chengbo;");
InBlock.gif      SqlCommand Comm 
= new SqlCommand("SELECT EmployeeID, LastName, BirthDate FROM Employees", Conn);
InBlock.gif
InBlock.gif      
try
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        Conn.Open();
InBlock.gif        SqlDataReader reader 
= Comm.ExecuteReader();
InBlock.gif        
while(reader.Read())
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif          
//此处使用序数索引器
InBlock.gif
          Response.Write("<P>" + reader[0+ "&nbsp;" + reader[1+ "&nbsp;" + reader[2+ "</P>");
ExpandedSubBlockEnd.gif        }

InBlock.gif        reader.Close();
ExpandedSubBlockEnd.gif      }

InBlock.gif      
catch(SqlException ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        Response.Write(ex.Message);
ExpandedSubBlockEnd.gif      }

InBlock.gif      
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        Conn.Close();
ExpandedSubBlockEnd.gif      }

InBlock.gif
ExpandedBlockEnd.gif}

上面的代码使用的是序数索引器,还可以使用列名索引器:

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

此外,还可以使用类型访问方法:

None.gif 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 进行相互转换,所以在此命名空间内显式创建和使用对象将会使代码更快。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值