如何使用带 Entity Framework 6 的 TNS 别名连接到 Oracle DB?
How to connect to Oracle DB using TNS alias with Entity Framework 6?
在我的设置中,我有一个使用 Visual Studio 2015 构建的 .NET 应用程序试图使用 Entity Framework 6.
访问 Oracle 12c 数据库上的数据
这是我为实现这一目标所做的工作:
- 我按照 a tutorial at oracle.com 了解如何使用 nuget 安装 官方 Oracle ODP.NET、托管 Entity Framework 驱动程序 及其依赖项。
- 我确保可以找到 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: illegal ADDRESS parameters"
跟踪日志显示 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))
)
我做错了什么?
注意:有类似的问题。然而,在那种情况下有用的解决方案在这里没有帮助,并且遇到的异常与这里遇到的异常不同:
- 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
我假设 ODP.NET Managed Driver 找不到您的 tnsnames.ora
文件。 ODP.NET Managed Driver 使用此命令解析别名:
- .NET 配置文件中
<oracle.manageddataaccess.client>
部分下的 dataSources
部分中的数据源别名。
tnsnames.ora
文件中的数据源别名,位于 .NET 配置文件中 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
的注册表中进行设置
ORA-12533: TNS:illegal ADDRESS parameters
Cause: An illegal set of protocol adapter parameters was specified. In some
cases, this error is returned when a connection cannot be made to the protocol transport.
Action: Verify that the destination can be reached using the specified protocol. Check the parameters within the ADDRESS section of TNSNAMES.ORA. Legal ADDRESS parameter formats may be found in the Oracle operating system specific documentation for your platform. Protocols that resolve names at the transport layer (such as DECnet object names) are vulnerable to this error if not properly configured or names are misspelled.
COMMUNITY
是 Oracle 版本 10g 之后 tnsnames.ora
中不支持的网络参数。所以删除此参数并仅保留 (PROTOCOL=tcp)
,这应该可以解决。同时删除第一个 ADDRESS
参数,该参数是为 Oracle Listener.ora
文件指定的。
在我的设置中,我有一个使用 Visual Studio 2015 构建的 .NET 应用程序试图使用 Entity Framework 6.
访问 Oracle 12c 数据库上的数据这是我为实现这一目标所做的工作:
- 我按照 a tutorial at oracle.com 了解如何使用 nuget 安装 官方 Oracle ODP.NET、托管 Entity Framework 驱动程序 及其依赖项。
- 我确保可以找到 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: illegal ADDRESS parameters"
跟踪日志显示 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))
)
我做错了什么?
注意:有类似的问题。然而,在那种情况下有用的解决方案在这里没有帮助,并且遇到的异常与这里遇到的异常不同:
- 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
我假设 ODP.NET Managed Driver 找不到您的 tnsnames.ora
文件。 ODP.NET Managed Driver 使用此命令解析别名:
- .NET 配置文件中
<oracle.manageddataaccess.client>
部分下的dataSources
部分中的数据源别名。 tnsnames.ora
文件中的数据源别名,位于 .NET 配置文件中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
ORA-12533: TNS:illegal ADDRESS parameters
Cause: An illegal set of protocol adapter parameters was specified. In some cases, this error is returned when a connection cannot be made to the protocol transport.
Action: Verify that the destination can be reached using the specified protocol. Check the parameters within the ADDRESS section of TNSNAMES.ORA. Legal ADDRESS parameter formats may be found in the Oracle operating system specific documentation for your platform. Protocols that resolve names at the transport layer (such as DECnet object names) are vulnerable to this error if not properly configured or names are misspelled.
COMMUNITY
是 Oracle 版本 10g 之后 tnsnames.ora
中不支持的网络参数。所以删除此参数并仅保留 (PROTOCOL=tcp)
,这应该可以解决。同时删除第一个 ADDRESS
参数,该参数是为 Oracle Listener.ora
文件指定的。