プログラミング

プログラミングに関するフォーラムです。VBAは除きます。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : C# .net)
C#からMyData.sccdbへの接続
投稿日時: 24/04/14 19:45:58
投稿者: S.Kos

こんにちは、みなさま。
 
Windows11に32ビット版MS365を導入したPC-Aがあります。
EXCEL・ACCESSともに、365MSO(バージョン2403ビルド16.0.17425.20124)32ビット、です。
 
このPC-Aで作成した"MyData.sccdb"に"MyBook.xlsm"で、
  AdCon As New ADODB.Connection
  AdCon.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=MyData.sccdb;" & _
             "Jet OLEDB:Database Password=MyPsw;"
として接続できています。
 
PC-AにはVisualSudio(Community2022)が導入してあり、これでビルドした"MyProg.exe"からも接続できています
接続文字列は、
  OleDbDsn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyData.sccdb;Jet OLEDB:Database Password=MyPsw;";
です。ビルドに際しては AnyCPU とし、DebugでもReleaseでも、問題ありません
 
 
さて、もう一台のPC-Bには、Windows10に64ビット版MS365を導入しています。
EXCEL・ACCESSともに、365MSO(バージョン2402ビルド16.0.17328.20124)64ビット、です。
 
PC-A上の"MyData.sccdb"と"MyBook.xlsm"をPC-Bへコピーすると、完全に動作します。
これには半分(?)驚きつつ感激しました。
 
ところが、PC-A上で(Releaseで)ビルドした"MyProg.exe"はダメ、PC-Bの上では動いてくれません。
ネットを彷徨い、
OleDbDsn = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source="MyData.sccdb;Jet OLEDB:Database Password=MyPsw;";
としてみましたが、これもダメでした。
 
PC-Aでビルドした"MyProg.exe"を、PC-B上へコピーして"MyData.sccdb"に接続する方法があるなら、ご教示いただければ幸いです。
 

回答
投稿日時: 24/04/15 15:27:11
投稿者: QooApp

記述ミスなだけでしたら解決に至らない回答になると思いますが、
ご記載のコードを比較したところ、OLEDBの数字が異なること以外に、ダブルコーテーションが1文字おおくついています。これが正しい記述だとすると実行エラーになる疑いがあり、構文エラーを解消することで解決に至る可能性があるのではないかという提案です。
 
="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyData.sccdb;Jet OLEDB:Database Password=MyPsw;";
="Provider=Microsoft.ACE.OLEDB.16.0;Data Source="MyData.sccdb;Jet OLEDB:Database Password=MyPsw;";
 
あとはOLEDBの番号が異なるだけで解決できるとすれば他の番号を手当たり次第に実行テストするのもいいかもしれません。
おそらくVBAの編集ウィンドウでいうところの参照設定内でMSソフト自体が搭載しているモジュールのバージョン番号が一致していないみたいな原因だけで解決できそうな気がします。
 
よくあるのがPCにインストールしてあるacrobatのランタイムなどの指定手順において、実装されているバージョンが記述したバージョンと異なる場合などに同様のエラーに至るのではないかと思いました。
 
ご確認お願い致します。

回答
投稿日時: 24/04/15 18:17:01
投稿者: Suzu

前回の質問でもそうでしたが、「sccdb」では無いですよね。
 
そもそも、その時点で、ファイルが存在しませんから、エラーになっているとか?
でも、PC-A では 動作しているのですから、そうではないのですよね?
 
 
 
そもそも、Microsoft.ACE.OLEDB.XX.0 は、 PC-B には インストールされているのですか?
 

引用:
PC-A上の"MyData.sccdb"と"MyBook.xlsm"をPC-Bへコピーすると、完全に動作します。
これには半分(?)驚きつつ感激しました。

 
との事ですが、
 
Microsoft.ACE.OLEDBについてまとめてみた
https://qiita.com/yaju/items/7b0aa9e9f30005f60388
 
