这是查询代码,一共有4000行数据,但是查询时间需要20多秒。问一下如何优化这段代码,能在几秒内查出?string query = "select ADsPath,sAMAccountName,displayName,miji from 'LDAP://" + Utils.GetCurrentDomain().Name + (!String.IsNullOrEmpty(this.tab1BoxOu.Text) ? ("/" + this.tab1BoxOu.Text) : "") + "' where objectCategory='user'";
            
            IDataReader dr = Utils.ExecuteAdQuery(query);
            try
            {
               
                while (dr.Read())
                {                    ListViewItem lvi = new ListViewItem(new string[] { 
                    dr["sAMAccountName"].ToString(),
                    dr["displayName"].ToString(),
                    dr["miji"].ToString(),
                    dr["ADsPath"].ToString()
                });
                   
                    listView1.Items.Add(lvi);                }
            }

解决方案 »

  1.   

    建议你使用DataSet,从数据库中读取的数据放入DataSet中,这样读得很快的
      

  2.   

    List<ListViewItem> lvis = new .....;
    while (dr.Read())
      {  ListViewItem lvi = new ListViewItem(new string[] {  
      dr["sAMAccountName"].ToString(),
      dr["displayName"].ToString(),
      dr["miji"].ToString(),
      dr["ADsPath"].ToString()
      });
        
      lvis.Add(lvi);
      }
      ListView1.AddRange(lvi.ToArray());
      

  3.   

    应该不是数据库查询耗时!耗时还是那段赋值过程.改进办法;
    1、改为DataGridView,用数据库直接绑定。
    2、分页显示,比如每页显示100行记录
      

  4.   

    如果不是查询慢的问题,看看listview的visualmode:
    虚拟模式在许多情况下都很有用。 如果必须从已存在于内存中的非常大的集合填充一个 ListView 对象,则为每项创建一个 ListViewItem 对象会很浪费。 在虚拟模式下,从缓冲之中获取所需的数据进行加载,性能会有很大提高。 在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,对整个集合进行此操作将产生不可接受的性能。 如下为虚拟模式的一个应用示例(仿VS2010错误列表),截图如下: 二、虚拟模式相关注意点1、设置一个缓存属性,来保存需要加载的数据:        protected List<ListViewItem> CurrentCacheItemsSource  
            {
                get;
                private set;
            } 2、通过虚拟模式来加载数据,如下:           private void LoadListViewItems(List<ListViewItem> items)
            {
                listView.Items.Clear();   
                if (items == null)
                {
                    stripStatusInfo.Text = "当前总共记录数为:0";  
                    return;
                }
                  
                listView.GridLines = true;
                listView.FullRowSelect = true;
                listView.View = View.Details;
                listView.Scrollable = true;
                listView.MultiSelect = false;
                listView.HeaderStyle = ColumnHeaderStyle.Clickable;
                listView.Visible = true;
                
                listView.VirtualListSize = items.Count;
                listView.VirtualMode = true;
                listView.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);            stripStatusInfo.Text = "当前总共记录数为:" + items.Count;          
            }
     listView.VirtualMode = true;//设置虚拟模式listView.VirtualListSize = items.Count;//设置虚拟列表容量大小
    listView.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);//绑定虚拟操作  3、在RetrieveVirtualItem方法中加载相关的数据:       void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
            {
                if (this.CurrentCacheItemsSource == null || this.CurrentCacheItemsSource.Count == 0)
                {
                    return;
                }            e.Item = this.CurrentCacheItemsSource[e.ItemIndex];
                if (e.ItemIndex == this.CurrentCacheItemsSource.Count)
                {
                    this.CurrentCacheItemsSource = null ;
                }
            }
     需要注意及时释放掉所需要的缓存数据,如下:if (e.ItemIndex == this.CurrentCacheItemsSource.Count)
    {
        this.CurrentCacheItemsSource = null ;
    }当e.ItemIndex 的值与缓存中的集合大小相等时,设置缓存为NULL(对象根引用设置为NULL,内存中的对象不再有根引用,所需的内存将由GC第二次回收时释放,相关内容请查看CLR GC)。 三、总结当数据为几万条记录时,加载ListView速度非常快,不会造成任何影响,页面显示正常。目前,测试30W条简单的记录,性能还是可以接受的。当然,对于大数据量而言(50W条记录以上),分页才是最佳方式。其次,需要注意的是,对缓存数据需要及时清空,避免不必要的性能损失。 
      

  5.   

    大量数据是有点慢,如果上千条查看的时候也会卡,考虑用Datagridview。
      

  6.   

    建议用listview显示大量数据的人换成datagriview吧,listview没有点击标头排序的功能,得自己手写,但这段排序的代码很耗资源,拖带的listview显示数据就很慢。