2014-06-19 12 views
5

Ich habe eine Winforms C# -Anwendung mit Oracle 12c durch Oracle.ManagedDataAccess (über NHibernate 4.0), Die Oracle-Datenbank ist auf einem anderen Rechner auf Kundenseite hatten wir Probleme mit der Zeichensatzkonvertierung aufgrund NLS_LANG Unterschiede zwischen der Oracle-Datenbank und der Client-Maschine. Auf dem Clientcomputer ist kein Oracle-Client installiert (nur verwalteter Treiber).Legen Sie NLS_LANG für Oracle-verwalteten Datenzugriff

Wir haben festgestellt, dass Sie den Client NLS_LANG mit einer Umgebungsvariablen angeben können.

Meine Frage ist: Gibt es andere Möglichkeiten, die NLS_LANG Einstellung anzugeben, wenn Sie den neuen Managed Data Access in Oracle verwenden?

Antwort

0

Nicht sicher, was genau Sie brauchen, (Der Begriff "das neue Managed Data Access in Oracle" nicht klingelt eine Glocke hier.), Aber ich fand dies:

http://docs.oracle.com/html/E41125_02/featGlobal.htm#i1008314

Aufruf Oracle.DataAccess.Client.OracleConnection ‚s Die Methode GetSessionInfo() gibt ein Objekt der Klasse Oracle.DataAccess.Client.OracleGlobalization zurück, das laut ODP.NET Developer's Guide verwendet werden kann, um NLS-spezifische Einstellungen auf der Ebene einer Oracle DB-Sitzung zu ändern.

3

Ich verwende die OracleGlobalization, um das Datumsformat wie folgt einzustellen. Dies könnte Ihnen einen Hinweis geben.

conn = new OracleConnection(connectionString); 
     conn.Open(); 
     OracleGlobalization info = conn.GetSessionInfo(); 
     info.DateFormat = "YYYY-MM-DD"; 
     conn.SetSessionInfo(info); 
1

Sie können die Windows-Registrierung für NLS_LANG-Schlüssel überprüfen. Das Festlegen des Schlüssels entspricht mehr oder weniger dem Festlegen der Umgebungsvariablen, aber wenn beide vorhanden sind, hat die Umgebungsvariable Vorrang. Diese Frage Stackoverflow auf diese Frage ein wenig verwandt waren:

Effects of changing NLS_LANG setting in the registry for Oracle Client

Während meiner Installationssitzung heute, fanden wir heraus, dass unsere Web-Anwendung wird in 32-Bit-Modus über den 64-Bit-Betriebssystem ausgeführt wird, so Der verwendete Registrierungsspeicher unterscheidet sich von dem Standardspeicherort. Es befindet sich in HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ORACLE \ KEY_OraClient11g_home1. Ich würde vorschlagen, eine globale Suche mit regedit zu machen, um herauszufinden, wo die NLS_LANG Schlüssel sind.

+0

ODP.NET, verwaltete Treiber berücksichtigt NLS_LANG nicht aus der Registrierung. Tatsächlich berücksichtigt es überhaupt keine Registrierungseinstellungen. –

2

Nein, dies nicht möglich ist, siehe Dokumentation Data Provider for .NET Developer's Guide sagt, wo es

ODP.NET, Managed-Treiber ist nicht NLS_LANG empfindlich. Es ist nur .NET Gebietsschema empfindlich.

Siehe auch OracleGlobalization Properties

  • ClientCharacterSet ->public string ClientCharacterSet { get; }

    einen Client-Zeichensatz fest. Nicht verfügbar in ODP.NET, Managed Treiber

2

Das Problem stellt sich, wenn Sie von nicht verwalteten auf verwaltete ODP migriert. Hier sind Verfahren für NLS_LANG Einstellung durch die Teile zu OracleConnection geöffnet

 string nlsLang = Settings.Default.NLS_LANG; 
     var arr = nlsLang.Split('_'); 
     string language = arr[0]; 
     arr = arr[1].Split('.'); 
     string territory = arr[0]; 
     string characterSet = arr[1]; 

     OracleGlobalization info = connection.GetSessionInfo(); 
     info.Language = language; 
     info.Territory = territory; 
     info.NumericCharacters = characterSet; 
     connection.SetSessionInfo(info); 
0

ich NHibernate verwende, aber Sie könnten wahrscheinlich diese laufen mit dem, was Sie verwenden.

ALTER session SET nls_language = 'AMERICAN' 

ich führen Sie es direkt nach einer Datenbankverbindung zu öffnen.

Sobald dies erledigt ist, wird mit dem Befehl 'US' zurückgekehrt.

select USERENV('LANG') from dual; 

Und Sie können diese eine Liste der möglichen Werte für NLS_LANGUAGE bekommen laufen.

select * from V$NLS_VALID_VALUES where parameter = 'LANGUAGE' 
+0

Diese Lösung erwies sich als nicht so robust, wie ich es mir gewünscht hätte. Ich habe die Einstellung "Region und Sprache> Format" auf "Englisch (USA)" gesetzt, um USERENV ('LANG') zu erhalten, um 'US' zurückzugeben. – yohosuff