質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

15109閲覧

ODBCの32bit/64bitの違いとは何か

AGadget

総合スコア60

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2020/03/11 20:26

ODBCに32bit用・64bit用が、それぞれ存在する理由を知りたいです。

質問の背景

先日、Windows7 32bit上で動くことを想定して開発された業務アプリを、Windows10 64bit上でも動くようにセットアップする、という業務を行いました。

以前にも、同様の業務アプリをWindows7 32bit上にアプリを展開する作業を行ったことがあります。そのため、今回も以前とほぼ同じ手順で行けると高を括っていたのですが、ODBCの設定を行う段階でODBCに32bit用と64bit用があることに気付き、どちらを使って良いのか分からなくなりました。

自分で色々と試してみたところ、32bit用ODBCを使うとデータベースと接続できるのに、64bit用ODBCではデータベースと接続することができませんでした。

上長に確認したところ、32bit用を使うのが正しいということでしたので、その後、作業自体は問題なく完了したのですが、結局ODBCが2種類ある理由、また、32bit用でないと動かない理由が分からないでいます。

予想

ODBCはプログラムからデータベースに接続するのを助ける仕組み――インターフェースであるという認識しています。

それはつまり、プログラムからODBCに向かって「○○○という処理をデータベースに実行させてたいから、上手いことやっといて」と命令し、ODBCは受け取った命令をデータベースに理解できるよう変換している……といったイメージを持っています。

そうなると、ODBCが32bit用と64bit用に分かれているのは、プログラムからODBCに対して同じ命令を送ったとしても、命令の内容――内部的なデータに違いがあるのではないかと考えています。

例えば……

SQL

1SELECT 2 * 3FROM 4 table_1 5;

……というクエリを実行したいとき、32bitアプリからODBCに対して命令を発するとデータ的には「AAccEEgg」として送信されます。対して、64bitアプリから命令したときは内部的には「bbDDffHH」といった具合に変換されて送られるのではないかと考えています。

そのため受け取ったODBC側では命令を正常に読み解けない――言うなれば文字化けのような現象が起きてしまうので、32bit用64bit用とでODBCが分かれているのではないかな、と予想しています。

質問事項

改めまして、ODBCに32bit用・64bit用がそれぞれ存在するのは何故なのか、1種類に絞ることはできなかったのか、1種類に絞ることは可能だが利便性の観点からわざと分けているのか、といったことをお聞きしたいです。

また、「そもそもODBCに対する理解が間違っている」や「32bit/64bitの違いが分かっていない」等の上記質問とは直接的に関係のない点についてもご指摘頂けますと、勉強する際の取っ掛かりになりますので、何かありましたら、ご回答に含めて頂けると幸いです。

以上、長くなりましたが、ご回答のほど、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2020/03/12 02:08

技術的な話じゃないのでここに書きます。 > 1種類に絞ることはできなかったのか ピュア.NETで書くか.NETでラッパを作ればできないことはないけど、 そんなリソースがないから作ってないのでしょう。
AGadget

2020/03/12 09:22

ご回答ありがとうございます! > ピュア.NETで書くか.NETでラッパを作ればできないことはないけど、そんなリソースがないから作ってないのでしょう。 なるほど。 「既に32bit用/64bit用と分けて開発・使用する体制ができているのに、わざわざ1つに統合するだけのメリットがない(コスパが悪い?)」ということですね。 ご回答ありがとうございました!
guest

回答3

0

アプリが 32/64-bit のどちらで動くかによって、それに合わせて ODBC の 32/64-bit も同じにする必要があるからです。

ややこしいのは、アプリのコンパイルオプションが「Any CPU」「Any CPU 32-bit 優先」「x64」「x86」と 4 種類あって、それらが 64-bit OS 上でどう動くかです。順に 64, 32, 64, 32-bit で動くのですが、ODBC の 32/64-bit はそれに合わせる必要があります。

質問者さんのケースでは 32-bit OS が対象とのことですので、アプリは x86 でコンパイルしてあったのではないですか? そうだとするとアプリは必ず 32-bit で動く (ちなみに、64-bit OS でも WOW64 上で 32-bit で動く) ので、ODBC も 32-bit 版でなければなりません。

