64bitでmdb OLEDB4.0を使用する VS2008

VB Tips And Sample(HOME)(VB.NET Sample インデックス)

64bitでmdb OLEDB4.0を使用する VS2008

System.InvalidOperationException: 'Microsoft.Jet.OLEDB.4.0' プロバイダはローカルのコンピュータに登録されていません。
と言うエラーメッセージが64bit環境で出る場合がある。
これは、VBプロジェクトがAny CPUでコンパイルされている為 OLEDBが64bitで動こうとして起こるエラーらしい。
EXEは64bit対応だが、OLEDB4.0が付いてきていないということ。
でも、mdbは64bitのWin7環境でAccess2007からきちんと開ける。
保存形式も2000形式が選べるようになっている。つまり、mdbは使えるはずなのだ。
で、EXEの対応方法というより、OLEDBの対応のさせ方だが、EXEをx86対応形式でコンパイルしなおせば動いた。
※因みになぜx86が32bitなのかと言うのは「x86」が参考になるか。
プロジェクトのオプションで、コンパイルの方法をAny_cpuから変更する。

コンパイルのオプション
32bit対応にしてコンパイルする

以下のソースは過去32bit版で既出のもの。
きちんとトランザクションも実行できている。


Imports System.Data.OleDb 32bit版としてコンパイルすればOK。
64bitの開発環境で、これがインポートできるのだからAny_Cpudで動いてくれればよいのにと思うが駄目であった。


Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        
        Dim cn As New OleDbConnection
        Dim cmd As New OleDbCommand
        Dim dr As OleDbDataReader '読み取り専用前方スクロール
        Dim myTran As OleDbTransaction

        Dim i As Int32
        i = System.Environment.TickCount 'システム起動後のミリ秒単位の経過時間を取得します。

        Try

            cmd.Connection = cn
            cmd.CommandText = "SELECT * FROM テーブル1"
            cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\db1.mdb"
            'VISTA上ではAccess2000形式はサポートされているらしい。Access2007でサポートされている為らしい。
            cn.Open()

            'こいつで読み込む
            dr = cmd.ExecuteReader()
            'こいつで読み込む 
            If dr.Read = True Then
                'レコードが存在すれば
                dr.Close() 'データリーダを閉じてから行わないと fetching中と言う事でエラー

                myTran = cn.BeginTransaction(IsolationLevel.ReadCommitted)
                cmd.Transaction = myTran
                cmd.CommandText = "UPDATE テーブル1 SET フィールド1='000' WHERE ID=1"
                cmd.ExecuteNonQuery()

                '他にも同じ接続先への更新などが有ればSQL文を追加していく事ができる
                'cmd.CommandText = "UPDATE Goods SET GoodsName='9999' WHERE GoodsID='A0001'"
                'cmd.ExecuteNonQuery()

                myTran.Commit() '確定する

            End If


        Catch ex As Exception
            If myTran Is Nothing Then
            Else
                myTran.Rollback()
            End If

            MessageBox.Show(ex.ToString)
            Debug.WriteLine(ex.ToString)

        Finally
            dr.Close()
            cmd.Dispose()
            cn.Close()
            cn.Dispose()

        End Try
        i = System.Environment.TickCount - i
        Debug.WriteLine(i & "経過しました。")

    End Sub
End Class



VB Tips And Sample(HOME)(VB.NET Sample インデックス)