1

いくつかのコードを vb6 から vb2005 に変換して、レコードセットを開き、リスト ボックスに約 8,000 の名前を入力しました。古典的なアドを使用しています。

vb6 コードは約 0.75 秒で実行され、最初の vb2005 コードは約 5.5 秒で実行され、2 番目の 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)
4

2 に答える 2

2

元のCOMベースのADOコンポーネントは、.NET内での使用はサポートされていません。代わりに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 に答える