VB.NETにおけるOracle接続方法とは?

このQ&Aのポイント
  • VB.NET 2010でOracle11gに接続するプログラムを作成する際の接続方法について調査しました。
  • Oracle Clientの32bit版と64bit版の違いや、接続文字列の設定方法に関して詳しく説明しています。
  • 現状では32bitと64bitのOracle Clientが両方必要な状況ですが、最適な解決策について考えています。
回答を見る
  • ベストアンサー

VB.NET Oracle接続 32、64bit

VB.NET 2010でOracle11gに接続するプログラムを作っていますが、 接続方法がいまいちわからずに困っています。 プログラムを動かすサーバーはWindows Server 2008 R2の64bitだったので、 Oracle Clientも合わせた方がいいのかなと思い、64bit版をインストールしました。 ASP.NETのWEBアプリでは以下の接続文字列を用いてADO接続できました。 パラメータ値は例です。 (Web.configに記述) <connectionStrings> <add name="oracle" connectionString="Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1" providerName="System.Data.OleDb" /> </connectionStrings> 次に、コンソールプログラムを作成し、同じサーバーで上記と同様の接続文字列で 接続しようとしましたが、エラーとなり接続できませんでした。 いろいろ記述を変えても接続できませんでしたが、最終的にOracle Clientの 32bit版を64bit版と違うフォルダにインストールし、以下の接続文字列で接続 できました。(INIファイルに記載) ConnectionString=Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1 この状態でWEBアプリの方は何を使っているのかと思い、64bit版のインストールフォルダを リネームしたところ、WEBアプリの方は接続できなくなりました。 現状では32bitと64bitのOracle Clientが両方必要な状況ですが、本来ならどちらかだけで すむと思います。 32bitと64bitで接続文字列が変わるという情報は得られませんでした。 何がまずいのでしょうか? 最初から32bit版をインストールすれば良かったのでしょうか。

  • goram
  • お礼率76% (10/13)
  • Oracle
  • 回答数2
  • ありがとう数18

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

先ず、大前提として32bitプログラムのプロセス空間には 32bitのDLLしかロードできません。同様に64bitのそれは 64bitのDLLしかロードできません。 OLEの実装にはDLL型とEXE型があり、前者は同一の プロセス空間にあるため、32bitプログラムからは32bitの、 64bitプログラムからは64bitのDLL実装でなければ動き ません。 OLEをインスタンス化する時に使うクラス名はレジストリに 登録されており、最終的に処理を担うDLLかEXEのパスに 行き着くようになっています。互換性を保つため、クラス名は 以前から変わっていませんし、32/64の区別もありません。 OracleのOLEはDLL型実装なので、32bitか64bitのどちらか 一方しか処理できません。 ここでは”OraOLEDB.Oracle”が示す最終パスは後から インストールした方に切り替えられているはずです。 サーバが64bitなら、64bit版で統一すべきでしょう。 32bit版をアンインストールして、もう一度、64bit版を インストールした方がよいでしょう。 そして、コンソールプログラムの方を64bit版でリビルドする ことを薦めます。Visual Studio 2012ならどちらでもビルド できます。

goram
質問者

お礼

ご指摘の通りでした。 32bit版をアンインストール(Deinstall.batを使用)すると、コンソールアプリだけでなく、 WEBアプリも接続できなくなりました。 64bit版も同様にアンインストールし、再度インストールしました。 コンソールアプリケーションをサーバーのVisualStudioで64bitでビルドし 接続できました。 WEBアプリでも接続できました。 現在は64bit版だけで動く状態になりました。 ありがとうございました。

goram
質問者

補足

基礎からの詳しいご回答ありがとうございます。 非常に勉強になります。 まず64bitでビルドする方法を改めて調べて、それができたら 64bitのOracle Clientの状態だけにして試してみたいと思います。

その他の回答 (1)

回答No.1

.NETのコンソールプログラムは64bitビルドです?

goram
質問者

お礼

もういちど64bitでビルドするよう調べてみます。 ありがとうございます。

goram
質問者

補足

ご回答ありがとうございます。 開発機がWin7の32bitなので、ビルドも32bitです。 それも思い当たって、サーバのVisualStudioで一応64bitビルドをしてみたつもりでしたが、 改善できませんでした。

関連するQ&A

  • VB.NET ORA-12170

    http://okwave.jp/qa/q8420174.html ↑ VB.NETで作成したアプリでこちらの質問で無事解決し、違う環境で試したところORA-12170の タイムアウトエラーが発生しました。 SQL*Plusからの接続は問題ありません。 わからないのはWEBアプリの方は接続できるのに、コンソールアプリの方がこのエラーになってしまいます。 どちらのアプリの接続文字列も同じData Sourceを指定してます。 「db1」がTNSNAMES.ORAに記述している識別子になります。 WEBアプリ側 (Web.configに記述) <connectionStrings> <add name="oracle" connectionString="Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1" providerName="System.Data.OleDb" /> </connectionStrings> コンソールアプリ側 (INIファイルに記述) ConnectionString=Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1 一般的にはDBサーバにネットワークがつながってないなど単純な理由のようですが、 WEBアプリは接続できるので、そういうことはあり得ないと思います。 コンソールアプリの問題と思うのですが、どんな原因が考えられるでしょうか?

  • Oracle11gの接続について大至急教えて下さい

    WindowsServer2008R2(64bit)にOracle11g(64bit)のデータベースを構築し、 同機上のアプリケーションからアクセスしようとしています。 (具体的にはPro*C/C++を使ってプリコンパイルしているCで作成したDLLやEXEです。) これらのアプリケーションは元々Oracle10gの機能を用いて作成してあった物を流用している為、 Oracle11g(32bit)のクライアントがないと動作しない様です。 従って、2008Serverには32bit版の11gクライアントもインストールしました。 (Oracle11g(64bit)のメディアパック内の32bitクライアントディスクからインストール) (手順) 1:Oracle11g(64bit)ホストのインストール&データベースの構築 2:Oracle11g(32bit)クライアントのインストール 3:データベースに表領域とユーザを作成 4:クライアントでローカル・ネットサービス名の作成 で、ここまではできたのですが、 11g(32bit)クライアント側のSQL*Plusを起動して作成したユーザでログインしようとすると ORA-12560:TNS:プロトコル・アダプタ・エラーが発生しましたとなってしまいます。 ただ、コマンドプロンプトから「ユーザ/パスワード@接続文字列」を直接指定して SQL*Plusを起動するときちんと接続できます。 何か順番や方法を間違えているのでしょうか? ちょっと急いでいてなるべく早く解決させたいので、 間違い・チェックすべき事の漏れなど 直接的な解決策でない事でもかまいませんのでご教授下さい。

  • ASP.Net Web.Config 接続文字列が

    お世話になります。 Web.Config から 接続文字列を取得しようと下記のようなコードをサイトから学んだのですが、 Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionStringSQL").ConnectionString Dim conn As SqlConnection = New SqlConnection(conStr) これを実行すると、エラーになってしまいます。 "Provider=SQLOLEDB;Data Source=SERVER01;Integrated Security=SSPI;Initial Catalog=TESTSQL" 上記が接続文字列なのですが、Provider=SQLOLEDB この部分を取り除き、 "Data Source=SERVER01;Integrated Security=SSPI;Initial Catalog=TESTSQL" このように直接、接続文字列を上記のようにすると、問題なく動くのですが、何かおかしいと思うのですが、わたくしの方にミスや足りない個所があれば、是非、ご指摘いただければと存じます。 Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionStringSQL").ConnectionString Dim conn As SqlConnection = New SqlConnection(conStr) 上記のように記述して接続文字列を取得設定できればスマートだと思うのですが・・・・ よろしくお願いいたします。

  • VBからOracleに接続できない

    Visual BasicからOracleに接続すると、下記のエラーになり接続できません。 型 'System.TypeInitializationException' の初回例外が DBConnectSample.exe で発生しました 追加情報:'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしました。 接続部分のソースコードは以下になります。(★がエラーになるコード) -----ここから----- Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types 'Connectionオブジェクトの生成 Dim cnn As New OracleConnection ★ 'Oracleへのコネクションの確立 cnn.ConnectionString = "User Id=<user>; Password=<pass>; Data Source=ora11g" 'Oracleへの接続 cnn.Open() -----ここまで----- あと、他にやった事といえば、これぐらいです。 ・[参照の追加]でOracle.DataAccess 4.112.4.0を追加 ・[ビルド]はOSに合わせてx64を選択 色々ググってみても何が足りないのか、何が間違っているのか見当がつきません。

  • oracle11g(64bit)に接続

    クライアント側 oracle_Client10.2.3 windows2003 サーバ側 oracle11g(64bit)Windows7(64bit) で接続したいのですが、tnsnameのhostをサーバ側のIPに変更しました。 tnspingでTNS_12542のエラーがでます。 リスナーの登録ができていないと思います。 仕方をおしてください。

  • office365でOracle12Cに接続

    Windows10,oracle12c ディスクトップパソコンのソフトをoffice2016(32bit)→office365(64bit)に変更しました。 excelからoracle12cへ接続してデータを取得するマクロでエラーになります。 実行時エラー'3706' プロバイダーが見つかりません。正しくインストールされていない可能性があります。 とのポップアップエラーが発生します。 cn.Open "Provider=OraOLEDB.Oracle;Data Source='" & network & "';User ID=ID;Password=PW;", "ID", "PW" 32bitから64bitのofficeに変更した場合、上記マクロの内容はどの様に記述に変更したらよいのでしょうか?

  • vbからoracleへの接続

    vbからoracleへの接続について教えて下さい。 ORACLEデータベースにoo4oを使って接続をしているのですが、Oracleクライアントをインストール済みのPCでは何ら問題なく接続できます。 OracleクライアントをインストールしていないPCではエラーメッセージがでてしまいます。 処理はこんな感じです... Public ssOra As Object       Public dbOra As OraDatabase Public dynOra As OraDynaset Set ssOra = CreateObject("OracleInProcServer.XOraSession") Set dbOra = ssOra.OpenDatabase("HRH", "HRH00/HRH00", 0&) Set dynOra = dbOra.DbCreateDynaset("select * from 消耗品_注文履歴", 0&) Set ssOra... のところでエラーとなってしまいます。エラー内容は ********実行時エラー'429'***************************** ActiveXコンポーネントはオブジェクトを作成できません ************************************************** activeX,oracle関連のDLLファイルは参照設定に登録しています。 これを解決するためにはOracleクライアントをインストールするしかないのでしょうか? また、インストールしたらエラーは本当になくなるのでしょうか? 皆様宜しくお願いします。 ちなみにクライアントPCはOS:WIN95 oracleバージョン8.1.7です

  • OLEDB.NETで接続できない

    OS:XP 開発:VB 2008 .NET Framework 2.0 MDAC2.5 DB:Oracle9i(サーバー)、Oracle8i(クライアント) 以下のようにOracle Provider for OLEDBで接続を試みるもエラーに なります。 Dim con As New OleDbConnection() con.ConnectionString = "Provider=OraOLEDB.Oracle;User Id=scott;" & _ "Password=tiger;Data Source=Oracle;OLEDB.NET=True;" con.Open 結果は、「'OraOLEDB.Oracle'プロバイダーはローカルのコンピュータ に登録されていません。」のエラーになります。 環境変数のPATHに、[OralceHome]\binは定義されていますし、Oracle Provider for OLEDB はインストールされているのを確認しました。 因みにですが、ODP.NETでの接続ができるのですがよく分からない 状態です。あまり.NETやOracleの知識がないので詳しく伝えれないの ですが、デバッグ実行時はエラーになるのに、EXE単体で実行した場合 には問題なく接続できている状態です。ODP.NETは、クライアントが Oracle9R2からだったら使えるようなことがどこかに書いてあったので このようにデバッグ時とEXE単体実行時で異なるのかと思います。 デバッグ時には、接続オープンエラーになります。 そのような経緯でOLEDB.NETでは、正常に動作するであろうと思い修正 に踏み切ったのですが、うまくいきません。.NET側での参照設定などの 設定がいけないのでしょうか?それとも他に原因があるのでしょうか? かなり悩んでいるので原因と対処方法の分かる方がおられましたら、 ご教授よろしくお願い致します。

  • Oracleストアドの互換性について

    Oracleのストアドについて質問です。 32bit版ではコンパイルが通るのに、64bit版ではコンパイルが通りません。 Ora-00918列定義が未確定がでます。 列名ではなく、列番号で指定するとコンパイルが通るようになります。 ただし、きちんと値をとってきていない。 ・Oracle10.2.0.3 x32(windowsServer2003x32)でOK。 ・Oracle10.2.0.5 x64(windowsServer2008x64)ではコンパイルエラーになります。(Ora-00918) 列定義が未確定がでます。 同じくOracle11.0.1x64(windowsServer2008x64)でも同じエラーが出ます。 文字コードはS-JISです。 Oracle10.2.0.5にアップのパッチを当てています。 64bitでなにかあるのでしょうか?

  • Oracleに接続できません

    http://oshiete1.goo.ne.jp/qa4731410.htmlでの質問を踏まえた上で、悩んでおります。 PHPにてサーバにあるOracle9iサーバに、 クライアント(Oracle10gクライアントインストール済み)からPHPで接続しに行きたいのですが、 oci_connect関数が上手く機能していないようで、接続できません。 oci_connectの引数には、oci_connect("ユーザ名", "パスワード", "tnsname.oraにある名称") を設定して、接続をしようとしています。 接続エラーを見るため、oci_errorにてエラーをキャッチしているのですが、 そのエラー内容が空っぽ(Falseで返ってくる)のため、何がおかしいのかわからない状況です。 構築環境は以下の通りです。 OS:WindowsXP(SP3) Webサーバ:IIS 使用DB:Oracle9i(クライアントは10g) 珍しい組み合わせのため、あまり情報がない状態です。 PHP、Webサーバの設定は色々なサイトを確認して設定できたつもりなのですが、 どこかしらに不備があるのでしょうか? Apacheであれば、エラーがログに残るようですが、IISにそういった機能はないでしょうか? 何かアドバイス等ありましたらお願いします。

    • 締切済み
    • PHP