【追記】

Visual Studio は 32-bit しかありませんので、Visual Studio をドライバ経由でデータベースに接続してウィザードを使った開発を行う場合は要注意です。ドライバに 32/64-bit 版の両方があって、同じ PC に共存できない場合、開発マシンには 32-bit 版のドライバをインストールせざるを得ないということになります。

投稿2020/03/11 23:49

編集2020/03/12 00:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2020/03/12 09:02

ご回答ありがとうございます! > ややこしいのは、アプリのコンパイルオプションが「Any CPU」「Any CPU 32-bit 優先」「x64」「x86」と 4 種類あって、それらが 64-bit OS 上でどう動くかです。順に 64, 32, 64, 32-bit で動くのですが、ODBC の 32/64-bit はそれに合わせる必要があります。 AnyCPUは初めて聞きました。 ちょっと調べてみたのですが何だかややこしい挙動を起こしそうな設定だなぁという印象でした。 また、後ほど、しっかり調べてみようと思います! > Visual Studio は 32-bit しかありませんので、Visual Studio をドライバ経由でデータベースに接続してウィザードを使った開発を行う場合は要注意です。ドライバに 32/64-bit 版の両方があって、同じ PC に共存できない場合、開発マシンには 32-bit 版のドライバをインストールせざるを得ないということになります。 えっ、そうなんですか!? Visual Studioは趣味でちょっとだけ触ったことがあるのですが、いや、こちらも知らないことでした。 勉強になりました! ご回答ありがとうございました!
退会済みユーザー

退会済みユーザー

2020/03/12 09:23 編集

失礼ながら何も理解されてないような気がするのですが・・・ 質問の、 > ODBCに32bit用・64bit用が、それぞれ存在する理由 は、回答に書きました通り、アプリが 32/64-bit のどちらで動くかによって、それに合わせて ODBC の 32/64-bit も同じにする必要があるからですが、それ理解してないでしょ? 他の回答者の方の回答に対するあなたのコメントに、 >このとき上長やお客様から「何故、その状況で32bit用ODBCを使ったのですか?」と聞かれたときに「使用するアプリケーションが32bitだからです」という返答よりも、もう1歩進んだ回答がしたかったので質問させて頂きました。 とありますが、それに対しては、アプリが 32/64-bit のどちらで動くかによって、それに合わせて ODBC の 32/64-bit も同じにする必要があるから以上の回答はないと思うのですが? もう一つ言うことがあるとすれば、違うとアプリが例外をスローしてクラッシュするからぐらいでしょうか。
AGadget

2020/03/12 09:45

さらなるご回答ありがとうございます! > とありますが、それに対しては、アプリが 32/64-bit のどちらで動くかによって、それに合わせて ODBC の 32/64-bit も同じにする必要があるから以上の回答はないと思うのですが? すみません! ややこしい(?)話になるのですが、私の思考の流れを説明させて頂きますと―― まず前提として私は「アプリとdllのbit数が同じでないと動かないこと」「ODBCドライバーがdllであること」の2点を今日まで知りませんでした。 そのような状況で、質問文にありましたように業務アプリのセットアップ作業に臨み、ODBCに32bit/64bitと2種類あること、理屈は不明だがアプリのbit数とODBCのbit数を合わせないと動かないこと、を「経験則として」理解しました。 ただ、これから先も業務に臨むにおいて「32bitアプリからデータベースに接続するには32bitのODBCを使わなければならない。何故ならばアプリとODBCのbit数は合わせないといけないからだ」というトートロジーな認識では、今後の業務において、どこかで躓いてしまうのではないか、その先に何か重要な事柄があるのではないか、と気になり質問させて頂いた次第です。
guest

0

ベストアンサー

ODBC はデータベースの差異をある程度埋めるための仕組みですが、この差異を埋めるコードを書くのはマイクロソフトではなくデータベースのメーカーです。
すなわち、ハードウェアのメーカーがそのハードを OS が統一的に扱うためのドライバーを提供するように、データベースのメーカーはそのデータベースを ODBC 対応ソフトが統一的に扱うためのドライバーを提供します。

