1

I converted some code from vb6 to vb2005 that opens a recordset and populates a listbox with about 8,000 names. It uses classic ado.

The vb6 code does it in about 0.75 of a second, the first vb2005 code does it in about 5.5 seconds while the second vb2005 code does it in about 4.5 seconds. Is there any way to improve the vb2005 performance a fair bit more?

    //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)
4

2 回答 2

2

不支持在 .NET 中使用原始的基于 COM 的 ADO 组件,而是使用 ADO.NET 组件。

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

于 2009-08-03T12:10:02.187 回答
1

我不知道带有 ADO 的 VB 中的性能,但我在 Delphi2010 中遇到了类似的问题,其中 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;
于 2010-11-25T12:39:59.533 回答