在我的设置中,我使用Visual Studio 2015构建了一个.NET应用程序,尝试使用Entity Framework 6访问Oracle 12c数据库上的数据。
这就是我为此所做的努力:
以下是我的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" />
尝试访问数据库时失败,但出现异常:
&#34; ORA-12533:Netzwerksession:Syntaxfehler bei Verbindungstransportadresse&#34;
根据the oracle docs转换为
&#34; ORA-12533:TNS:非法ADDRESS参数&#34;
跟踪日志显示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))
)
我在这里做错了什么?
注意:有类似的问题。但是,在这种情况下帮助的解决方案在这里没有帮助,遇到的例外与此处遇到的例外有所不同:
答案 0 :(得分:2)
我认为ODP.NET托管驱动程序找不到您的tnsnames.ora
文件。 ODP.NET托管驱动程序使用此顺序来解析别名:
dataSources
部分下的<oracle.manageddataaccess.client>
部分中的数据源别名。tnsnames.ora
指定位置的TNS_ADMIN
文件中的数据源别名。位置可以包含绝对或相对目录路径。tnsnames.ora
位于同一目录中的.exe
文件中的数据源别名。请参阅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
答案 1 :(得分:2)
在Oracle版本10g之后,ORA-12533:TNS:非法ADDRESS参数
原因:指定了一组非法的协议适配器参数。在一些 例如,当无法与协议传输建立连接时,将返回此错误 操作:验证是否可以使用指定的协议访问目标。检查TNSNAMES.ORA的ADDRESS部分中的参数。可以在适用于您的平台的Oracle操作系统特定文档中找到Legal ADDRESS参数格式。解析传输层名称的协议(如DECnet对象名称)如果配置不正确或名称拼写错误,则容易受到此错误的影响。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
中的 COMMUNITY
是不受支持的网络参数。所以删除此参数并仅保留tnsnames.ora
,这应该修复。同时删除第一个(PROTOCOL=tcp)
参数,该参数与Oracle ADDRESS
文件不同。