質問

以下のコードを実行して、VBAのアクセス2003データベースに多くのレコード(奇妙なファイル形式のファイルから)を挿入しようとしています。多くの実験の後、このコードは私が思いつくことができた最速です。マシンで約15秒で10000のレコードを実行します。これらの秒のうち少なくとも14.5(つまり、ほぼすべての時間)は、UpdateBatchへの単一の呼び出しにあります。

私は他の場所で、ジェットエンジンがUpdateBatchをサポートしていないことを読みました。だから多分それをするためのより良い方法があるかもしれません。

さて、私はジェットエンジンが平凡だと思うでしょうが、それはそれではありません。下のコードを使用して「Testy」テーブルを生成した後、右クリックしてエクスポートを選択し、XMLとして保存しました。次に、右クリックし、インポートを選択し、XMLをリロードしました。 XMLファイルをインポートする合計時間は? 1秒未満、つまり。少なくとも15倍高速。

確かに、TEMPファイルの書き込みを必要としないデータをアクセスに挿入する効率的な方法がありますか?

Sub TestBatchUpdate()
    CurrentDb.Execute "create table testy (x int, y int)"

    Dim rs As New ADODB.Recordset
    rs.CursorLocation = adUseServer
    rs.Open "testy", CurrentProject.AccessConnection, _
        adOpenStatic, adLockBatchOptimistic, adCmdTableDirect

    Dim n, v
    n = Array(0, 1)
    v = Array(50, 55)

    Debug.Print "starting loop", Time
    For i = 1 To 10000
        rs.AddNew n, v
    Next i
    Debug.Print "done loop", Time

    rs.UpdateBatch
    Debug.Print "done update", Time

    CurrentDb.Execute "drop table testy"
End Sub

APIがある場合は、C/C ++に頼ることをいとわないでしょう。しかし、私はそれを見つけることができないようです。 application.importxmlが文書化されていないAPIを使用していることはできませんか?

役に立ちましたか?

解決

ADOでこれを行う必要がない限り、代わりにDAOを試してください。あなたの手順とDAOバージョンを備えた私のラップトップの時間は次のとおりです。

ADO:
starting loop 9:51:59 PM
done loop     9:52:00 PM
done update   9:52:54 PM

DAO:
starting loop 9:58:29 PM
done loop     9:58:31 PM
done update   9:58:31 PM

これは私が使用したDAOバージョンです。

Sub TestBatchUpdateDAO()

    CurrentDb.Execute "create table testy (x int, y int)"

    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("testy", dbOpenTable, dbAppendOnly)
    Dim i As Long

    Debug.Print "starting loop", Time
    For i = 1 To 10000
        rs.AddNew
        rs!x = 50
        rs!y = 55
        rs.Update
    Next i
    Debug.Print "done loop", Time

    'rs.UpdateBatch '
    Debug.Print "done update", Time

    rs.Close
    Set rs = Nothing
    CurrentDb.Execute "drop table testy"
End Sub
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top