- PR -

ASP.NET から Oracle 10g へ OLEDB接続で予期しないエラー

投稿者投稿内容
Maverick
会議室デビュー日: 2004/12/28
投稿数: 11
投稿日時: 2004-12-28 13:21
お世話になります。

今までASP.NETからSQLServer2000に接続するWebアプリを開発していましたが、
諸般の事情によりDBをOracle10gに移行することになりました。

OLEDBを使用してOracleに接続しようとしたところ、ご多分に漏れず、
「System.Data.OleDb.OleDbException: エラー情報 : REGDB_E_CLASSNOTREG(0x80040154) がありません。・・・プロバイダはローカルのコンピュータに登録されていません。」
となり、皆さんの投稿を参考にORACLE_HOMEのフォルダセキュリティに
IUSER_xxxとASPNETを追加しましたが、予期しないエラーとなってしまいます。

「予期しないエラーです : E_FAIL(0x80004005)」

上記エラーとなった後、再度接続しようとすると以降は全てメッセージがデタラメに化けて表示されます。文字化けはWWWサービスを再起動すると解消されますが、Oracleに接続できないことに変わりありません。

どなたかこのような現象の解決方法をご存知ないでしょうか?

当方の環境は以下の通りです。
<環境>端末A (テスト用DBサーバー)
 Windows XP Pro SP1
 Oracle Database 10g Release 1 (10.1.0.2)
<環境>端末B (Webサーバー兼 開発クライアント)
 Windows XP Pro SP1
 IIS 5.1
 Visual Studio .NET 2003
 .NET Framework 1.1.4322 SP1
 Oracle Database 10g Client Release 1 (10.1.0.2)

ちなみに、SQL*PlusやODBC経由でMSAccessからの接続は出来ています。
またVB.NETによるWindowsアプリからの接続も成功し、
さらにWindows2000サーバーで同じASP.NETを実行してもエラーにはなりません。

どうかよろしくお願いします。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-01-04 06:42
引用:

OLEDBを使用してOracleに接続しようとしたところ、ご多分に漏れず、
「System.Data.OleDb.OleDbException: エラー情報 : REGDB_E_CLASSNOTREG(0x80040154) がありません。・・・プロバイダはローカルのコンピュータに登録されていません。」
となり、皆さんの投稿を参考にORACLE_HOMEのフォルダセキュリティに
IUSER_xxxとASPNETを追加しましたが、予期しないエラーとなってしまいます。


OLEDBの代わりにOracleさんお勧めのODP.NETを利用されてはどうでしょうか。Oracle 10g+ODP.NETの環境でWebアプリを開発していますが、問題なく動作しています。

http://www.atmarkit.co.jp/fdb/rensai/odpdotnet02/odpdotnet02_1.html

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
Maverick
会議室デビュー日: 2004/12/28
投稿数: 11
投稿日時: 2005-01-06 09:58
Accessさん 返事が遅くなって申し訳ありません。
本日、新年初出社しました。

引用:
OLEDBの代わりにOracleさんお勧めのODP.NETを利用されてはどうでしょうか。Oracle 10g+ODP.NETの環境でWebアプリを開発していますが、問題なく動作しています。


OleDBではどうしようもないのでしょうか?

今回Oracleに移行されるDBとSQLServerのまま残るDBと両方に接続するプログラムがあって、独自に作成した接続クラスを使用しています。
今までSQLServer接続にはSqlClientを使用していたのですが、プログラムを変換するにあたって、こっちのDBの時はOracleClient、あっちのDBにはSqlClientと判断しながら変換するのが大変(既に140近くの機能を開発済みで、プログラム数にすると400を超えてしまいますので...)なので、どのDBに接続するのにもOleDBを使用しようかと考えています。

ODPはまだテストしていませんが、問題が解決しなかった場合の押さえとして、これからテストしてみようと思います。
Maverick
会議室デビュー日: 2004/12/28
投稿数: 11
投稿日時: 2005-01-06 15:01
/_/_/_/_/_/_/_/_/
/_/ 自己レス /_/_/
/_/_/_/_/_/_/_/_/

