我在C#(> .NET 4.0)项目中使用了Oracle.ManagedDataAccess Nuget Package Version 12.2.1100。在我的localhost中一切正常,但在开发服务器上我遇到了这个例外:
异常消息:ORA-12154:TNS:无法解析指定的连接标识符 例外来源:适用于.NET的Oracle数据提供程序,托管驱动程序
现在我认为ManagedDataAcess包含了我需要的一切。我错过了别的什么吗?还有其他东西干扰了包裹吗?我需要添加其他东西吗?
注意:我的Web.config
中没有def ss(line1,line2):
count = 0
list1 = line1.split()
list2 = line2.split()
for word in list1:
if word is not list2[count]:
return count
else:
count += 1
ss("Why is this not working?", "Why is this not working?")
标记
代码:
<oracle.manageddataaccess.client>
修改
我已经确认TNS_ADMIN变量是在控制面板中设置的,但似乎并没有这样做。
然后我将tnsnames.ora文件添加到bin文件夹中,我已经开始工作,但这不是一个长期的解决方案。
答案 0 :(得分:1)
您可能没有配置TNS,这就是为什么这种形式的连接字符串不起作用的原因。如果您使用不同形式的连接字符串,则不需要配置TNS,例如:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=MyIpOrServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MySID)));User Id=MyUsername;Password=MyPassword;
将所有My*
占位符替换为您的值。
答案 1 :(得分:1)
您的程序找不到tnsnames.ora
(resp。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>
注意,与其他驱动程序/提供程序不同,ODP.NET托管驱动程序不从注册表中读取TNS_ADMIN
设置。
答案 2 :(得分:1)
我们在其中一个环境中看到了类似的问题,以下问题解决了我们的问题;
在Web服务器上安装Oracle Data Provider for .NET时,根据您在安装期间选择的内容,它会将条目写入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\12.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
...
条目包含引用ODP.NET oracle客户端版本的特定版本号。 我们正在使用版本4.122.1.0的托管客户端库(版本12.2.1100 nuget包)构建我们的应用程序,它与4.121.2.0不匹配
我们通过从此标记中删除oracle托管客户端库版本来更改上述条目:
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess" />
并指定&#39; *&#39;对于此标记的版本号:
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\client\product\12.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
如果您需要指定特定的版本号,请确保您的代码使用相同的版本号进行编译。
如果存在,也可以从machine.config中删除所有这些条目,并根据您的配置在应用程序web.config中指定它们。
答案 3 :(得分:0)
以我的情况来说很简单。
在Program.cs(Entrypoint类)中设置ORACLE_HOME环境变量
在app.config中没有任何更改或设置
[STAThread]
static int Main()
{
var oracleHome = GetOracleHome(); // Find registry...
Environment.SetEnvironmentVariable("ORACLE_HOME", oracleHome);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
...