フランスの Oracle データベースを米国のサーバーに復元しました。そのデータベースの NLS_CHARACTERSET は AL32UTF8 です。そのデータベースのテーブルに、Unicode テキストを含むことができる VARCHAR2 フィールドがあります。1 つのレコードのそのフィールドの値は「é」です。SQL*Plus と TOAD で次のクエリを実行すると、すべてが機能します。
select * from foo where bar = 'é';
System.Data.OracleClient を使用して nUnit 単体テストを作成し、TestDriven.net で実行すると、完全に実行されます。WinForms アプリケーションからまったく同じコードを実行すると、クエリは次のように変換されます。
select * from foo where bar = 'e';
これにより、SQL*Plus、TOAD、および .Net ユニット テストからは行が返されますが、.Net アプリケーションからは行が返されません。
System.Data.OracleClient が廃止されたことは知っていますが、それでも機能します。このコードは、Oracle が段階的に廃止されているシステムにあるため、変換またはアップグレードはほとんど意味がありません。
クエリが TestDriven.Net (ProcessInvocation86.exe) から機能するという事実は、OCI クライアントと OracleClient がクエリで Unicode 文字を受け入れることができることを示しています。WinForms アプリケーションが 'é' を 'e' に変換するということは、.Net WinForms のどこかでそれが変換されていることを示しています。オフにするにはどうすればよいですか?回避できるのであれば、レジストリを変更する必要はありません。アプリケーションは、フランスと米国で構成の違いをできるだけ少なくして動作する必要があります。ここでの目標は、.Net に「クエリ文字を変換しないでください。常にすべてを Unicode の CLOB として渡す」ように指示することです。どうやってやるの?