views:

1369

answers:

2

We are in the process of moving from the .NET Microsoft oracle driver to the ODP.NET driver.

One of the problems we have had is this error:

ORA-12705: Cannot access NLS data files or invalid environment specified

We were able to stop the error by modifying the registry and changing the setting (see this question)

In our case we changed

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - NLS_LANG

which was set to NA

to be the same as

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - HOME0 - NLS_LANG

which was set correctly

My question is why would there be different NLS_LANG settings in the registry, and might there be any knock on effects of changing this value?


Update: I've just found in the Oracle NLS FAQ the following

For Oracle version 7:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

For Oracle Database versions 8, 8i and 9i:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\

where "x" is the unique number identifying the Oracle home.

HOME0 is the first installation

For Oracle Database 10g:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>

There you have an entry with name NLS_LANG

OK, so there are different registry settings for different versions...

Note:

Some people are confused by finding a NLS_LANG set to "NA" in HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE when no version 7 was installed. This is used for backwards compatibility, and can be ignored.

I have Oracle 9i, so now I'm even more confused - why is the ODP.NET dll looking at the Oracle 7 registry setting?

A: 

Hi, the Oracle Client (ORACLE_HOME\bin\ora*.dll) is looking for a file named "oracle.key" in the same directory. This file contains the name of the registry key which belongs to this Oracle client installation. (e.g. "Software\ORACLE\HOME3") hth Andreas

Andreas
Thanks Andreas, I didn't know that. However I have looked at the oracle.key file, and it has the correct registry key HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 This is where NLS_LANG was set correctly, and where I would have expected the ODP.NET DLL to be looking for the NLS setting...
LauraB
Is ODP.NET really using the Oracle client DLLs from the Oracle 9i client directory? You can check the DLLs used by your application with SysInternals' ProcessExplorer.
Andreas
A: 

This was all resolved in the end by installing the ODAC 11 client components (downloaded from the Oracle website). I think the system was getting confused because we had copied the ODAC dlls across rather than fully installing the client. ODP.NET is expecting an Oracle 11 client and didn't know where to find the Oracle Home.

NB if you are installing the ODAC components using xCopy deployment then do not install them to an existing Oracle Home directory (eg c:\oracle\ora92 for 9i client). This causes a 'Provider is not compatible with the version of Oracle Client’ error.

LauraB