none
ターゲットコンピュータ Windows 7(64bit) + Office(32bit) のためのソフト開発です RRS feed

  • 質問

  • Windows 7(64bit) + Office(32bit) のターゲットコンピュータのためのソフト開発です。

    この環境で以下のプログラムをテストしましたがうまくいきません。

    32bitOS + 32bit Access で開発したVB.NETプログラム および Access File  (開発環境で動作確認)
    64bitOS で開発したプログラム + 32bit Access File 
    64bitOS + 64bit Access で開発したプログラム  および Access File    (開発環境で動作確認)

    なお、64bitOS 開発環境で 32bit Access Fileにアクセスすると、
    以下のメッセージがでます。

    'Microsoft.ACE.OLEDB.12.0' プロバイダはローカルのコンピュータに登録されていません。

    どなたか、解決策をご教示ください。

    2013年10月26日 8:38

回答

  • toy41 さま よろしく。

    64 Bit OS の AnyCPU はネィティブの x64 実行ですよね。
    その中から、x86 ( 32 bit ) のライブラリを呼ぶ事は無理だったのではないでしょうか?

    x86 指定で WOW 経由の 32 とするか、AnyCPU で 64 とするかの2択では?

    更に、利用するサードパーティ製 DLL が AnyCPU なら、64 環境において 32ビットAccessRuntime を諦めるしかないのでは?

    • 回答としてマーク 星 睦美 2013年10月30日 1:45
    • 編集済み ShiroYuki_Mot 2013年10月31日 1:11 最後に1行追加 した行に 接頭語句追加
    2013年10月28日 9:27
  • > Windows 7(64bit) + Office(32bit) のターゲットコンピュータのためのソフト開発です。

    やりたいことは、.NET アプリから、OLEDB または ODBC プロバイダを使って、Access のファイル(.mdf または .accdb)読み書きしたいということですよね? (オフィスオートメーションを利用して Office (Access) を操作するのではなくて)

    想像ですが、問題は 2 つあって、(1) コンパイルスイッチの選び方の間違い、(2) ACE (Access Connectivity Engine) データベースエンジンがインストールされてない、ということではないかと思います。


    上記 (1) の問題のメカニズムおよび解決策については、以下のページが参考になると思います。特に、Part2 の Step. 8, Step. 9 あたりを見てください。

    Part 1. 64 ビット Windows OS の基本知識
    http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspx

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx


    上記 (2) については、接続文字列に Provider=Microsoft.ACE.OLEDB.12.0; と指定しておきながら、「Windows 7(64bit) + Office(32bit) のターゲットコンピュータ」に ACE (Access Connectivity Engine) データベースエンジンがインストールされてないためと思います。

    JET なら Windows OS 同梱で提供されているのでインストールは不要ですが、ACE は同梱されてないので、Microsoft Download Center からダウンロードして「ターゲットコンピュータ」にインストールする必要があります。

    詳しくは以下のページを見てください。
     
    Access 2007 の DB を利用するアプリ開発
    http://surferonwww.info/BlogEngine/post/2011/11/08/Development-of-application-which-uses-accdb-file-of-Access-2007.aspx

    • 回答としてマーク 星 睦美 2013年10月30日 1:44
    2013年10月27日 3:06
  • サードパーティ製のDLLをどう使用されていて、どう影響しているのかわからないのですが、VS2010とAccessの関係であれば、以下が参考になると思います。新しい情報は無いかもしれませんが、よくまとまっています。

    64bitOSで動作するアプリ作成の方法
    http://social.msdn.microsoft.com/Forums/ja-JP/0d2a3783-1263-4c9e-bc59-5fa15321d3dd/64bitos?forum=csharpexpressja


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 星 睦美 2013年10月30日 1:49
    2013年10月29日 2:17
    モデレータ

