Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

MDBはx86下で使える

前々回のエントリーで頂いたコメントを追試しました。
プラットフォームターゲットの指定は
C#では、 ビルドの頁に 「プラットフォーム ターゲット」欄があります。
VBでは、コンパイルの頁の「詳細コンパイルオプション」の副頁を開くと「ターゲットCPU」欄があります。

同じ .NET言語なんだから、用語を統一してほしいな......はさておいて。

頂いたコメントに準じて、確認しました。(Visual studio 2005 VB)
Dim conn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\test.mdb")
conn.Open()
Dim da As New System.Data.OleDb.OleDbDataAdapter("select * from 名簿", conn)
Dim ds As New System.Data.DataSet
da.Fill(ds)
MsgBox(ds.Tables(0).Rows.Count)
conn.Close()

「x64」「Any CPU」下では
・Microsoft.Jet.OLEDB.4.0' プロバイダはローカルのコンピュータに登録されていません。
が出ます。WOW64が働らいていないのか思い、手動で C:\Windows\SysWOW64\msjter40.dllを参照すると
・C:\Windows\SysWOW64\msjter40.dll' への参照を追加できませんでした。ファイルにアクセスできて、有効なアセンブリであること、または COM コンポーネントであることを確認してください。
となります。

「x86」下では、ご指摘のように動作します。

VB6の開発環境がないので、確認できないのですが、 MDBを使っているアプリを走らせると「データベースアクセスに失敗しました。」と出る。
アプリで出しているメッセージのようなので、詳細は判りません。
VBAで
Set db = OpenDatabase("C:\AccessVBA事典\Sample.mdb")
と書くと、動作する。

VBAは x86なので 納得です。 x64.dllは呼べない。

ということは、x64OS下のx64下で、MDBを使うには、X86モードで開発してリンクするか、VBAを介して使うことになりますね。
そこまでして、使う意義があるかどうがてすが、MDB文化の資産って、多いようです(私ま回り)。異なるDBに置換する工数を考えたら、、MDBを使い続けるほうがマシか。
8G/16Gメモリを実装した機械も出回るようになった現在、 x86資産が足枷になるのも、時の流れながれか。
Itaniumは何時の間にか消え去っています。xeonも、あまり話題になりませんね。Itaniumモードで作成したアブは、どうなるんでしょうね。

投稿日時 : 2010年10月16日 13:07

Feedback

# re: MDBはx86下で使える 2010/10/16 13:35 ちゃっぴ

x64 用も一応出ていたりします。

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント
http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=ja

# re: MDBはx86下で使える 2010/10/16 19:40 ognac

あるものですね。要望が強かったのでしょうね。
該当ページによると、 Provider名を "Microsoft.ACE.OLEDB.14.0" にせよとある。....JETでなくなったのね。
早速、使ってみましたが、
x64下で「ドライバーが見つかりません」..と出ます。
うーん。なぜだ.....探し回っているうちに、「Microsoft.ACE.OLEDB.12.0」での接続例に出会った。
試に、
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=.\test.mdb");
で行うと、接続できました。 万歳。 ミスプリではないのかなぁ。

でも、X86下では、
・Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。
となります。
当ドライバーの x86版は x64下では、導入できない
実行CPUに合わせて、切り替えないとだめなのか。 判定の手法はあるのでしょうが、スマートでないなぁ。

# re: MDBはx86下で使える 2010/10/16 23:04 Pasie.

> Microsoft.ACE.OLEDB.14.0
> Microsoft.ACE.OLEDB.12.0
 Officeのバージョン? 14ってことはOffice2010ってことかな? 12はOffice2007か。

> 実行CPUに合わせて、切り替えないとだめなのか
 気にせず、AnyCPUでなくてx86で。
 私はここのポリシーに従ってます(従っているつもり…ですが)
  http://blogs.wankuma.com/naka/archive/2007/05/20/77413.aspx

 あと、x64でAnyCPU設定でieを立ち上げるとひどいことに。javaアプレットとかのページが見れないんですね。なんでかと思えばx64で立ち上がっていて、x64のプラグインがインストールされていないから。プラグイン一覧見るといないんですよ!
 これで問題なのはx64で普通にアイコンからie立ち上げた時はちゃんとそのページが見えること。プラグイン一覧みるとちゃんと出てくる。なんでだ!と思ってタスクマネージャのプロセス一覧をみたら…_| ̄|○

 あとWOW64はアウトプロセスの場合は、x64-x86間通信できますけど、インプロセスの場合はどちらかです。つまりx64からActiveX.exe(x86)は呼べるけど、ActiveX.Dll(x86)は呼べない。

 しかしVB6で失敗の事例が分からないですね。余力が有れば試してみたいとは思いますが、明日は情報処理技術者試験です…>_<; 

