2017-05-30 1 views
0

Ich erhalte eine Ausnahme, wenn ich versuche, mit ODP.NET (ODAC) auf Daten aus einer Oracle-Datenbank zuzugreifen. Der Code lautet wie folgt:Ausnahme beim Versuch, die Spalte mit 'i' im Spaltennamen mithilfe von ODAC in Türkisch abzurufen

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"]; 

die o1 und o2 Zuweisungen arbeiten OK, aber die o3 Zuordnung gibt eine Ausnahme:

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) 

Ich bin voll und ganz bewusst von der "türkisch I" Problem. Es sieht für mich wie ein Fehler in ODAC aus (es konvertiert den Spaltennamen unter Verwendung der aktuellen Kultur und nicht der invarianten Kultur in Großbuchstaben), aber ich habe niemanden gefunden, der ähnliche Probleme meldet.

zwei Fragen:

  1. ist dies wirklich ein Fehler in ODAC oder bin ich etwas falsch?

  2. Wenn es sich um einen Fehler handelt, kann ich zur Umgehung aller benannten Spalten einfach alle Spaltennamen in Großbuchstaben umwandeln (mit invarianter Kultur).

+0

Ich habe jetzt den Code dekompiliert und ich kann sehen, wo es die Konvertierung in Großbuchstaben macht und leider die aktuellen Kultureinstellungen verwendet, Während also der vom Server zurückgegebene Spaltenname MYSTRING ist, sucht er nach einer Spalte namens MYSTRİNG (mit einem gestrichelten Großbuchstaben I), die nicht existiert. – Andy

Antwort

0

Ich glaube nicht, dass dies mit einer Spracheinstellung verbunden ist. Standardmäßig sind die Spaltennamen in Oracle alle Großbuchstaben. Wenn es Ihnen gefällt haben, falls sensibel, versuchen

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

Natürlich, in diesem Fall object o2 = rdr["MYSTRING"]; fehl.

Falls es ein Problem mit dem türkischen Sprache:

Oracle.DataAccess nicht auf aktuelle .NET Kultureinstellungen abhängen, es erbt von NLS_LANG Wert. Stellen Sie NLS_LANG Wert richtig, bevor Sie Ihre Anwendung starten, zum Beispiel zu

NLS_LANG=TURKISH_TURKEY.AL32UTF8 

Sie können diese Funktion entweder als Umgebungsvariable oder in Registry bei HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG (für 32-Bit-Anwendung auf 64-Bit-Windows), resp. HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG (für 64 Bit).

Eine andere Lösung ist es in Oracle-Sitzung zu ändern, bevor Sie die Abfrage wie folgt auszuführen:

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

Oder Sie ODP.NET Treiber Managed verwenden können, ist dies nicht empfindlich NLS_LANG. Es ist nur .NET Gebietsschema empfindlich (aber keine thread-basierte Globalisierung unterstützt), siehe Data Provider for .NET Developer's Guide

+0

Ich versuche nicht, die Groß-/Kleinschreibung unempfindlich zu machen, noch versuche ich irgendwelche türkischen Daten zu speichern; Ich versuche nur, eine Spalte aus einer Datenbanktabelle durch Angabe des Spaltennamens abzurufen. – Andy

+0

BTW danke für den Hinweis über den ODP.NET Managed Treiber - ich wusste nicht, dass das existiert, aber werde dies definitiv untersuchen. Auch wenn es den gleichen Fehler hat, wird es viel einfacher sein, – Andy

+0

zu deployen, sollte der erste Kommentar gelesen haben "Ich versuche nicht, es Groß-und Kleinschreibung zu beachten" – Andy

Verwandte Themen