テスト経過です。

・DELLのノート(INSPIRON)
・TOSHIBAのノート(EX/522CME)
では、Oracleに接続できました。

・IBMのノート(THINKPAD R51)
・IBMのノート(THINKPAD T42)
ですと「予期しないエラー」になるようです。

ちなみに上記4つの端末のOSは全てWin XPです。

・IBMのデスクトトップ(PC300)
では、うまくいっているのですが、OSがWin2000 Serverです。

どこかのサイトで「THINKPADだとエラー」みたいなことを
見たような気がするのですが、そんなことってあるのでしょうか?
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-01-11 06:39
引用:

OleDBではどうしようもないのでしょうか?


OleDBでも可能ですが、ODP.NETはOracleにネイティブに対応していますのでかなり高速化されています。


引用:

今回Oracleに移行されるDBとSQLServerのまま残るDBと両方に接続するプログラムがあって、独自に作成した接続クラスを使用しています。
今までSQLServer接続にはSqlClientを使用していたのですが、プログラムを変換するにあたって、こっちのDBの時はOracleClient、あっちのDBにはSqlClientと判断しながら変換するのが大変(既に140近くの機能を開発済みで、プログラム数にすると400を超えてしまいますので...)なので、どのDBに接続するのにもOleDBを使用しようかと考えています。


バックエンドDBを移行するとき、単純にSqlConnectionをOracleConnectionに変換すれば動作するとはかぎりません。SQL文の変更、SQL ServerのTransact-SQLをOracleのPL/SQLに書き換えるなどの作業が必要になります。

Webアプリケーションを開発するときには、すくなくともプレゼンテーション層、データアクセス層の2階層に分離すべきではないでしょうか。この場合、データアクセス層を置換するだけで、WebのバックエンドDBをMySQL->SQL Server->Oracleのように自由に選択できます。


_________________
ASP.NETサンプル集(Web Matrix版)

[ メッセージ編集済み 編集者: Access 編集日時 2005-01-11 06:40 ]
Maverick
会議室デビュー日: 2004/12/28
投稿数: 11
投稿日時: 2005-01-11 13:16
テスト経過2です。

ODPでもダメでした。

<--- エラー内容 --->

オブジェクト参照がオブジェクト インスタンスに設定されていません。
説明 : 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

ソース エラー:
現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。

スタック トレース:
[NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。]
Oracle.DataAccess.Client.OracleException.get_Message() +24
WadaWebOdp.ConnectTest1.Button1_Click(Object sender, EventArgs e) +140
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain() +1292
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2005-01-11 14:46
引用:

皆さんの投稿を参考にORACLE_HOMEのフォルダセキュリティに
IUSER_xxxとASPNETを追加しましたが、予期しないエラーとなってしまいます。



配下のフォルダ・ファイルにも設定を継承しましたか?

# たしか、OCI.DLLは継承していなかったような...

SysinternalsのFilemonでファイルアクセスエラーが
発生しているか確認していただけませんか?


[ メッセージ編集済み 編集者: なな 編集日時 2005-01-11 14:56 ]
Maverick
会議室デビュー日: 2004/12/28
投稿数: 11
投稿日時: 2005-01-12 15:16
ななさん こんにちわ。

引用:

配下のフォルダ・ファイルにも設定を継承しましたか?

# たしか、OCI.DLLは継承していなかったような...


セキュリティを追加する画面の詳細設定で「適用先」が「このフォルダ、サブフォルダおよびファイル」となっているので継承されているかと思います。
BINフォルダにあるOCI.DLLには、権限が設定されていました。

引用:

SysinternalsのFilemonでファイルアクセスエラーが
発生しているか確認していただけませんか?


教えていただいたFilemonというソフトを起動してエラーになるプログラムを実行してみましたが、どのようになればファイルアクセスエラーなのか私には判断できませんでした。(英語の読解能力が乏しいので...)
申し訳有りませんが、Filemonでどのように調査すれば良いか、教えていただけませんか?

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