# re: MDBはx86下で使える 2010/10/16 23:20 Pasie.

>あと、x64でAnyCPU設定でieを立ち上げるとひどいことに。
 正確には、こちらは
  ・x64OS(Win2008R2等)から、
  ・AnyCPUの.netアプリからie7等を起動
した場合です。

>x64で普通にアイコンからie立ち上げた時
 こちらは、
  ・x64OS(Win2008R2等)から、
  ・デスクトップにあるショートカットなどから起動した場合
です。
 あと、プラグインではなくアドオンというのがie的には正確な表現なのかな…

# re: MDBはx86下で使える 2010/10/16 23:29 Pasie.

>8G/16Gメモリを実装した機械も出回るようになった現在、 x86資産が足枷になるのも、時の流れながれか。
 待って!
 これはWOW64を使っても、x86のアプリ合計で4GB(3GB以下?)のメモリしか使えないって事ですか?例えば16GBマシンで、x86で1GBのメモリを消費するアプリ(プロセス)があったとして、それをx64OSで複数動かそうとした時、4つまで(総計4GB?)で、残り12GBは余ってしまうということです?
 個人的には1プロセス4GB(3GB?)を超えなければいけると思っていたので、まだまだx86は廃れないな、と思っていたりしましたが… #ユーザーAPで1プロセス4GBを超えるのが普通になる時代はまだもう少し先かなあと。

# re: MDBはx86下で使える 2010/10/17 0:59 ognac

>しかしVB6で失敗の事例が分からないですね。
ソースがあれば、追跡できるのですが、何分、Exeしかないので(VB6コンパイル環境もですが)、これ以上の追跡は、できません。..

>>あと、x64でAnyCPU設定でieを立ち上げるとひどいことに。
苦労されていますね。 x64問題というより、 IE起因も問題のようにも見えますね。なにかと問題を引き起こしますね。

>待って!
知られているように、x86OSの制約で 4G(実際には 4G-約600M)byte の空間しか認識しません。実アブリでは 2Gとかいった下部制約もあります。

x64下では、アドレス空間が 64bitですが、x86-64の制約で、実アドレス52bitだつたり、 Atron64では 40bit(1Tbyte)だったりします。
Athron 仮想空間では、48bit(256Tbyte), Window x64Editionだと、 最大8TByteだったりします。(ばらばらで、掌握しきれてませんが)

「複数のアプリの合計がOS上限を超過しない」という、使い方よりも、「1アプリケーションが、仮想空間一杯まで使かう」という使い方が増えそうに思います。
1アプリケーションで 1TByte使えると、
・映像や音楽 Fileの加工などは、FileごとメモリにLoadして、OnMemoryで操作する。
・Databaseごと、OnMemoryで実行できる。
・100Mbyteのデータを FFT展開するときなど、大量のメモリを所要するアプリが、メモリ展開でコーディングできる。(File IOを考慮しないで済むのでプログラムの作りがシンプルになる)
等...もう当たり前になりそうです。

過去を振り返れば、アプリケーションは、メモリ空間の制約との戦いでしたね。
8bit cpuの時代は 64Kbyteの壁があった。
Intel系 16bit cpuの時は、 Cコンパイラには、 命令サイズ、データサイズで、各々 small, large があり、複数の組み合わせがありました。(68系がうらやましかった)
16bit CPUには 1Mbyteの制約もあった。
16Kの窓を通して、64Kの空間を認識する手法もあったよね。(名称亡失です)
そういえば、 IDE_Diskも壁との戦いでしたね。DISK 4GByteの壁は、 IDEだったか、NTだったか、うろ覚えです。138MByte壁もありましたね。

メモリ単価の下落とともに、広大なアプリメモリが手に入ります。業務アプリでは、十分と思いたいですが、これでも少ないという時代か到来するのでしょうね。

>明日は情報処理技術者試験です…>_<; 
がんぱって下さい。願合格祈念!!

# re: MDBはx86下で使える 2010/10/17 21:00 ちゃっぴ

> 当ドライバーの x86版は x64下では、導入できない

