2

.NET アプリケーションに x ファイルの問題があります。というか、Win32 と .NET のハイブリッド アプリケーションです。

オラクルと通信しようとすると、死ぬだけです。消えます。空の大きな黒い虚空に行きます。イベント ログ メッセージも例外も何もありません。

代わりに MS SQL Server と対話するようにアプリケーションに要求するだけで、OracleConnection と関連クラスの使用を SqlConnection と関連クラスに置き換える効果があり、期待どおりに動作します。

今日、私たちは突破口を開きました。

何らかの理由で、ある顧客は、すべてのアプリケーション ファイルをデスクトップ上のディレクトリに配置することで、Oracle でも期待どおりに動作することに気付きました。ディレクトリをドライブのルート、または C:\Temp に移動すると、クラッシュが再発しました。

基本的に、デスクトップ上のディレクトリから実行するとアプリケーションが動作し、ルートのディレクトリから実行するとアプリケーションが失敗するという 100% の再現性がありました。

今日、重要な違いは、ディレクトリ名にスペースがあるかどうかであることがわかりました。

したがって、これらのディレクトリは機能します。

C:\Program Files\AppDir\Executable.exe
C:\Temp Lemp\AppDir\Executable.exe
C:\Documents and Settings\someuser\Desktop\AppDir\Executable.exe

一方、これらはそうではありません:

C:\CompanyName\AppDir\Executable.exe
C:\Programfiler\AppDir\Executable.exe      <-- Program Files in norwegian
C:\Temp\AppDir\Executable.exe

これを読んでいる誰かが同様の動作を見て、「ああ、オラクルの華やかなドライバー構成でフロブをいじる必要がある」などのことを望んでいます。

誰?


フォローアップ#1: OK、今 procmon の出力を処理しました。カスケード エラーをトリガーするウィンドウを開こうとするボタンを押したときの両方のファイルです。両方のファイルの上部近くにあり、ずっと下まで追跡します。

ただし、1 つの実行が失敗すると、もう 1 つの実行が続行され、ログ出力の次の数行は次のようになります。

ReadFile C:\oracle\product\10.2.0\db_1\BIN\orageneric10.dll    SUCCESS    Offset: 274 432, Length: 32 768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O
ReadFile C:\oracle\product\10.2.0\db_1\BIN\orageneric10.dll    SUCCESS    Offset: 233 472, Length: 32 768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O

この後、作業実行は引き続き実行され、スレッドが終了してアプリが終了する前に、他の実行が mscorwks.dll ファイルに数回アクセスします。したがって、失敗した実行は上記のファイルに影響しません。


フォローアップ #2: Oracle クライアント ドライバーをアップグレードしようと考えましたが、明らかに 10.2.0.1 が Windows 2003 サーバーおよび XP クライアントで利用可能な最高のバージョンです。


フォローアップ #3:ええと、ブラックボックス ソリューションになってしまいました。基本的に、問題はXPOと Oracle に関連していることがわかりました。XPO には、XPObjectType と呼ばれるシステム テーブルがあり、Oid、TypeName、AssemblyName の 3 つの列があります。私たちが話しているデータベースでOracleがどのように構成されているかにより、列名はOID、TYPENAME、およびASSEMBLYNAMEでした。通常、これは問題にはなりませんが、XPO がスキーマ情報と直接対話し、適切な列名を持つテーブルが存在するかどうかを確認し、XPO は大文字と小文字の違いを処理しないため、不明な列が 3 つある XPObjectType テーブルを認識し、列はありません。それが期待するもののうち。

XPO が現在何をしているのか正確にはわかりませんが、このテーブルを削除して、すべての列名を二重引用符で囲んで正しい大文字と小文字を区別して再作成した場合、問題は発生しません。

フォルダ名のスペースがこれに入る正確な場所はまだわかりませんが、この問題には2つの層がありました。

  1. 短期的な解決策として、アプリケーションがクラッシュするのを防ぎます。
  2. バグの修正、長期的な解決策

