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。
【讨论】:
如果您希望在连接字符串中嵌入所有详细信息,则使用 EZ 配置格式比使用 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 中超慢