A.测试结论„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
非官方,俺自己总结的(以下序号越大,性能越低) 1. DataReader.GetXXX(<<ColumnIndex>>)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
2. DataReader.GetXXX(Dictionary<string, int>[<<ColumnName>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
[Dictionary<string, int>.Add(<<ColumnName>>, DataReader.GetOrdinal(<<ColumnName>>))] „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
3. DataReader.GetXXX((Int32)Hashtable[<<ColumnName>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
[Hashtable.Add(<<ColumnName>>, DataReader.GetOrdinal(<<ColumnName>>))]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
4. (<<Type>>)DataReader[<<ColumnIndex>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
5. DataReader.GetXXX(DataReader.GetOrdinal(<<ColumnName>>))„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
6. Convert.ToXXX(DataReader[<<ColumnIndex>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
7. (<<Type>>)DataReader[<<ColumnName>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
8. Convert.ToXXX(DataReader[<<ColumnName>>]
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
说明:„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
1.  按 Index(SELECT 子句中列索引) 读取比按 Name(列名)读取快„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
2.  DataReader.GetXXX(<<ColumnIndex>>)  遥遥领先,基于两点:„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        a. 此方法内部直接访问对应的数据库类型,不存在 box/unbox 。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        b. 基于索引访问。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
3.  (<<Type>>)DataReader[<<ColumnIndex>>] 比 Convert.ToXXX(DataReader[<<ColumnIndex>>]) 快„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        a. 前者属于编程语言特有的强制类型转换,对于值类型,存在 unbox 过程。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        b. 后者使用的是.NET FCL提供的一组与语言无关的类型转换方法。静态类 Convert 中的类型转换方法,调用源类型实现的 IConvertible 接口进行目标类型的转换。也就是说,只有实现了 IConvertible 接口接口的类型才能用 Convert.ToXXX  进行类型转换。如, Convert.ToInt32(object)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
public static int ToInt32(object value)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
if (value != null)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
return ((IConvertible) value).ToInt32(null);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
return 0;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
}
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
4. 由于使用 Index 方式访问,容易出错,可维护性差,一种折中方式,是先根据 Name 读取 Index,然后调用 GetXXX 方法。如,„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
int id = DataReader.GetInt32(DataReader.GetOrdinal("ID"));„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
5. 当循环读取所有行时,直接使用方式 4 ,每此都要读取列名(DataReader.GetOrdinal 内部也是一个 Lookup 的过程),因此需要改进。考虑首次读取后将 Name 缓存起来,以后直接读缓存,由于需要 index/name 成对关联,考虑性能,Hashtable 是不二选择,NET 2.0 还提供了泛型版本 System.Collections.Generic.Dictionary<TK,TV> 。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
对于非泛型的 Hashtable 只有一个 key 存在 box/unbox,两者性能差别,并不十分明显。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
但相对于,各种按 Name 访问方式,有明显的性能优势。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
6. 以上各组读取方式比较,随着数据量的增加,性能差异越来越明显,少量数据读取无法看出明显差别。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
7. 对于借助于自动化工具、代码生成工具开发应用程序,应该优先考虑 GetXXX 的方式读取。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
8. xxxDataAdapter.Fill 方法内部使用对应 Data Provider 的 xxxDataReader  填充 DataTable。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
B.测试实例„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
说明„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
1. 此测试,直接使用 ASP.NET(似乎不影响对比性),抱歉了,偶就会 WebForm,比较理想的当然整个 Console Applilcation 让她跑„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
2. 懒于准备样表数据,直接使用 SQL Server 2k. Northwind.Products 表,且只读取 ProductID 字段(INT 型),并由应用程序多次重复读取同一数据,模拟大数据量的效果„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
3. 测试结果为,用 SqlDataReader 分别读取„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
5,000 „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
50,000 „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
500,000 „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
5,000,000 „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
50,000,000„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
条记录(模拟)所花的总时间,单位为秒,„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
这里显示了连续 5 次的测试结果。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
测试代码„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<%@ Page Language="C#"%>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<%@ Import Namespace="System.Collections.Generic"%>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<%@ Import Namespace="System.Data"%>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<%@ Import Namespace="System.Data.SqlClient"%>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<%@ Import Namespace="System.IO"%>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<script runat="server">„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    protected
void Button1_Click(object sender, EventArgs e)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
int i = 5;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
while (i-- > 0{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            ExecuteTest();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            System.Threading.Thread.Sleep(
1000 * 10);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    private
void ExecuteTest()„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        const
int COLUMN_INDEX_PRODUCT_ID = 0;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        const string COLUMN_NAME_PRODUCT_ID
= "ProductID";„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        StringBuilder sb
= new StringBuilder();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
int loops = 100;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
for (int k = 0; k < 5; k++, loops *= 10) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            sb.AppendFormat(
"{0, 10:N0}\t", loops * 50);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 1. DataReader.GetXXX(<<ColumnIndex>>)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= dr.GetInt32(COLUMN_INDEX_PRODUCT_ID);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 2. (<<Type>>)DataReader[<<ColumnIndex>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= (int)dr[COLUMN_INDEX_PRODUCT_ID];„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 3. Convert.ToXXX(DataReader[<<ColumnIndex>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= Convert.ToInt32(dr[0]);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 4. (<<Type>>)DataReader[<<ColumnName>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= (int)dr[COLUMN_NAME_PRODUCT_ID];„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 5. Convert.ToXXX(DataReader[<<ColumnName>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= Convert.ToInt32(dr[COLUMN_NAME_PRODUCT_ID]);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 6. DataReader.GetXXX(DataReader.GetOrdinal(<<ColumnName>>))„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= dr.GetInt32(dr.GetOrdinal(COLUMN_NAME_PRODUCT_ID));„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 7. DataReader.GetXXX((Int32)Hashtable[<<ColumnName>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
//    Hashtable.Add(<<ColumnName>>, DataReader.GetOrdinal(<<ColumnName>>))„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                Hashtable columns
= new Hashtable();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int j = 0;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                       
if (j++ == 0) columns.Add(COLUMN_NAME_PRODUCT_ID, dr.GetOrdinal("ProductID"));„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= dr.GetInt32((int)columns[COLUMN_NAME_PRODUCT_ID]);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 8. DataReader.GetXXX(Dictionary<string, int>[<<ColumnName>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
//    Dictionary<string, int>.Add(<<ColumnName>>, DataReader.GetOrdinal(<<ColumnName>>))„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            using (SqlDataReader dr = GetDataReader()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int productId, i;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime start
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                Dictionary
<string, int> columns = new Dictionary<string, int>();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
int j = 0;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
               
while (dr.Read()) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    i
= loops;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                   
while (i-- > 0) {„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                       
if (j++ == 0) columns.Add(COLUMN_NAME_PRODUCT_ID, dr.GetOrdinal("ProductID"));„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                        productId
= dr.GetInt32(columns[COLUMN_NAME_PRODUCT_ID]);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                DateTime end
= DateTime.Now;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                TimeSpan span
= end - start;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
                sb.Append(span.TotalSeconds.ToString(
"f7")).Append("\t");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            sb.AppendLine();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        sb.AppendLine();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        string path
= Server.MapPath("result.txt");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        File.AppendAllText(path, sb.ToString());„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    private SqlDataReader GetDataReader()„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        string connStr
= "server=.;database=Northwind;uid=sa;";„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        SqlConnection conn
= new SqlConnection(connStr);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        SqlCommand cmd
= conn.CreateCommand();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        cmd.CommandText
= "SELECT TOP 50 ProductID FROM Products";„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        conn.Open();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
return cmd.ExecuteReader(CommandBehavior.CloseConnection);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
</script>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<html xmlns="http://www.w3.org/1999/xhtml"„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<head runat="server">„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
<title>Performance Testing when retrieving data with DataReader </title>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
</head>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
<body>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
<form id="form1" runat="server">„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
<div>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Run Test"„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
/>        „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
</div>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
</form>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
</body>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
</html>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
C.测试结果„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
读取方式,从左往右依次是:„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
1. DataReader.GetXXX(<<ColumnIndex>>)          „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
2. (<<Type>>)DataReader[<<ColumnIndex>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
3. Convert.ToXXX(DataReader[<<ColumnIndex>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
4. (<<Type>>)DataReader[<<ColumnName>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
5. Convert.ToXXX(DataReader[<<ColumnName>>]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
6. DataReader.GetXXX(DataReader.GetOrdinal(<<ColumnName>>))„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
7. DataReader.GetXXX((Int32)Hashtable[<<ColumnName>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
 
[Hashtable.Add(<<ColumnName>>, DataReader.GetOrdinal(<<ColumnName>>))]„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
8. DataReader.GetXXX(Dictionary<string, int>[<<ColumnName>>])„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
 
[Dictionary<string, int>.Add(<<ColumnName>>, DataReader.GetOrdinal(<<ColumnName>>))]
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
D.测试环境„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
AMD Athlon XP 1800+ 512M -> 好古董的 PC 啊 „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
.NET 2.0 + Windows XP SP2„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½