2014-06-19 16 views
5

Ho un'applicazione C# winforms che utilizza Oracle 12c tramite oracle.manageddataaccess (tramite NHibernate 4.0), Il database di Oracle si trova su un'altra macchina sul sito del cliente che abbiamo riscontrato problemi con la conversione del set di caratteri a causa di NLS_LANG differenze tra il database Oracle e il computer client. Non è installato alcun client Oracle sul computer client (è sufficiente utilizzare il driver gestito).Impostare NLS_LANG per l'accesso ai dati gestito Oracle

Abbiamo trovato che è possibile specificare il client NLS_LANG utilizzando una variabile di ambiente.

La mia domanda è: Ci sono altri modi per specificare l'impostazione NLS_LANG quando si utilizza il nuovo accesso ai dati gestiti in Oracle?

risposta

0

Non sei sicuro di cosa esattamente si ha bisogno, (Il termine "il nuovo Managed accesso ai dati in Oracle" non suonare un campanello qui.), Ma ho trovato questo:

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

Calling Oracle.DataAccess.Client.OracleConnection 's il metodo GetSessionInfo() restituisce un oggetto della classe Oracle.DataAccess.Client.OracleGlobalization che, in base alla Guida per sviluppatori ODP.NET, può essere utilizzato per modificare le impostazioni specifiche di NLS al livello di una sessione di Oracle DB.

3

Sto usando OracleGlobalization per impostare il formato della data come segue. Questo potrebbe darti un indizio ..

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

Si potrebbe voler controllare il registro di Windows per le chiavi NLS_LANG. L'impostazione della chiave è più o meno equivalente all'impostazione della variabile d'ambiente, ma se entrambe esistono la variabile d'ambiente ha la precedenza. Questa domanda StackOverflow sono stati un po 'legato a questa domanda:

Effects of changing NLS_LANG setting in the registry for Oracle Client

Durante la mia sessione di installazione oggi, abbiamo scoperto che la nostra applicazione Web è in esecuzione in modalità a 32 bit sul sistema operativo a 64 bit, in modo da la posizione del registro utilizzata è diversa da quella standard. È in HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ORACLE \ KEY_OraClient11g_home1. Suggerirei di fare una ricerca globale usando regedit per scoprire dove sono le chiavi NLS_LANG.

+0

ODP.NET, Driver gestito non considera 'NLS_LANG' dal registro. In realtà non considera affatto le impostazioni del registro. –

2

No, questo non è possibile, consultare la documentazione Data Provider for .NET Developer's Guide in cui si dice

ODP.NET, pilota gestito non è NLS_LANG sensibile. È sensibile alle impostazioni internazionali .NET.

vedere anche OracleGlobalization Properties

  • ClientCharacterSet ->public string ClientCharacterSet { get; }

    Specifica un set di caratteri client. Non disponibile in ODP.NET, Autista Managed

2

Il problema solleva quando si migra da non gestito a gestito ODP. Ecco metodo di fissazione NLS_LANG per le sue parti a aperto OracleConnection

 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

Sto usando NHibernate, ma probabilmente si potrebbe eseguire questo con tutto ciò che si sta utilizzando.

ALTER session SET nls_language = 'AMERICAN' 

Lo eseguo subito dopo aver aperto una connessione al database.

Una volta fatto, l'esecuzione restituisce "US".

select USERENV('LANG') from dual; 

E si può eseguire questo per ottenere un elenco di possibili valori per NLS_LANGUAGE.

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

Questa soluzione si è rivelata non robusta come avrei voluto. Ho fatto ricorso a "Region and Language> Format" in "English (United States)" per ottenere USERENV ('LANG') per restituire 'US'. – yohosuff

Problemi correlati