2017-05-30 6 views
0

ODP.NET(ODAC)を使用してOracleデータベースからデータにアクセスしようとすると例外が発生します。コードは次のようになります:トルコ語でODACを使用してカラム名に 'i'を含むカラムを取得しようとしたときに例外が発生する

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("tr-tr"); 
string s = "SELECT MyString from MyTable"; 
var conn = new OracleConnection(connectString); 
conn.Open(); 
var cmd = new OracleCommand(s, conn); 
var rdr = cmd.ExecuteReader(); 
rdr.Read(); 
object o1 = rdr[0]; 
object o2 = rdr["MYSTRING"]; 
object o3 = rdr["MyString"]; 

o1とo2の割り当てがOKに動作しますが、O3の割り当てが例外を与える:

System.IndexOutOfRangeException: Unable to find specified column in result set 
    at Oracle.DataAccess.Client.OracleDataReader.GetOrdinal(String name) 
    at Oracle.DataAccess.Client.OracleDataReader.get_Item(String columnName) 

私は "トルコI" の問題を十分に認識です。 ODACのバグのように思えます(不変の文化ではなく、現在のカルチャを使用して列名を大文字に変換しています)が、同様の問題を報告している他の人は見つかりませんでした。

二つの質問:

  1. は、これは本当にODACのバグですか、私は何か間違ったことをやっていますか?

  2. バグの場合は、回避策として、名前付き列を取得するときにすべての列名を大文字に変換することができます(不変のカルチャを使用)。

+0

コードを逆コンパイルしたところで大文字の変換を行っていますが、残念ながら現在のカルチャ設定を使用しています。そのため、サーバーから返された列名はMYSTRINGですが、MyStringを要求すると、実際に存在しないMYSTRİNGという名前の列が見つかります。 – Andy

答えて

0

これはどの言語設定にも関係しないと思います。デフォルトでは、Oracleの列名はすべて大文字です。大文字と小文字を区別する場合は、

string s = "SELECT MyString AS \"MyString\" from MyTable"; 

もちろん、object o2 = rdr["MYSTRING"];は失敗します。

それはトルコ語に問題がある場合:

Oracle.DataAccessは、現在の.NETカルチャ設定に依存しない、それがNLS_LANG値から設定を継承します。あなたは

NLS_LANG=TURKISH_TURKEY.AL32UTF8 

に、たとえば、アプリケーションを起動する前に、あなたはそれを設定することができ、適切NLS_LANG値を設定していずれか環境変数として、あるいはHKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANGでレジストリに、RESP(64ビットWindows上で32ビットアプリケーション用)。 HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG(64ビット用)

別の解決策は、あなたがこのようなクエリを実行する前に、Oracleセッションでそれを変更することです:

cmd.CommandText = "ALTER SESSION SET NLS_TERRITORY = 'TURKEY'"; 
cmd.ExecuteNonQuery(); 

それとも、ODP.NET 管理ドライバを使用することができ、これは敏感NLS_LANGされていません。 .NETロケールにのみ対応しています(ただし、スレッドベースのグローバリゼーションはサポートしていません)Data Provider for .NET Developer's Guide

+0

私は大文字と小文字を区別しないようにしようとはしていませんし、トルコ語のデータを格納しようとしていません。私は、列名を指定してデータベーステーブルから列を取得しようとしています。 – Andy

+0

BTWはODP.NET Managedドライバについてのヒントをありがとうございます - これは実現していませんでしたが、確かにこれを調査します。たとえ同じバグがあっても、 – Andy

+0

を配備するほうがはるかに簡単です。最初のコメントには「大文字と小文字を区別しないようにするつもりはありません。 – Andy

関連する問題