——此文章摘自《C#高级编程(第
版)》定价
元 特价
元 购买
假定CategoryID字段是SELECT语句中用于生成阅读器的第一个字段那么这两行语句的功能就是相同的但后者比前者慢一些为了验证这一点编写一个简单的测试程序从打开的数据读取器上对同一列进行一百万次的迭代访问获取一些足够大的数字虽然在一个循环中可能并不会对同一列访问一百万次但按每秒来计算就可能编写出最佳的代码
另外数字索引器平均每秒就进行一百万次的访问而文本索引器则需要秒原因是文本方法是从模式的内部查找列号再使用列号的顺序进行访问如果知道这个区别就可以更好地访问数据
是否应使用数字索引器?也许但还有一种更好的方式
除了上面给出的索引器外OleDbDataReader还有一组类型安全的方法可以用于读取列这些方法都可以进行自我解释且都以Get开头有一些方法可以读取大多数类型的数据例如GetInt GetFloat和GetGuid等
前面使用GetInt的一百万次迭代用了秒数字索引器中的系统开销是获取数据类型调用与GetInt相同的代码然后装箱(本实例是拆箱)为一个整数如果以前知道这种模式并希望使用加密数字而不是列名以避免对每个列访问使用类型安全的函数这样运行速度就会比使用文本格式的列名快倍(选择同一列的上百万个副本)
在可维护性和速度之间有一个折中的问题如果必须使用数字索引器就应在类的范围内为每一个要访问的列定义常量上面的代码可以用于从任何OLE DB数据库中选择数据但有许多SQL Server的特定类可以使用但其便利性有明显的损失
下面的示例与上一示例基本相同但在这个实例中用SQL提供程序和SQL类的引用替换了OLE DB提供程序和对OLE DB类的所有引用代码的变化已经突出显示出来了该示例在_DataReaderSql目录下
using System;
using SystemDataSqlClient;
public class DataReaderSql
{
public static int Main(string[] args)
{
string source =server=(local)\\NetSDK; +
integrated security=SSPI; +
database=northwind;
string select = SELECT ContactNameCompanyName FROM Customers;
SqlConnection conn = new SqlConnection(source);
connOpen();
SqlCommand cmd = new SqlCommand(select conn);
SqlDataReader aReader = cmdExecuteReader();
while(aReaderRead())
ConsoleWriteLine({} from {} aReaderGetString()
aReaderGetString());
aReaderClose();
connClose();
return ;
}
}
注意区别是什么?如果键入这些代码用sql替换所有的OleDb改变数据源字符串重新编译这是很容易的
对Sql提供程序的索引器进行相同的性能测试这次数字索引器也使用秒就完成了百万次的访问基于索引器的字符串运行了秒本机的Sql提供程序要比OleDb快直到我在NET版本中测试这一部分情况都是这样可以肯定这是不正常的因为我使用的是最简单的测试(对同一个值选择 次)在托管SQL提供程序上进行真实的测试会得到更好的性能
[] []