64bitでmdb OLEDB4.0を使用する VS2008
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版で既出のもの。
きちんとトランザクションも実行できている。
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
|
|