在vb2005中填充列表框从ado查询的速度远远低于vb6。我可以加快速度吗?

问题描述:

我将vb6中的一些代码转换为vb2005,打开一个记录集并使用大约8,000个名称填充列表框 。它使用经典的ado。在vb2005中填充列表框从ado查询的速度远远低于vb6。我可以加快速度吗?

vb6代码在0.75秒左右时间内完成,第一个vb2005代码在约5.5秒内完成约 秒,而第二个vb2005代码在约4.5秒内完成。 有什么方法可以提高vb2005的性能吗?

//vb6 code 

    Dim myconn As ADODB.Connection 
    Set myconn = New ADODB.Connection 
    myconn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=c:\TestDB1.mdb;Jet OLEDB:System Database=c:\TestDB1.mdw;User ID=TestDB;Password=123456;" 
    myconn.Open 

    Dim elap As Double 
    elap = Timer 

    List1.Visible = False 
    List1.Clear 
    Text1.Text = "" 
    Text1.Refresh 

    Dim myrec As New ADODB.Recordset 
    Dim str1 As String 
    str1 = "select * from Names" 

    myrec.Open str1, myconn 

    myrec.MoveFirst 

    Do While myrec.EOF <> True 
    List1.AddItem myrec.Fields("surname").Value & " " & myrec.Fields("firstname").Value 
    myrec.MoveNext 
    Loop 
    List1.Visible = True 
    Text1.Text = Timer - elap 
    // 
    // 
    //vb2005 code '1st attempt 

    Dim myconn As New ADODB.Connection 
    myconn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=c:\TestDB1.mdb;Jet OLEDB:System Database=c:\TestDB1.mdw;User ID=TestDB;Password=123456;" 
    myconn.Open() 
    Dim elap As Double = DateTime.Now.TimeOfDay.TotalSeconds 

    list1.Items.Clear() 
    Text1.Text = "" 
    Text1.Refresh() 

    Dim myrec As New ADODB.Recordset 
    Dim str1 As String = "select * from Names" 

    myrec.Open(str1, myconn) 

    myrec.MoveFirst() 
    list1.BeginUpdate() 
    Do While Not myrec.EOF 

     list1.Items.Add(myrec.Fields("surname").Value + " " + myrec.Fields("firstname").Value) 


     myrec.MoveNext() 
    Loop 
    list1.EndUpdate() 
    Text1.Text = CStr(DateTime.Now.TimeOfDay.TotalSeconds - elap) 


    // 
    // 
    // vb2005 code second attempt 


    Dim myconn As New ADODB.Connection 
    myconn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=c:\TestDB1.mdb;Jet OLEDB:System Database=c:\TestDB1.mdw;User ID=TestDB;Password=123456;" 
    myconn.Open() 
    Dim elap As Double = DateTime.Now.TimeOfDay.TotalSeconds 

    list1.Items.Clear() 
    Text1.Text = "" 
    Text1.Refresh() 

    Dim myrec As New ADODB.Recordset 
    Dim str1 As String = "select * from Names" 

    myrec.Open(str1, myconn) 


    Dim counter As Integer = 0 



    myrec.MoveFirst() 
    Dim MyList As New List(Of String) 
    Dim MyRow As String 
    Do While Not myrec.EOF 
     MyList.Add(myrec.Fields("surname").Value + " " + myrec.Fields("firstname").Value) 
     myrec.MoveNext() 
    Loop 
    list1.BeginUpdate() 
    list1.Items.AddRange(MyList.ToArray) 
    list1.EndUpdate() 

    Text1.Text = CStr(DateTime.Now.TimeOfDay.TotalSeconds - elap) 
+0

看起来像列表框可见性使世界上的所有差异。尝试将其隐藏在VB.Net示例中。 – wqw 2009-08-03 09:15:53

+0

感谢您的阅读。对我来说也是这样,但它在vb2005中似乎没有什么区别,或者至少没有明显的区别 – kjack 2009-08-03 09:18:58

原来基于COM的ADO组件不支持在.NET中使用ADO.NET组件。

顺便说一句,您的用户是否发现在列表框中有8000个项目可供选择,特别有用且易于使用?

我不知道在VB与ADO的性能,但我有一个类似的问题在德尔福2010年80 000字符串值的查询结果花费年龄读入字符串列表(注意:绝对没有视觉组件连接)

像CacheSize等设置没有任何区别(我保留它们的情况下)。最后,即使它看起来没有道理,但我尝试使用ADODataSet1.DisableControls和ADODataSet1.EnableControls来包装while循环。这就像一个魅力。

ADODataSet1.DisableControls; 
while not ADODataset1.Eof do 
begin 
    codes.Add(adodataset1Code.Value); 
    ADODataset1.Next; 
end; 
ADODataSet1.EnableControls;