在Oracle客户端的注册表中更改NLS_LANG设置的影响
我们正在从.NET Microsoft驱动程序转移到ODP.NET驱动程序。在Oracle客户端的注册表中更改NLS_LANG设置的影响
一个我们遇到的问题是这样的错误:
ORA-12705:无法访问NLS数据文件或无效的环境中指定
我们可以通过修改注册表,并改变了停止错误设置(see this question)
在我们的例子中,我们改变
HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - NLS_LANG
其设置为NA
是一样
HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - HOME0 - NLS_LANG
我的问题是,为什么会出现在注册表中不同NLS_LANG设置,可能会有任何改变这个值的敲击效应?
更新: 我刚刚在Oracle NLS FAQ发现以下
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,所以有不同的版本,不同的注册表设置...
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.
我有Oracle 9i,所以现在我更加困惑 - 为什么ODP.NET DLL在查看Oracle 7注册表设置?
Oracle客户端(ORACLE_HOME \ bin \ ora * .dll)正在同一目录中查找名为“oracle.key”的文件。该文件包含属于此Oracle客户端安装的注册表项的名称。 (例如, “SOFTWARE \ ORACLE \ HOME3”) HTH 安德烈亚斯
这是所有通过安装ODAC 11客户端组件(从Oracle website下载)解决到底。我认为系统变得混乱,因为我们已经复制了ODAC dll而不是完全安装客户端。 ODP.NET期待Oracle 11客户端,并且不知道在哪里可以找到Oracle Home。
注意,如果您使用xCopy部署安装ODAC组件,然后不要将安装到现有Oracle主目录(例如,对于9i客户端为c:\ oracle \ ora92)。这会导致“提供程序与Oracle Client版本不兼容”错误。
PER甲骨文的注意事项11g的ODP版本,下面可能会导致这个错误:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG=NA <--- This NA does in fact cause this error if set to NA.
你可以试试DELETING
如果不需要此项或将其设置为有效NLS_LANG
设置您的语言环境。我们将其设置为AMERICAN_AMERICA.WE8MSWIN1252
。
我有一个类似的问题,
ORA-12705:无法访问NLS数据文件或无效的环境中指定
的ODP.NET DLL的或即时客户端在读注册表中;
HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE \ NLS_LANG = NA
值NA引起错误。
这是因为我已经有一个客户端安装,但我想通过网络驱动器使用ODP.NET的VB.NET应用程序的Oracle即时客户端。
我在我的vb.net解决方案简单的解决方法是例如通过调整应用程序的环境:
Environment.SetEnvironmentVariable("NLS_LANG",
"AMERICAN_AMERICA.WE8MSWIN1252",
EnvironmentVariableTarget.Process)
NB。 Oracle“NLS FAQ”链接不再有效(2012)
此替代方法可用作魅力。谢谢!!! – danielQ 2014-03-06 15:12:42
在我们的案例中,我们不想对Oracle注册表进行任何潜在的重大更改,因为我们正在生产Oracle 9i服务器上安装我们的Web服务。
该解决方案仅仅是为了防止ODAC通过拒绝对我们的Web服务运行的用户ID的所有访问权限来看到任何ORACLE注册表项。
- 开始 - >运行...
regedit
(作为一个管理员) - 导航到
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
- 右键单击
ORACLE
键 - >权限... - 点击Add ..按钮。
- 添加在Web服务的应用程序池标识中配置的Web服务用户名(例如
IUSR_MyWebService
);这是在任务管理器中针对您的w3wp.exe进程显示的用户名。 - 按OK。
- 对于新的用户权限,请选中“完全控制”权限中的“拒绝”,然后按确定。
这工作得很好,作为奖励,我们确保我们的应用程序与以后对ORACLE
注册表项的任何更改隔离。
提示:你能证明你自己有问题的用户可以通过关闭注册表编辑器的任何运行的实例有问题的钥匙进不去,开始CMD
提示为用户(使用运行方式。 ..)然后从命令提示符启动regedit
。
谢谢安德烈亚斯,我不知道。然而,我已经看了oracle.key文件,它有正确的注册表项HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE \ HOME0 这正是NLS_LANG设置正确的地方,以及我期望ODP.NET DLL在寻找NLS设置... – LauraB 2009-11-20 10:25:54
是ODP。NET真的使用Oracle 9i客户端目录中的Oracle客户端DLL吗?您可以使用SysInternals的ProcessExplorer检查应用程序使用的DLL。 – Andreas 2009-11-20 15:45:37
注意:在64位机器上,'oracle.key'的内容可以看起来像这个'SOFTWARE \ ORACLE \ KEY_OraClient11g_home1',而注册表中的真实位置是'HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ORACLE \ KEY_OraClient11g_home1' – itsho 2015-02-25 11:09:50