Заполнение списка из запроса ado намного медленнее в vb2005, чем в vb6. Могу ли я ускорить это? - PullRequest
1 голос
/ 03 августа 2009

Я преобразовал некоторый код из vb6 в vb2005, который открывает набор записей и заполняет список с около 8000 имен. Используется классический ado.

Код 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)

Ответы [ 2 ]

2 голосов
/ 03 августа 2009

Исходные компоненты ADO на основе COM не поддерживаются для использования в .NET, вместо них используются компоненты ADO.NET.

Кстати, считают ли ваши пользователи наличие 8000 элементов на выбор в поле списка особенно полезным и простым в использовании?

1 голос
/ 25 ноября 2010

Я не знаю о производительности в VB с ADO, но у меня была похожая проблема в 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;
...