すべての返信

  • 32bit Access Fileにアクセスすると、
    Access のファイル自体には 32 bit も 64 bit もないんじゃないかな。

    開発している VB のアプリが 64 bit になってるんだと思います。
    64 bit VB アプリ → ACE
    32 bit VB アプリ → JET

    構成マネージャーで 32 bit を明示的に指定してみてください。


    2013年10月26日 9:17
  • > Windows 7(64bit) + Office(32bit) のターゲットコンピュータのためのソフト開発です。

    やりたいことは、.NET アプリから、OLEDB または ODBC プロバイダを使って、Access のファイル(.mdf または .accdb)読み書きしたいということですよね? (オフィスオートメーションを利用して Office (Access) を操作するのではなくて)

    想像ですが、問題は 2 つあって、(1) コンパイルスイッチの選び方の間違い、(2) ACE (Access Connectivity Engine) データベースエンジンがインストールされてない、ということではないかと思います。


    上記 (1) の問題のメカニズムおよび解決策については、以下のページが参考になると思います。特に、Part2 の Step. 8, Step. 9 あたりを見てください。

    Part 1. 64 ビット Windows OS の基本知識
    http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspx

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx


    上記 (2) については、接続文字列に Provider=Microsoft.ACE.OLEDB.12.0; と指定しておきながら、「Windows 7(64bit) + Office(32bit) のターゲットコンピュータ」に ACE (Access Connectivity Engine) データベースエンジンがインストールされてないためと思います。

    JET なら Windows OS 同梱で提供されているのでインストールは不要ですが、ACE は同梱されてないので、Microsoft Download Center からダウンロードして「ターゲットコンピュータ」にインストールする必要があります。

    詳しくは以下のページを見てください。
     
    Access 2007 の DB を利用するアプリ開発
    http://surferonwww.info/BlogEngine/post/2011/11/08/Development-of-application-which-uses-accdb-file-of-Access-2007.aspx

    • 回答としてマーク 星 睦美 2013年10月30日 1:44
    2013年10月27日 3:06
  • 以下あたりも参考になるのではないかと思います。

    64ビットOSでのMDBデータアクセスについて
    http://social.msdn.microsoft.com/Forums/vstudio/ja-JP/278d115f-1ea6-4272-95bb-b4694347aa1b/64osmdb

    x64環境からmdbに接続 OLEDBドライバ
    http://1pat.jp/system/2011/03/-x64mdboledb.html

    64bitプログラムからのmdbへのアクセス
    http://d.hatena.ne.jp/au2010/20110909/1315568060

    64bit WindowsでMDBを使用する
    http://gabunomi36.blog57.fc2.com/blog-entry-245.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年10月28日 0:44
    モデレータ
  • galacoさん、SurferOnWwwさんみなさんご回答ありがとうございます。

    最初に、このプロジェクトはVisual Studio 2010で、AccessFileはいずれもaccdb形式を使っています。

    また、このプログラムでは、自作のDllを使っていますが、
    メインプログラムよび当Dllの何れのコンパイルスイッチも[AnyCPU]にしています。

    またサードパーティのDllも使っています。
    これは32ビットおよび64ビット環境で動作していますので、
    おそらく[AnyCPU]でコンパイルしているものと思われます。

    また、プロバイダーには、[Microsoft.ACE.OLEDB.12.0]を使っています。

    その後以下の確認をしました。

    ① 開発環境 32ビットOS VB.NET + 32ビットAccessFile(32ビットAccessで作成した AccessFile)

     ターゲット 32ビットOS + 32ビットOffice(あるいは 32ビットAccessRuntime)環境 : 正常
     ターゲット 64ビットOS + 64ビットOffice(あるいは 64ビットAccessRuntime)環境 : 正常
     ターゲット 64ビットOS + 32ビットOffice(あるいは 32ビットAccessRuntime)環境 : 不可

    ② 開発環境 64ビットOS VB.NET + 64ビットAccessFile(64ビットAccessで作成した AccessFile)

     ターゲット 32ビットOS + 32ビットOffice(あるいは 32ビットAccessRuntime)環境 : 正常
     ターゲット 64ビットOS + 64ビットOffice(あるいは 64ビットAccessRuntime)環境 : 正常
     ターゲット 64ビットOS + 32ビットOffice(あるいは 32ビットAccessRuntime)環境 : 不可

    ③ 開発環境 64ビットOS + VB.NET + 32ビットOffice環境でプログラムを実行すると、
    「'Microsoft.ACE.OLEDB.12.0' プロバイダはローカルのコンピュータに登録されていません。」のメッセージが出ます。

    なお、32ビットOfficeがインストールされている、64ビットOS環境に、
    64ビットAccessRuntimeをインストールすることはできません(一度確認)。

    また、AccessFileはAccess32ビットで作成したものとAccess64ビットで作成したものは同じではないようですが、
    32ビット環境で作成したAccessFileは、64ビットOS + 64ビットOffice環境でも動作します。

    いずれにしても、このプログラムをターゲット64ビットOS + 32ビットOffice 環境で動作することが現在までのところ、できません。

    更に検討すべき点があればご教示、お願いします。

    2013年10月28日 8:07
  • toy41 さま よろしく。

    64 Bit OS の AnyCPU はネィティブの x64 実行ですよね。
    その中から、x86 ( 32 bit ) のライブラリを呼ぶ事は無理だったのではないでしょうか?

    x86 指定で WOW 経由の 32 とするか、AnyCPU で 64 とするかの2択では?

    更に、利用するサードパーティ製 DLL が AnyCPU なら、64 環境において 32ビットAccessRuntime を諦めるしかないのでは?

    • 回答としてマーク 星 睦美 2013年10月30日 1:45
    • 編集済み ShiroYuki_Mot 2013年10月31日 1:11 最後に1行追加 した行に 接頭語句追加
    2013年10月28日 9:27
  • > 更に検討すべき点があればご教示、お願いします。

    回答者のレスを読んでいただいているでしょうか?

    レスに書いてある当方の質問には答えていただけないし、レスの内容を理解したかどうかも書かないで、同じ質問を繰り返しているだけのように思えます。

    「更に検討すべき点」と言われても、今の状況では難しいです。


    • 編集済み SurferOnWww 2013年10月28日 14:57 誤記訂正
    2013年10月28日 14:53
  • SurferOnWwwさん

    私の書き方が悪かったかもしれません。
    この点は申し訳ありません。

    SurferOnWwwさんの回答、参考リンクを一通り読んで、
    使用Dllを含めてプログラムのコンパイルスイッチが[AnyCPU]であることを確認し、
    Accessファイルがmdbではなく、accdbであること、
    プロバイダに32ビット/64ビット共にACEを使用していること、
    ACEのエンジンとして、AccessRuntimeをインストールしていること、
    を書きました。

    読み方が不十分な点があるかも知れませませんが、
    皆さんの回答を参考にして再検討したことを書いたつもりでいました。

    そして私の最初の質問が言葉足らずかと思い、
    更に詳しくプロジェクトおよびテストの内容を書きました。






    • 編集済み toy41 2013年10月29日 1:32 一部文章修正
    2013年10月28日 21:55
  • サードパーティ製のDLLをどう使用されていて、どう影響しているのかわからないのですが、VS2010とAccessの関係であれば、以下が参考になると思います。新しい情報は無いかもしれませんが、よくまとまっています。

    64bitOSで動作するアプリ作成の方法
    http://social.msdn.microsoft.com/Forums/ja-JP/0d2a3783-1263-4c9e-bc59-5fa15321d3dd/64bitos?forum=csharpexpressja


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 星 睦美 2013年10月30日 1:49
    2013年10月29日 2:17
    モデレータ
  • 質問者さん>

    以下の私の質問に関する回答をいただいてません。

    > やりたいことは、.NET アプリから、OLEDB または ODBC プロバイダを使
    > って、Access のファイル(.mdf または .accdb)読み書きしたいという
    > ことですよね? (オフィスオートメーションを利用して Office (Access)
    > を操作するのではなくて)

    上記に対する答えが Yes なら runtime は必要なく、データーベースエンジンで済むはずです。

    2007 Office system ドライバ: データ接続コンポーネント
    http://www.microsoft.com/ja-jp/download/details.aspx?id=23734

    Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント
    http://www.microsoft.com/ja-jp/download/details.aspx?id=13255


    また、コンパイルオプションを AnyCPU に設定するのは何故でしょう? 32/64-bit 両方の OS 上で問題なく動かしたいなら x86 にすべきと思いますが。そのあたりは先に紹介した url のサイトに書いてあります。(だからレスを読んでないと思ったのですが)


    これが一番大事なことですが、サードパーティ製 dll の正体をきちんと確認してください。それは質問者さん以外知り得ないのですから。「おそらく[AnyCPU]でコンパイルしているものと思われます」というようなことではダメです。

    2013年10月29日 6:39
  • SiroYuki_Motさま

    おっしゃることを今ひとつ理解していないかもしれません。

    [AnyCPU]でコンパイルしたプログラムは、64ビットOSでは64ビットバイナリとして実行される。
    しかし32ビットAccessFileの部分はWOW64で「自動的」に動作してくれる。
    と期待したのですが…
    この理解は間違っていたようです。

    次のテストをしました。
    32ビットOS環境で、当該32ビットAccessFileを使った小さなプログラムを作り、
    コンパイルスイッチ[x86]でビルドし、
    64ビットOS環境で実行したところ、
    どなたかの解説にあったとおり、正常に動作しました。

    今回問題になったプロジェクトをすべて[x86]バイナリにすれば、
    今回の問題は解決しますが、このプロジェクトではサードパーティのコントロールを使っていて、
    多分このコンパイルスイッチが[AnyCPU]になっているのだと思います。
    なので、すべてを明示的に[x86]にすることができません。

    今回解決したいと思った問題は、不可能と理解しまいした。

    みなさん、貴重なご意見、情報をお寄せいただき大変勉強になりました。
    ありがとうございました。

    2013年10月29日 7:06
  • 微妙にいまさらですが……

    ExeとかDLLが Any CPU,x86,x64のどれになっているかを調べる方法

    corflags.exeを利用

    • AnyCPU : PE = PE32 , 32BIT = 0
    • x86 : PE = PE32 , 32BIT = 1
    • x64 : PE = PE32+ , 32BIT =0

    ■AnyCPUの例

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>corflags  <保存されているディレクトリ>\Test.dll"
    Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Version   : v2.0.50727
    CLR Header: 2.5
    PE        : PE32
    CorFlags  : 1
    ILONLY    : 1
    32BIT     : 0
    Signed    : 0
    
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>

    参考資料:
    ■ 64 ビット プラットフォームへのアプリケーション移行(PDF 形式、20.1 MB)
    http://download.microsoft.com/download/B/0/9/B09F266D-8D54-4476-A3EC-E974CA5F61F8/BS_202.pdf
    ※58枚目に、上記のビットを見てどのように起動されていくかの説明があります。

    【最悪の場合……】
    動くかどうかはテストの上自己責任で……

    「ビルド後の .NET アセンブリを 32bit で動作させる方法: あるSEのつぶやき」
    http://fnya.cocolog-nifty.com/blog/2012/02/net-32bit-6a08.html





    • 編集済み ChukiMVP 2013年10月30日 2:12
    2013年10月30日 2:09
  • > ExeとかDLLが Any CPU,x86,x64のどれになっているかを調べる方法

    それは私の紹介した以下のページの Step. 10 にも分かりやすく書いてあります。

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx


    #だから、質問者さんはレスを読んでないと言ったのですが・・・

    2013年10月30日 2:56