ODP.Net 中的连接字符串

Posted

技术标签:

【中文标题】ODP.Net 中的连接字符串【英文标题】:Connection string in ODP.Net 【发布时间】:2014-12-10 12:39:12 【问题描述】:

最初我使用 oraoledb.oracle 提供程序来连接到 Oracle 数据库,并且很容易构建连接字符串:

Provider=OraOLEDB.Oracle;User Id=myId;Password=myPassword;Data Source=data.customer.com

一切都按预期工作,但目前我切换到 ODP.Net 以摆脱安装 oracle 客户端,我收到错误 ORA-12154: TNS:could not resolve the connect identifier specified 并带有以下连接字符串:

数据源=data.customer.com;用户 ID=myId;密码=myPassword

那么谁能告诉我,我在哪里做错了?

【问题讨论】:

data.customer.com 位于您正在运行的特定家庭的 tnsnames.ora 中(检查位)? 另外,您使用的是托管 ODP.NET 还是非托管版本? @Patrick Hofman,是的,我正在使用托管 ODP.NET,不幸的是我无法检查 tnsnames.ora 文件,因为我无法访问该服务器。我只知道这个“data.customer.com” 托管 ODP.NET 不适用于 tnsnames.ora。这就是问题所在。 @Patrick Hofman,非托管 ODP.NET 需要安装 Oracle 客户端,对吗? 【参考方案1】:

就个人而言,我不喜欢依赖机器上定义的 tnsnames.ora。使用更长的连接字符串(参见下面的示例),您可以部署您的程序而不考虑目标系统上可能不存在的 tnsnames.ora。

不使用 tnsnames.ora 使用 ODP.NET 的示例:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));
User Id=myUsername;Password=myPassword;

见also。

【讨论】:

如果您希望在连接字符串中嵌入所有详细信息,则使用 E​​Z 配置格式比使用 EZ 配置格式更简单。例如:数据源=MyHost:MyPort/MyOracleService;User Id=myUsername;Password=myPassword;【参考方案2】:

托管 ODP.NET 可与 tnsnames.ora 一起使用,但它需要一些额外的配置才能工作。那是你的问题。您正在尝试使用来自 tnsnames.ora 的名称,该名称仅在您的 machine.config、Web.config 或 app 中设置 TNS_ADMIN 环境变量或配置部分时有效。配置。能够使用 tnsnames.ora 的另一种选择是非托管 ODP.NET 驱动程序,在我看来使用起来很痛苦。

尝试使用EZCONNECT 名称,这些名称​​受托管和非托管驱动程序支持,无需 tnsnames.ora 文件或任何其他配置。

【讨论】:

ODP.NET 托管驱动程序不能与 TNSNAMES.ORA 一起使用是不正确的。确实如此,但它是从安装程序在 machine.config 中默认设置的 TNS_ADMIN 变量中获取的(或者您可以在您的应用程序或 Web 配置中设置它)。您也可以将 TNSANAMES.ORA 放在可执行文件的工作目录中,如果您尚未在配置文件中设置 TNS 整体,它将被拾取。 @Chr:您的回答自相矛盾:***.com/a/26672511/993547 不,这是不正确的。托管 ODP.NET 确实可以与 TNSNAMES.ORA 一起使用。你可以使用 TNS_ADMIN 来指向它,或者(如果你没有在你的机器/app.config 中放置别名,这将采取 precidence)你可以将它放在可执行文件的工作目录中。 是的,如果您只是下载 dll 本身,那么是的,您需要自己执行配置,包括将 TNS_ADMIN 值设置为放置 TNSNAMES.ORA 的任何位置,将 TNSNAMES.ORA 移动到工作目录,或在配置文件中设置连接别名。但是,如果您不在部署方案中,您可以下载它的安装程序版本,这将为您做更多的事情。如果您使用 Entity Framework Designers 进行设计时工作,则必须使用安装程序。 oracle.com/technetwork/topics/dotnet/downloads/index.html @Chr :我做到了。请查看帖子。随意编辑它以改进它。【参考方案3】:

我最近在这条路上冒险,只是在尝试使用 ODP.net 运行网站时遇到 32x/64x 问题。

这是我的工作连接字符串: Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ip/server)(PORT=port)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=service_id)));User Id=user_id;Password=p_word"

编辑: 该死,@ialekseev 太快了..

【讨论】:

【参考方案4】:

如果您使用 Oracle 安装程序安装 ODP.NET,请将包含 data.customer.com 的 TNSNAMES.ORA 复制到您的 ODP.NET ORACLE HOME/NETWORK/ADMIN 目录中,并且它应该可以工作,因为安装程序设置了 TNS_ADMIN machine.config 中的变量,(用于托管 ODP.NET)。

如果您想完全不使用 TNSNAMES.ORA 条目,也可以使用 SQLNET EZ Config 连接字符串语法。

例如: 数据源=MyHost:MyPort/MyOracleService;用户ID=myUsername;Password=myPassword;

【讨论】:

也可以只创建TNS_ADMIN环境变量,并在HKLM\Software\Oracle\KEY_OraClient11ghome1处创建TNS_ADMIN的注册表字符串值,两者都与您将保存tnsnames.ora的文件夹路径的值一起,应该是ORACLE HOME/NETWORK/ADMIN。如前所述。 @vapcguy 原来发布者使用的是托管 ODP.NET,它不支持注册表项或环境变量。 嗯,这也是我正在使用的,并且必须实现,包括环境变量,才能让我的工作。没有它们就会出错,这就是我提到它的原因。您可能想再次重新阅读已接受的答案,因为它甚至说明需要找到 TNS_ADMIN 的位置 - machine.config,如您所说(尽管我不能保证),但也可以是环境变量和注册表(Oracle 需要注册表项 - 而不是 .NET)或 web.config(我也没有尝试过)。

以上是关于ODP.Net 中的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 使用ODP.NET Core连接操作Oracle数据库

Oracle10GODP连接11G数据库,出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题

在 oracle sql developer 中加入查询快,在 odp.net 中超慢

ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话结束文件

ODP.NET可以使用实体框架工具支持LDAP吗?

ASP.NET Oracle ODP.NET 集成安全缓慢