如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?
Posted
技术标签:
【中文标题】如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?【英文标题】:How to connect to Oracle DB using TNS alias with Entity Framework 6? 【发布时间】:2017-02-13 15:23:18 【问题描述】:在我的设置中,我有一个使用 Visual Studio 2015 构建的 .NET 应用程序,试图使用 Entity Framework 6 访问 Oracle 12c 数据库上的数据。
这是我为实现这一目标所做的:
我关注a tutorial at oracle.com 了解如何使用 nuget 安装官方 Oracle ODP.NET、托管实体框架驱动程序及其依赖项。 我确保可以找到 tnsnames.ora 和 sqlnet.ora。 (环境变量TNS_ADMIN配置正确) 我为 oracle 驱动程序启用了跟踪日志记录,以查看此处实际发生的情况。 我创建了一个映射一些实体的 EDMX 文件(这已经需要下面描述的解决方法)这是我的 App.config 的样子(引入换行符以提高可读性):
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TraceLevel" value="7" />
<setting name="TraceOption" value="0" />
<setting name="TraceFileLocation" value="C:\Temp" />
<setting name="TNS_ADMIN" value="c:\Temp\tns" />
</settings>
</version>
</oracle.manageddataaccess.client>
<connectionStrings>
<add name="MyModel"
connectionString="metadata=res://*/UDBModel.csdl|res://*/UDBModel.ssdl|res://*/UDBModel.msl;
provider=Oracle.ManagedDataAccess.Client;
provider connection string="User Id=*****;Password=*****;Data Source=MYDATASOURCE.WORLD;""
providerName="System.Data.EntityClient" />
尝试访问数据库时失败并出现异常:
“ORA-12533:Netzwerksession:Syntaxfehler bei Verbindungstransportadresse”
根据the oracle docs翻译成
“ORA-12533: TNS: 非法地址参数”
跟踪日志显示 tnsnames.ora 已正确解析。
当使用 IP 地址和端口而不是 TNS 名称时,连接工作正常。但由于 tnsnames.ora 由我们公司的数据库管理员管理,因此无法使用 IP 地址寻址服务器。
我还应注意,较旧的驱动程序(例如 Oracle.DataAccess.dll)使用此设置访问数据库没有问题。
编辑:这是我现在使用的 tnsnames.ora 文件:
MYDATASOURCE.WORLD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = MYDATASOURCE))
(ADDRESS = (COMMUNITY = TCP.world)(PROTOCOL = TCP)(Host = myds.example.com)(Port = 1530)))
(CONNECT_DATA = (SID = MYDATASOURCE))
)
我在这里做错了什么?
注意:有类似的问题。但是,在那种情况下有帮助的解决方案在这里没有帮助,并且那里遇到的异常与这里遇到的不同:
Opening Oracle OleDb connection succeeds, while managed driver connection fails Unable to connect to Oracle using TNS and C# Can't connect to Oracle using tns Entity Framework Code First and Oracle ODAC 12c Release 3 Error Oracle.ManagedDataAccess not resolving alias in connection string Entity framework connection with oracle databse【问题讨论】:
看看这个:oraclenerd.com/2010/02/… @WernfriedDomscheit 谢谢,但 tnsnames.ora 中的行首没有空格。 【参考方案1】:ORA-12533:TNS:非法地址参数
原因:指定了一组非法的协议适配器参数。在一些 在这种情况下,当无法与协议传输建立连接时会返回此错误。操作:验证是否可以使用指定的协议到达目的地。检查 TNSNAMES.ORA 的 ADDRESS 部分中的参数。可以在您平台的 Oracle 操作系统特定文档中找到合法的 ADDRESS 参数格式。如果未正确配置或名称拼写错误,则在传输层解析名称(例如 DECnet 对象名称)的协议很容易受到此错误的影响。
COMMUNITY
是 Oracle 版本 10g 之后 tnsnames.ora
中不支持的网络参数。所以删除这个参数并只保留(PROTOCOL=tcp)
,这应该可以解决。同时删除第一个 ADDRESS
参数,该参数用于 Oracle Listener.ora
文件。
Unsupported Parameters
【讨论】:
事实证明——重新添加COMMUNITY
-参数并没有什么坏处。真正的问题是用于 listener.ora 文件的地址行。【参考方案2】:
我假设 ODP.NET 托管驱动程序找不到您的 tnsnames.ora
文件。 ODP.NET Managed Driver 使用此顺序来解析别名:
-
.NET 配置文件中
<oracle.manageddataaccess.client>
部分下的dataSources
部分中的数据源别名。
tnsnames.ora
文件中的数据源别名,位于 .NET 配置文件中 TNS_ADMIN
指定的位置。位置可以由绝对或相对目录路径组成。
与.exe
位于同一目录中的tnsnames.ora
文件中的数据源别名。
见Data Provider for .NET Developer's Guide
如您所见,ODP.NET 托管驱动程序不会读取环境变量来确定 TNS_ADMIN
的值。检查您的 .NET 配置文件(即machine.config
、web.config
、user.config
)
顺便说一句,您可以运行set NLS_LANG=AMERICAN_GERMANY
来获取英文错误消息。你也可以在你的注册表中设置这个HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
【讨论】:
感谢您的回答。但正如我所写:“跟踪日志显示 tnsnames.ora 已正确解析。” 我仍然将TNS_ADMIN
设置添加到 App.config 文件中。正如我从日志中看到的那样,该文件是从指定位置加载的...以上是关于如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?的主要内容,如果未能解决你的问题,请参考以下文章