3

我们正在从 .NET Microsoft oracle 驱动程序迁移到 ODP.NET 驱动程序。

我们遇到的问题之一是这个错误:

ORA-12705: 无法访问 NLS 数据文件或指定的环境无效

我们能够通过修改注册表和更改设置来停止错误(见这个问题

在我们的例子中,我们改变了

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - NLS_LANG

设置为 NA

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - HOME0 - NLS_LANG

设置正确

我的问题是为什么注册表中会有不同的 NLS_LANG 设置,并且更改此值是否会产生任何影响?


更新:我刚刚在Oracle NLS FAQ中找到了以下内容

对于 Oracle 版本 7:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

对于 Oracle 数据库版本 8、8i 和 9i:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\

其中“x”是标识 Oracle 主目录的唯一编号。

HOME0是第一次安装

对于 Oracle 数据库 10g:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>

在那里你有一个名字的条目 NLS_LANG

好的,所以不同版本有不同的注册表设置......

笔记:

有些人在 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 未安装版本 7 时发现 NLS_LANG 设置为“NA”而感到困惑。这用于向后兼容,可以忽略。

我有 Oracle 9i,所以现在我更加困惑 - 为什么 ODP.NET dll 查看 Oracle 7 注册表设置?

4

5 回答 5

2

我遇到了类似的问题;

ORA-12705: 无法访问 NLS 数据文件或指定的环境无效

ODP.NET dll 或即时客户端正在读取注册表;

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG=NA

值 NA 导致错误。

这是因为我已经安装了客户端,但我想通过网络驱动器将 oracle 即时客户端用于带有 ODP.NET 的 VB.NET 应用程序。

我在我的 vb.net 解决方案中的简单修复是例如通过以下方式调整应用程序的环境:

Environment.SetEnvironmentVariable("NLS_LANG", 
                    "AMERICAN_AMERICA.WE8MSWIN1252", 
                    EnvironmentVariableTarget.Process)

注意。Oracle“NLS FAQ”链接不再有效 (2012)

于 2012-01-17T16:50:55.057 回答
2

在我们的例子中,我们不想对 Oracle 注册表进行任何潜在的破坏性更改,因为我们将 Web 服务安装在生产 Oracle 9i 服务器上。

解决方案只是为了防止 ODAC 能够看到任何 ORACLE 注册表项,方法是拒绝对我们运行 Web 服务的用户 ID 的该键进行所有访问。

  1. 开始 -> 运行... regedit (以管理员身份)
  2. 导航HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
  3. 右键单击该ORACLE键-> 权限...
  4. 单击添加... 按钮。
  5. 添加在您的 Web 服务的应用程序池标识中配置的 Web 服务用户名(例如IUSR_MyWebService);这是在任务管理器中针对 w3wp.exe 进程显示的用户名。
  6. 按确定。
  7. 对于新的用户权限,请在完全控制权限下选中“拒绝”,然后按确定。

这工作得很好,并且作为奖励,我们确保我们的应用程序与将来对ORACLE注册表项的任何更改隔离。

提示:您可以通过关闭注册表编辑器的任何正在运行的实例,以该用户身份CMD启动提示符(使用 Run As...)然后从命令启动来向自己证明相关用户无权访问相关密钥迅速的。regedit

于 2013-01-11T16:54:46.340 回答
2

关于 11g ODP 版本的 PER Oracle Notes,以下可能导致此错误:

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.

于 2011-09-13T23:32:08.377 回答
1

Oracle 客户端 (ORACLE_HOME\bin\ora*.dll) 正在同一目录中查找名为“oracle.key”的文件。此文件包含属于此 Oracle 客户端安装的注册表项的名称。(例如“Software\ORACLE\HOME3”) hth Andreas

于 2009-11-19T16:24:51.487 回答
1

最终通过安装 ODAC 11 客户端组件(从Oracle 网站下载)解决了这一切。我认为系统变得混乱是因为我们复制了 ODAC dll 而不是完全安装客户端。ODP.NET 期待 Oracle 11 客户端,但不知道在哪里可以找到 Oracle 主页。

注意,如果您使用 xCopy 部署安装 ODAC 组件,则不要将它们安装到现有的 Oracle 主目录(例如,对于 9i 客户端,c:\oracle\ora92)。这会导致“提供程序与 Oracle 客户端的版本不兼容”错误。

于 2010-01-14T12:51:05.830 回答