在我的设置中,我有一个使用 Visual Studio 2015 构建的 .NET 应用程序,试图使用 Entity Framework 6 访问 Oracle 12c 数据库上的数据。
这是我为实现这一目标所做的事情:
- 我在 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"
根据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))
)
我在这里做错了什么?
注意:有类似的问题。但是,在那种情况下有帮助的解决方案在这里没有帮助,并且遇到的异常与这里遇到的不同: