- PR -

特定のPCからOracleのテーブルデータを取得できない

投稿者投稿内容
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2008-05-16 15:09
Visual Web Developperを使用してWebアプリを作成しています。

アプリ内でOracle8iへの接続を行うのですが、特定の開発用PCにてOracleのテーブルへの接続ができず、自分なりに調べてみたのですが解決できずご質問させていただきました。

OS:WindowsXP
開発環境:Visual Web Developper2005 Express Edition
開発言語:VB2005
DB:Oracle 8i
追加インストール:Oracle Data Access 10.1.0.4

事象:
@追加インストールに含まれるOracle Net Managerにて、SID等の設定をし接続テストを行ったところ、Net Manager上での接続テストは成功しました。

Aまた、Windowsのデータソースを設定し、MS AccessからODBC接続でリンクテーブルを作成することができ、テーブルデータの参照も可能です。

Bところが、ASP.NETからプログラムにてテーブルを参照しようとすると、
「ORA-0942:表またはビューが存在しません」
というエラーメッセージが表示され、データを取得することができません。
コードは以下のとおりです。

コード:
    '// Try-Catchは省略
    Dim conn As New OracleConnection
    conn.ConnectionString = "Data Source=DSName;User ID=id;Password=pass;Unicode=True"
    Dim cmd As New OracleCommand
    cmd.CommandText = "SELECT * FROM tblTable"
    cmd.Connection = conn

    conn.Open()
    Dim dr As OracleDataReader = cmd.ExecuteReader '←ここでエラー



CVWDのデータベースエクスプローラ上でこのDBへのデータ接続を作成すると、データ接続は開くことができるが中のテーブルフォルダの中にテーブル情報が1つも表示されません。

上記の現象は、同じ設定をした他のPCでは発現せずテーブルデータの取得が可能です。
ウェブ上で検索すると上記のエラーはテーブルの参照権限がないからであるということなのですが、同じIDとパスワードをConnectionStringに設定していても接続元PCによって制御されるものなのでしょうか。
他のPCで問題なく動くのにあるPCでのみ接続ができないということで、VWDかOSの設定に問題があるのかと思うのですが、どうしても解決方法が見つけることができずにいます。

どなたかアドバイスをいただけないでしょうか。

よろしくお願いいたします。
ほったて
ベテラン
会議室デビュー日: 2007/11/10
投稿数: 68
投稿日時: 2008-05-16 18:20
Oracle Data Access 10.1.0.4はODP.NETのことですよね?

対応しているOracleのバージョンは9.2.0以降ですな。
開発環境もVS2005は対応してなかったような気がする...。
(せめて接続先のバージョンだけでもなんとかなりませんかね)
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2008-05-16 18:21
少し原因の切り分けができましたのでご報告します。

問題PCと正常PCの設定をいろいろ変更したみたところ、
どうやらORACLEの構成ファイルであるTNSNAMES.ORAを参照する場所が違うために起きているようです。

正常PCではOracle Net Managerを起動すると
C:/oracle/product/10.1.0/Client_1/network/ADMIN
ディレクトリにある構成ファイルを参照しています。
Webで調べてもこの場所が正しいようです。

ところが問題のPCでは、ネットワーク越しのまったく関係のないPCに設置されている構成ファイルを参照していました。
その構成ファイルには複数のサービスネーミングが設定されており、今回接続したいDBのサービスネームが既に存在しその接続先DBはこちらが接続したいDBとは異なるものでした。
その構成ファイルにはこちらの接続したいDBが別のサービスネームで登録されていたので、ConnectionStringのDataSourceの値をそこで登録されていたサービスネームに変更してみたところ、データの取得ができました。
また、接続先のネットワークドライブを切断したところ、そのサービスネームを使用したConnectionStringでは接続できなくなりました。
これで「DBには接続できるがテーブルデータを取得できない」理由がわかりました。

これで次の解決すべき問題は、
・なぜまったく関係のないネットワーク越しの設定ファイルを見に行くのか。
・通常の場所(C:/oracle/product/10.1.0/Client_1/network/ADMIN)を参照させるにはどうしたらよいか。
になりました。

ここにきて、.NETではなくOracle周りの問題となりましたので、この掲示板で質問させていただく分野ではなくなってしまったかと思いますが、解決できたらご報告させていただこうと思います。
ほったて
ベテラン
会議室デビュー日: 2007/11/10
投稿数: 68
投稿日時: 2008-05-16 22:31
引用:

Chikotaさんの書き込み (2008-05-16 18:21) より:

問題PCと正常PCの設定をいろいろ変更したみたところ、
どうやらORACLEの構成ファイルであるTNSNAMES.ORAを参照する場所が違うために起きているようです。

(略)

ところが問題のPCでは、ネットワーク越しのまったく関係のないPCに設置されている構成ファイルを参照していました。



...?

通常、よおっぽど変なことをしない限り、ローカルの%ORACLE_HOME%\network\admin配下のtnsnames.oraを参照します(sqlnet.oraにtnsnames.oraを参照するように記述された状態で製品がインストールされるのがほとんどかと)。

逆に、製品をインストールした後何をしました?
ネットワーク先の全く関係ない云々というのはどうやって確認されたんですか?
レジストリにLOCALでも追加しました?


[ メッセージ編集済み 編集者: ほったて 編集日時 2008-05-16 22:35 ]
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2008-05-17 01:39
引用:

ほったてさんの書き込み (2008-05-16 18:20) より:
Oracle Data Access 10.1.0.4はODP.NETのことですよね?


Oracle 10g ODAC 10.1.0.4.0 で、ODP.NETを含むOracleに接続する以下のコンポーネント群がインストールされます。

Oracle Data Provider for .NET 10.1.0.4.0
Oracle ODBC Driver 10.1.0.3.1
Oracle Provider for OLE DB 10.1.0.4.0
Oracle Objects for OLE 10.1.0.5.2
Oracle Services for Microsoft Transaction Server 10.1.0.4.0

また、これとともに、構成ファイルをGUIで編集できるNet Managerもインストールされます。

引用:

対応しているOracleのバージョンは9.2.0以降ですな。


接続可能なOracle DatabaseはOracle8i R8.1.7.4以降とのことです。
http://www.oracle.com/technology/global/jp/software/tech/windows/odpnet/sysreq/10104.html

他の開発PCからは接続できるので、原因はまた違うような気がします。

引き続き調べてみます。
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2008-05-17 01:43
引用:

ほったてさんの書き込み (2008-05-16 22:31) より:

通常、よおっぽど変なことをしない限り、ローカルの%ORACLE_HOME%networkadmin配下のtnsnames.oraを参照します(sqlnet.oraにtnsnames.oraを参照するように記述された状態で製品がインストールされるのがほとんどかと)。

逆に、製品をインストールした後何をしました?


インストーラのデフォルト設定に忠実にインストールしました。
製品をインストールした直後にNet Managerを起動したのですが、開かれた設定ファイルは既にネットワーク越しのtnsnames.oraでした。
(便宜上このファイルをZ:/tnsnames.oraとします)

初回のインストールは別の人がしているので実際に見てはいないのですが、特に変わったことはしていないとのことです。

引用:

ネットワーク先の全く関係ない云々というのはどうやって確認されたんですか?


設定ファイルをGUIで編集するNet Managerを起動すると、参照している設定ファイルのパスが画面の上部に表示されます。
正常PCではそこに
C:/oracle/product/10.1.0/Client_1/network/ADMIN
と表示され、
異常PCでは
Z:/
と表示されます。

また、Zのネットワークドライブを切断してNet Managerを起動すると、設定ファイルのあるディレクトリを選択するダイアログが表示されます。
ここでC:/・・・/ADMINを選択すると通常の設定画面が開きますが、設定は何もされていない状態です。(C:/・・・/ADMINにtnsnames.oraがないため)
さらにそこでサービスネームを登録し保存をするとC:/…/ADMINフォルダにtnsnames.oraが作成されますが、NetManagerを起動したときにはC:/…/ADMINをディレクトリ選択画面から指定してやらないと表示しません。

そこで
「Net Managerが起動時に読み込む設定ファイルが、ODP.NETで接続する際参照される設定なのではないか」
と思い、2つ前の投稿で記述したようにConnectionStringの書き換え等での実験を行い、
「ネットワーク越しのまったく関係のないPCに設置されている構成ファイルを参照している」
と判断しました。

引用:

レジストリにLOCALでも追加しました?


レジストリはまったくいじっていません。

ODACを再インストールするためにアンインストールする際、インストールディレクトリ(C:/oracle)も削除しているのですが、ODP.NETで接続するときに参照するtsnnames.oraのパスがどこか別の場所に保持されたままになっているのでしょうか。

レジストリも含めてその辺を来週また調べてみようと思います。

以上、よろしくお願いいたします。
ほったて
ベテラン
会議室デビュー日: 2007/11/10
投稿数: 68
投稿日時: 2008-05-18 15:16
引用:

Chikotaさんの書き込み (2008-05-17 01:39) より:

接続可能なOracle DatabaseはOracle8i R8.1.7.4以降とのことです。
http://www.oracle.com/technology/global/jp/software/tech/windows/odpnet/sysreq/10104.html



あらら、これは失礼しました。

で、Net Managerはおいといて、そのおかしなクライアントからtnspingを実行しても参照するのはそのはるか遠くにあるtnsnames.oraなんでしょうかね。
Oracleクライアント製品的にはわざわざ設定しない限りローカルのtnsnames.oraを参照しますが、逆に%ORACLE_HOME%\network\admin配下のファイルは一番優先度が低いので、Windowsならレジストリか環境変数に(そういえば環境変数でも設定できるんだった)設定を書いてしまえば、ローカルに正しい設定があろうと無かろうと指定した先にtnsnames.oraがあればそっちを参照して名前解決して接続してしまいます。

あと、前にLOCALと書きましたがディレクトリパスなんでTNS_ADMINでした。失敬。
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2008-05-19 10:14
なぜネットワーク越しの設定ファイルを参照するのかはわかりませんが、%ORACLE_HOME%/network/adminの設定ファイルを参照させることができましたのでご報告します。

ほったてさんからいただいたアドバイスを元に調べ、以下の記述にたどり着きました。

引用:

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19209-01/sqlnet.htm より:

sqlnet.oraファイルのデフォルトの位置は、UNIXオペレーティング・システムの場合は$ORACLE_HOME/network/adminディレクトリ、Windowsオペレーティング・システムの場合はORACLE_HOME/network/adminディレクトリです。sqlnet.oraは、環境変数TNS_ADMINで指定されているディレクトリに格納することもできます。



tnsnames.oraを参照するように設定しているsqlnet.oraへの参照先を、環境変数TNS_ADMINに指定できるとのことで、問題マシンの環境変数を設定したところ、%ORACLE_HOME%/network/admin配下のtnsnames.oraを参照し、プログラムから対象のOracleに接続してデータを取得することができるようになりました。

冒頭にも書きましたとおり、なぜネットワーク越しの設定ファイルを参照するのかはわかっていないのですが、現象が発生しているのが1台の開発マシンのみで他のマシンでは問題なく動いていますので、気持ち悪いですがとりあえずこれで解決とさせていただきます。

自分だけでは行き詰ってしまっていたところにいろいろとアドバイスをいただき、本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)