引用:
ACEのインストール
「Microsoft.ACE.OLEDB.XX.0」は、Windowsインストーラー形式(MSI)のOfficeをインストールすれば利用できるようになります。
それ以外の方法では、「Microsoft Access データベース エンジン 再頒布可能コンポーネント」などで別途インストールする必要があります。

 
とあります。
365 のインストールのみでは使用できないはずです。
それなのに、使用できる?
 
接続文字列についても、QooApp さんのご指摘の様に ふつうエラーになるのですよ。
 
そんな 疑問をもちつつ こうだろうな と推測しながら回答するのでは
その推測が違った場合、回答者としては、二度手間です。
 
コードや、文字列については、コピペし(WEBに上げるのに隠す必要がある部分は隠す)
ご自身で、確認をし 質問頂ければ と思います。

回答
投稿日時: 24/04/15 21:45:22
投稿者: MMYS

S.Kos さんの引用:

OleDbDsn = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source="MyData.sccdb;Jet OLEDB:Database Password=MyPsw;";
としてみましたが、これもダメでした。

そもそも、コンパイラ(ビルド)が通らないと思いますが。(それ以前に、IDEが警告している)
 
 
さて、PC-B上て動作しないとのことですか、どんな例外を吐き出して、どんなエラーメッセージなのですか。
※実務・実用では、例外処理は必須です。特に実行環境で(VSがない環境)では原因追及出来ません。
 

投稿日時: 24/04/16 15:40:11
投稿者: S.Kos

みなさま、ご教示のほど、ありがとうございます。
 
タイプミス・記述ミスについては、誠に申し訳なく、ご容赦くださいとしか言いようがありません。
その上で尚、以下を記します。
 
 
開発環境として詳細を記した「PC-A」の他に、言わば「PC-A群」があります。
いずれもWindow10or11に32ビット版Office(EXCEL)を搭載しています。
それらOffice(EXCEL)は、Standard2016・Personal2019・365、ACCESSは有ったり無かったり、と多様です。
(さすがに2013はありません・笑)
 
その全てで "MyData.accdb"と"MyBook.xlsm"と"MyProg.exe" が動作します。
 
32ビット版Office必須としていた某システムが破棄され、今後導入されるPCは64ビット版Office・・・
 
てな事情から、一台のWindow10機のMS365を64ビット版に入れ替えて、テスト環境「PC-B」としました。
先に記したようにここで "MyData.accdb"と"MyBook.xlsm" は動くけれど、"MyProg.exe"が動かない…
 
あちこち彷徨って、Suzuさんが記された"qiita.com"さんのサイトも訪ねました。
そこに記された様々は、驚きの連続でした。
64ビット版365に入れ替えたPC-Bで、"MyData.accdb"と"MyBook.xlsm"が動いているのですから!
 
"qiita.com"さんのサイトに記された方法で、PC-B上に"Microsoft.ACE.OLEDB.12.0"と同"16"が有ることも確認しています。
 
 
MMYSさん
>特に実行環境で(VSがない環境)では原因追及出来ません。
>
御意!
"MyProg.exe"のコードに、不具合発生個所とエラーメッセージを把握できるよう、手を入れてるところです。
try〜catch〜finallyって記述が良いのか悪いのか、判らなくなっています(苦笑)。

投稿日時: 24/04/17 01:00:27
投稿者: S.Kos

どうやら、自己解決したようです。
 
PC-BにVS2022を導入し、PC-Aから"MyProg.exe" に関わるフォルダ(プロジェクト)をコピーしました。
ビルドすると「Microsoft.ACE.OLEDB.16.0が見つからない」とのメッセージ!
 
悩んだあげく、CPUを指定したら、と思い当たりました。
これがビンゴ!、AnyCpu → x64 と変更したら、接続できました。
 
みなさまのご教示に感謝しつつ、ここで閉じます。