これを ODBC ドライバーと言います。

ODBC ドライバーを書くためには、その規格に従って書かなければなりませんが、これが 32bit と 64bit で違います。
つまり、32bit と 64bit の違いとは、単なる扱えるビット数の違いではなく、ドライバーの規格のバージョンの違いなのです。
どのように違うか、詳しくは次を参照してください。

ODBC 64 ビットの情報

そして、ドライバーは dll で提供されます。dll は原則的に 64bit と 32bit が同一プロセスに混在できないので、64bit アプリからは 64bit ドライバーを、32bit アプリからは 32bit ドライバーしか使えません。

質問者さんが 32bit を使わなくてはならなかったのは、その業務アプリが 32bit だからです。

このように、32bit の規格が元々存在し、64bit アプリに最適化された新しい規格が 64bit ODBC として存在するということです。

そして二つのドライバーのパフォーマンスの違いですが、これはメーカーによるとしか言えません。理論的には 64bit の方がパフォーマンスが良くなるはずですが、64bit のドライバーが 32bit ドライバーのブリッジとして実装された場合、かえってパフォーマンスが落ちる可能性もあります。

投稿2020/03/12 01:36

Zuishin

総合スコア28662

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2020/03/12 09:18

ご回答ありがとうございます! > つまり、32bit と 64bit の違いとは、単なる扱えるビット数の違いではなく、ドライバーの規格のバージョンの違いなのです。 リンク先の記事拝読させて頂きました。 まだ、全然読み解けていないのですが「32bitと64bitとではドライバーの作り方が違うから注意してね」ということを伝えたいのだな、ということが分かりました。 また、後ほど読んでいこうと思います。 > そして、ドライバーは dll で提供されます。dll は原則的に 64bit と 32bit が同一プロセスに混在できないので、64bit アプリからは 64bit ドライバーを、32bit アプリからは 32bit ドライバーしか使えません。 大変お恥ずかしながら、ドライバーがdllとして提供されていることを知りませんでした。 おかげさまで何故アプリケーションのbit数と、ODBCドライバーのbit数を合わせなければならないのかが分かりました! > そして二つのドライバーのパフォーマンスの違いですが、これはメーカーによるとしか言えません。理論的には 64bit の方がパフォーマンスが良くなるはずですが、64bit のドライバーが 32bit ドライバーのブリッジとして実装された場合、かえってパフォーマンスが落ちる可能性もあります。 へー、そうなんですね。 漠然と64bitのほうが優れているものだと思い込んでいましたが作りに因るのですね。 ご回答ありがとうございました!
guest

0

お使いのOSは32bit or 64bit ?

質問を書く手間でググった方が解決が早そうですが、
64ビットWindowsには、なぜ32ビットと64ビットのODBCが存在するのか?
Microsoft SQL Server の 32bit版 と 64bit版は共存可能

投稿2020/03/11 21:39

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2020/03/12 08:48

ご回答ありがとうございます! > お使いのOSは32bit or 64bit ? それは私のPCのことでしょうか? それでしたらWindows10 Home 64bitを使用しております。 質問文に記載させて頂きました業務で使用したのはWindows7 32bitとWindows10 64bitです。 > 質問を書く手間でググった方が解決が早そうですが、 リンク先の記事拝読させて頂きました。 実行モジュールが64bitで、GUIが32bitのときは両方に対応したODBCが必要であることなど知らないことが多くあり、非常に勉強になりました! ただ、すみません、これは私の質問文の書き方が悪かったのですが――本当に知りたかったのはODBCが32bit/64bit用と分かれていることの技術的な解説、と言いますか、理由と言いますか……。 例えば、Windows10 64bitを載せたPCに、32bitアプリケーションをセットアップした場合、ODBCは32bitのものを使用することになるかと思います。 このとき上長やお客様から「何故、その状況で32bit用ODBCを使ったのですか?」と聞かれたときに「使用するアプリケーションが32bitだからです」という返答よりも、もう1歩進んだ回答がしたかったので質問させて頂きました。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問