Help us understand the problem. What is going on with this article?

.NET4.5でMS Accessのアクションクエリやマクロを実行するときの備忘録

More than 1 year has passed since last update.

1.事の背景

Accessを使ってデータを加工する処理をVB.NETで書いていますが、.net3.5で動かしていたプログラムの
動作が重いと感じ、.net4.5でコンパイルしなおしたところ、手で動かしても落ちないところで、落ちるようになった。

2.考えたこと

①DBの最適化を細かく差し込んだ

正直パフォーマンスは低下したが、ほぼリコンパイルしても動くようになったが、最適化をかけまくるとプロセスに
大量のAccessプロセスが残るる場合があり、そうなると落ちてしまう。
ただ、大量にDelete処理を入れた時は、最適化をかけないと次の処理で落ちてしまうので、そこには最適化が必要。

②クエリの間に微小なWaitを入れる

.netからの応答にAccessが耐えられない状況が出てくる模様で、数ミリ秒のWaitを入れてあげることで、
改善

3.Waitのコード例

Public Sub AccessCompaction(ByVal dbPath As String, ByVal dbName As String)
    '最適化元のMDBファイル名
    Dim strWorkingAccess As String
    '最適化先のMDBファイル名
    Dim strTempDb As String

    ' 必要な変数を宣言する
    Dim dtNow As DateTime = DateTime.Now

    ' 指定した書式で日付を文字列に変換する
    Dim stPrompt1 As String = dtNow.ToString("yyyyMMddHHmmss")

    Dim dbe As Dao._DBEngine = Nothing

    '最適化元のMDBファイルのフルパスを設定
    strWorkingAccess = dbPath & dbName
    '最適化先の一時MDBファイルのフルパスを設定
    strTempDb = dbPath & "~tmp" & stPrompt1 & dbName

    Log4Logs.Info("Access最適化:元DB:" & strWorkingAccess)
    Log4Logs.Info("Access最適化TempDB:" & strTempDb)

    Try


        '修復の実行
        '_mAccessApp.DBEngine.RepairDatabase(strWorkingAccess)

        '最適化の実行
        _mAccessApp = New Access.Application()
        _mAccessApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityLow  'マクロを有効にして開くように設定
        _mAccessApp.DBEngine.CompactDatabase(strWorkingAccess, strTempDb)

        System.Threading.Thread.Sleep(500)

        '最適化元のファイルを削除
        Kill(strWorkingAccess)

        System.Threading.Thread.Sleep(500)

        '最適化先のファイル名を最適化元のファイル名にリネーム
        File.Move(strTempDb, strWorkingAccess)
        Log4Logs.Info("Access最適化完了")


    Catch ex As Exception
        Console.WriteLine((ex.GetType().FullName & vbCrLf & ex.Message.ToString), MsgBoxStyle.Exclamation)
    Finally
        Log4Logs.Info("一時停止")
        System.Threading.Thread.Sleep(60000)

        Console.WriteLine("最適化完了")
    End Try

End Sub
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away