現在、ティア 1 は解決されており、ティア 2 はキューに戻され、優先順位が付けられます。いずれにせよ、データ層への大きな変更に直面しているため、少なくともオラクルのすべての顧客がテーブル修正によって実際に問題が解決されることを確認した場合、これは解決する必要がある問題ではない可能性があります.

プロセス モニター (ファイル モニターの兄貴分) は実際には問題を特定できませんでしたが、それを使用して、XPO が構築されたユーザー コードのブレークポイントの後にそれを判断することができたので、Dave Markleによる回答を受け入れます。このテーブルのクエリを実行すると、アプリケーションの終了に関するすべてのエントリがログに記録されるまで I/O は発生しませんでした。そのため、このテーブルが原因であるか、少なくとも何らかの形で問題に影響を与えていると思いました。

この本当の原因にたどり着いたら、投稿を更新します。

4

4 に答える 4

3

これが私がすることです。まず、自分が見ていると思う行動が見られていることをトリプルチェックします。System.IO.Path を使用してパスを連結しないことで、これが逆に起こっていることがわかりますが、あなたが見ているようではありません。ファイルのアクセス許可が適切であることを 3 回確認します。

次に、 MS からFilemonをダウンロードし、プログラムがこれらの問題のある場所に到達したときにファイルシステムで何が起こっているかを観察します。特定のファイル アクティビティを除外して (たとえば、ウイルス対策ファイル アクティビティを削除するなど)、これを行っている間、すべてが少しきれいに見えるようにすることができます。プログラムの成功ケースとエラー ケースの両方について、FileMon を使用してファイル アクセス エラーを探します。これにより、どのファイルがアクセスされ、問題を引き起こしているかがわかります。たとえば、FILE_NOT_FOUND意味のないファイル名にアクセスする際にエラーが表示された場合は、あなたまたはベンダーが何か間違ったことをしており、問題につながる可能性があることを確信できます...

于 2008-10-27T11:54:28.637 に答える
1

おそらく、Oracle への接続を開こうとする単純なアプリケーションで問題を再現できるかどうかを確認する必要があります。そうすれば、問題が OracleConnection または Oracle ドライバーにあり、独自のコードにあることを 100% 確信できます。

于 2008-10-27T14:07:36.540 に答える
0

オラクルのクライアントは正直であると思います。苛立たしい性質で同様の問題がありました。

64 ビット マシンにインストールした場合、アプリケーションが 32 ビットであっても、Oracle に接続するとクライアントが起動時に停止します。最終的に、特定のオラクル クライアント (Ora 10 ではパスの角かっこに問題があったため、プログラム ファイルで実行されているプログラムがプログラム ファイル (x86) で動作していた) がクラッシュを引き起こしたという事実を突き止めました。11G を使用するようにマシンを更新するクライアントは問題を修正しましたが、直接利用できないメタリンクから利用可能ないくつかのパッチもありました. あなたのケースで奇妙なのは、例外が発生しないことですが、アプリケーションを新しいフォルダーに移動する動作により、同様の方法で問題が修正されるため、関連している可能性があります。

ORA-12154: TNS: 指定された接続識別子を解決できませんでした。または ORA-6413: 接続が開いていません。

便利なリンクhttp://blogs.msdn.com/debarchan/archive/2009/02/04/good-old-connectivity-issue.aspx

以下メタリンクからの詳細。

Metalink バグ 3807408 ユーザー名に引用符が含まれているユーザーを外部認証できない

説明 外部認証されたユーザー名に '(',')' または '=' が含まれている場合、そのユーザーは認証されません。また、プログラム名/パスにこれらの文字が含まれていると、接続できない場合があります。例: ディレクトリ "C:\Program Files (x86)" にインストールされた Windows クライアントは、ORA-12154 で接続に失敗します: TNS: 指定された接続識別子を解決できませんでした

この問題の特徴は、ネット トレース (レベル 16) で問題の文字が「?」に置き換えられていることです。トレースで。

回避策 認証の問題: ユーザー名を変更するか、それらのユーザーに対してリモート OS 認証を使用しないでください。

プログラム/ディレクトリの問題: プログラム/ディレクトリ名を変更します

于 2010-05-04T20:13:24.297 に答える