ではなく Office 2010 と同様で、x64 と x86 を同居できないということです。
ということで、結局 x64 と x86 は別の assembly として提供する必要がありますね。この場合優先されるのは Office を x64 と x86 どちらを利用するかになるでしょう。

> これはWOW64を使っても、x86のアプリ合計で4GB(3GB以下?)のメモリしか使えないって事ですか?

いえ、1 process の制限ですので複数 process あげれば有効活用できます。また WoW64 を利用した場合 x86 OS を使っている時のような kernel area を差し引いて 2 GB になる制約はありませんので、4 GB 全て利用可能です。なお、x86 環境で 2 GB 以上の user memory を利用するには PE header LARGEADDRESSAWARE を有効にする必要があります。
なお、x86 環境で 4 GB 以上の user memory を利用するには AWE を使うんですが、もう利用することないですね。

# re: MDBはx86下で使える 2010/10/18 0:08 Pasie.

 VB6でWOW64。とりあえずいけました。普通に動くようです。
 サンプルコードは以下。

  > Private Sub Command1_Click()
  >
  >   ' 参照設定: Microsoft ActiveX Data Objects 2.8 Library
  >   Dim conn As ADODB.Connection
  >   Set conn = New ADODB.Connection
  >   conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\test.mdb"
  >   conn.Open
  >
  >   Dim rs As ADODB.Recordset
  >   Set rs = New ADODB.Recordset
  >   
  >   rs.Open "Select * from test", conn, adOpenStatic, adLockOptimistic
  >   
  >   MsgBox rs.RecordCount
  >   
  >   rs.Clone
  >   conn.Close
  >
  > End Sub

# re: MDBはx86下で使える 2010/10/18 0:22 Pasie.

>1アプリケーションが、仮想空間一杯まで使かう
 とりあえず業務アプリに関しては、1プロセス2GBを超えるようなプロセスはしばらくないかなあと。そう考えたらx86でもいいんじゃね?って気がしてるんですよね。

>x64問題というより、 IE起因も問題のようにも見えますね
 ieもまた、x86版とx64版があって、それが同居していまして。デスクトップから立ち上げる分にはx86が動くんですが、AnyCpuやx64で起動されたieはx64で動くんです。という話。
 知っていれば当然の話なんですが、知らなければieの見た目も一緒、他のページも普通にみれる。でもプラグインなページ(要はjavaがかんでいたり、多分flashとかも)だけ見えない、当然AnyCPUだと、同じexeをx86に持ち込めば普通に表示できる。はまりポイントですね。

>16Kの窓を通して、64Kの空間を認識する手法もあったよね。(名称亡失です)
 EMS?
 http://www.atmarkit.co.jp/fwin2k/special/win9xorwin2k/column_winhistory.html
 私はそのころ68系だったのでfarとかnearとかhimemとか無縁でしたね。いま思えばそっちを知っていた方が良かったかも。と思いますが…

>いえ、1 process の制限ですので複数 process あげれば有効活用できます
 ありがとうございます。きっと誰かが調べてコメントしてくれると信じておりました^^;

# re: MDBはx86下で使える 2010/10/18 21:08 ognac

>この場合優先されるのは Office を x64 と x86 どちらを利用するかになるでしょう。
なるほど。納得できました。
アプリで対応する時代が、続きますね。

>VB6でWOW64。とりあえずいけました。普通に動くようです。
ですよね。動くのが当然に思います。なぜ落ちるのだろう。違う箇所とか、固有の作りこみが施されているのだろうか。
ソースがない状態で、今回のように落ちる場合はお手上げですね。

>とりあえず業務アプリに関しては、1プロセス2GBを超えるようなプロセスはしばらくないかなあと。
普通の事務業務アプリでは、必要としないかもしれませんね。
8Gbyte以上のメモリ空間を直接利用できるアプリには魅力あるようです。

>知っていれば当然の話なんですが、
知らなくてハマりたくない事態ですね。

>EMS?
EMSです。
>私はそのころ68系だったのでfarとかnearとかhimemとか無縁でしたね。
うらやましいです。
他に、大きいアプリを作るとき、 256KByte,512Byte境界で、Overlay化して、手動切り替えの仕組みを作るのは、トリッキーでしかなかったです。
手間ばかりかかった。と当時、愚痴ったものでした。

# thanks for the postmishertAtroro 2010/11/08 23:17 student loan

Terrific work! This is the type of information that should be shared around the web. Shame on the search engines for not positioning this post higher!

タイトル
名前
Url
コメント