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化して、手動切り替えの仕組みを作るのは、トリッキーでしかなかったです。
手間ばかりかかった。と当時、愚痴ったものでした。

タイトル
名前
Url
コメント