DataReader 程序性能优化

  随着 .NET 平台上,LINQ、ORM 框架、Dynamic Data、... 各种数据访问技术不断推陈出新,程序员也一直追着新技术跑,但对底层和代码细节却越来越难以掌控。当项目性能需要调优时,通常也只能对数据库加入更多索引,而多数人已难以对数据访问的代码优化,且手写 SQL 语句的功力似乎也持续退化中。

  大家在拼命追求新技术时,似乎已忘记微软的 MCTS 证照,还有一门 ADO.NET 的科目 。且若有练好 ADO.NET 的基本功,当项目遇到特殊需求时,也才能手写得出来。例如下图 1 的「阶层式下拉菜单 (Hierarchical DropDownList)」,功能很简单,在实务上也常遇到,但单纯靠 DataSource 控件难以实现,必须手写 DataReader 来自定义细节。

  本帖的示例下载点:
  http://files.cnblogs.com/WizardWu/100216.zip

  (执行第一個示例,需要 VS 2008 或 IIS,以及 SQL Server 的 Northwind 数据库)
  (执行第二個示例,需要 VS 2008 或 .NET 3.5,以及 SQL Server 的 AdventureWorks 数据库)
  (执行第二個示例,需要 VS 2008 或 .NET 3.5,以及 SQL Server 的 AdventureWorks 数据库)

   一、DataReader 的变化应用、用 Get 开头的方法提升 DataReader 的性能 


图 1 以 DataReader 实现的 Hierarchical DropDownList

  上图 1 为本帖下载的第一个示例。在此 ASP.NET 示例中,我们不用 DataTable 以免速度较慢又浪费内存 (此却为 DataSource 控件的默认选择),改用一个 DataReader 对象,去两个表中,各执行一句 SQL SELECT 语句,最后将两个 result set 加载、合并到同一个 DropDownList 中。我在以前写的 C# 代码生成器 ,也用过类似的小技巧。

  此示例若您将前台的 DropDownList 控件,换成微软去年九月新推出的 ComboBox 这个可选也可输入的 AJAX 下拉菜单控件 ,此示例的 Code-behind 一行代码都不用改,直接就可套用至 ComboBox 上。

示例一的 Code-behind 代码using (SqlConnection conn = new SqlConnection(strConnString))
{
    conn.Open();
    
using (SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection 
= conn;

        
//利用分号「;」串连多句 SQL 语句,之后再一次丢进数据库去执行,达成「批次(Batch)」读取或更新数据库的目的。
        
//此技巧亦适用于 INSERT、UPDATE、DELETE 的「批次」执行。       
        cmd.CommandText = "SELECT TOP 5 CompanyName, CustomerID FROM Customers ; SELECT LastName, EmployeeID FROM Employees";

        
using (SqlDataReader dr = cmd.ExecuteReader())
        {
            DropDownList1.Items.Add(
"客户列表");
            
int i = 1;    //目前的数据行

            
while (dr.Read())
            {
                
//.NET typed accessor
                DropDownList1.Items.Add("  " + dr.GetString(0));    //数据库跑循环取回的字段1 (Name),当作选项的 Text
                
//.NET typed accessor
                DropDownList1.Items[i].Value = dr.GetString(1);          //数据库跑循环取回的字段2 (ID),当作选项的 Value

                i
++;
            }

            dr.NextResult();       
//到下一個 ResultSet

            DropDownList1.Items.Add(
"员工列表");
            i
++;

            
while (dr.Read())
            {
                
//.NET typed accessor
                DropDownList1.Items.Add("  " + dr.GetString(0));    //数据库跑循环取回的字段1 (Name) ,当作选项的 Text
                
//Index-based accessor
                DropDownList1.Items[i].Value = dr[1].ToString();         //数据库跑循环取回的字段2 (ID),当作选项的 Value

                
//亦可用 GetSql 开斗的方法 (Provider-specific typed accessor)
                
//DropDownList1.Items[i].Value = dr.GetSqlInt32(1).ToString();   //数据库跑循环取回的字段2 (ID),当作选项的 Value

                i
++;
            }
        }
    }
}

NET技术DataReader 程序性能优化,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。