使用 Oracle.ManagedDataAccess 异常连接到 Oracle
Connection to Oracle using Oracle.ManagedDataAccess exception
我在我的 C# (>.NET 4.0) 项目中使用 Oracle.ManagedDataAccess Nuget 包版本 12.2.1100。在我的本地主机上一切正常,但在开发服务器上我遇到了这个异常:
Exception Message: ORA-12154: TNS:could not resolve the connect identifier specified
Exception Source: Oracle Data Provider for .NET, Managed Driver
现在我认为 ManagedDataAcess 包含我需要的一切。我还缺少其他东西吗?是否有其他东西干扰包裹?我需要添加其他东西吗?
注意:我的Web.config
中没有<oracle.manageddataaccess.client>
标签
代码:
<connectionStrings>
<add name="XXX" connectionString="Data Source=XXX;User ID=XXX;Password=XXX" />
</connectionStrings>
编辑:
我已经确认 TNS_ADMIN 变量是在控制面板中设置的,但似乎没有用。
然后我将 tnsnames.ora 文件添加到 bin 文件夹中,我已经开始工作了,但这不是一个长期的解决方案。
您可能没有配置 TNS,这就是该形式的连接字符串不起作用的原因。如果您使用不同形式的连接字符串,则不需要配置 TNS,例如:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=MyIpOrServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MySID)));User Id=MyUsername;Password=MyPassword;
用您的值替换所有 My*
占位符。
您的程序未找到 tnsnames.ora
(相应 sqlnet.ora
)文件。有几种指定位置的可能性。
在 .NET 配置文件中定义它 (web.config
、machine.config
、application.config
)
设置环境变量TNS_ADMIN
将 tnsnames.ora
、sqlnet.ora
文件复制到您的应用程序 .exe 所在的目录。
.NET 配置文件示例:
<oracle.manageddataaccess.client>
<version number="4.122.*">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\network\admin"/>
</settings>
</version>
</oracle.manageddataaccess.client>
请注意,与其他 drivers/providers 不同,ODP.NET 托管驱动程序 不会 从注册表中读取 TNS_ADMIN
设置。
我们在我们的一个环境中发现了类似的问题,以下解决了我们的问题;
当 Oracle Data Provider for .NET 安装在 Web 服务器上时,根据您在安装过程中 select 的内容,它会将条目写入 machine.config 文件(位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\ 取决于框架版本)。 ODP.NET 安装程序的不同版本似乎对 machine.config 做了不同的事情(我们的一些服务器没有在 machine.config 中指定的版本号,而其他服务器有为 oracle 指定的特定版本号托管客户端)
根据安装的版本,它会添加几行,如下所示:
...
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
...
<oracle.manageddataaccess.client>
<version number="4.121.2.0">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\client\product.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
...
条目包含引用 ODP.NET oracle 客户端版本的特定版本号。
我们正在使用与 4.121.2.0
不匹配的托管客户端库版本 4.122.1.0(版本 12.2.1100 nuget 包)构建我们的应用程序
我们通过从此标签中删除 oracle 管理的客户端库版本更改了上述条目:
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess" />
并为此标签的版本号指定“*”:
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\client\product.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
如果您需要指定特定的版本号,请确保您的代码使用相同的版本号编译。
您还可以从 machine.config 中删除所有这些条目(如果它们存在)并根据您的配置在应用程序 web.config 中指定它们。
对我来说是一种简单的方法。
在 Program.cs(入口点 class)
中设置 ORACLE_HOME 环境变量
app.config
中没有任何更改或设置
[STAThread]
static int Main()
{
var oracleHome = GetOracleHome(); // Find registry...
Environment.SetEnvironmentVariable("ORACLE_HOME", oracleHome);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
...
我在我的 C# (>.NET 4.0) 项目中使用 Oracle.ManagedDataAccess Nuget 包版本 12.2.1100。在我的本地主机上一切正常,但在开发服务器上我遇到了这个异常:
Exception Message: ORA-12154: TNS:could not resolve the connect identifier specified Exception Source: Oracle Data Provider for .NET, Managed Driver
现在我认为 ManagedDataAcess 包含我需要的一切。我还缺少其他东西吗?是否有其他东西干扰包裹?我需要添加其他东西吗?
注意:我的Web.config
中没有<oracle.manageddataaccess.client>
标签
代码:
<connectionStrings>
<add name="XXX" connectionString="Data Source=XXX;User ID=XXX;Password=XXX" />
</connectionStrings>
编辑:
我已经确认 TNS_ADMIN 变量是在控制面板中设置的,但似乎没有用。
然后我将 tnsnames.ora 文件添加到 bin 文件夹中,我已经开始工作了,但这不是一个长期的解决方案。
您可能没有配置 TNS,这就是该形式的连接字符串不起作用的原因。如果您使用不同形式的连接字符串,则不需要配置 TNS,例如:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=MyIpOrServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MySID)));User Id=MyUsername;Password=MyPassword;
用您的值替换所有 My*
占位符。
您的程序未找到 tnsnames.ora
(相应 sqlnet.ora
)文件。有几种指定位置的可能性。
在 .NET 配置文件中定义它 (
web.config
、machine.config
、application.config
)设置环境变量
TNS_ADMIN
将
tnsnames.ora
、sqlnet.ora
文件复制到您的应用程序 .exe 所在的目录。
.NET 配置文件示例:
<oracle.manageddataaccess.client>
<version number="4.122.*">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\network\admin"/>
</settings>
</version>
</oracle.manageddataaccess.client>
请注意,与其他 drivers/providers 不同,ODP.NET 托管驱动程序 不会 从注册表中读取 TNS_ADMIN
设置。
我们在我们的一个环境中发现了类似的问题,以下解决了我们的问题;
当 Oracle Data Provider for .NET 安装在 Web 服务器上时,根据您在安装过程中 select 的内容,它会将条目写入 machine.config 文件(位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\ 取决于框架版本)。 ODP.NET 安装程序的不同版本似乎对 machine.config 做了不同的事情(我们的一些服务器没有在 machine.config 中指定的版本号,而其他服务器有为 oracle 指定的特定版本号托管客户端)
根据安装的版本,它会添加几行,如下所示:
...
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
...
<oracle.manageddataaccess.client>
<version number="4.121.2.0">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\client\product.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
...
条目包含引用 ODP.NET oracle 客户端版本的特定版本号。 我们正在使用与 4.121.2.0
不匹配的托管客户端库版本 4.122.1.0(版本 12.2.1100 nuget 包)构建我们的应用程序我们通过从此标签中删除 oracle 管理的客户端库版本更改了上述条目:
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess" />
并为此标签的版本号指定“*”:
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\client\product.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
如果您需要指定特定的版本号,请确保您的代码使用相同的版本号编译。
您还可以从 machine.config 中删除所有这些条目(如果它们存在)并根据您的配置在应用程序 web.config 中指定它们。
对我来说是一种简单的方法。
在 Program.cs(入口点 class)
中设置 ORACLE_HOME 环境变量
app.config
[STAThread]
static int Main()
{
var oracleHome = GetOracleHome(); // Find registry...
Environment.SetEnvironmentVariable("ORACLE_HOME", oracleHome);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
...