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
 
  | 
		 
  
	
	
	
	
	
	
	 
	
		
		 
	
	 |