.NET 5 WinForm项目使用Oracle.DataAccess.dll连接远程Oracle数据库时System.EnterpriseServices程序集加载失败
解决.NET 5 WinForm连接Oracle时的System.EnterpriseServices加载错误
你现在的情况是用VS2019在Windows10 64位上开发.NET5的WinForm应用,要连远程Oracle库,已经装了Oracle Client和SQL Dev(能正常连接),但引用了传统的Oracle.DataAccess.dll后跑起来就报错找不到System.EnterpriseServices对吧?
问题根源
你选的Oracle.DataAccess.dll是专门给.NET Framework设计的传统ODP.NET组件,而.NET5属于.NET Core生态,这俩压根不兼容。System.EnterpriseServices是.NET Framework独有的程序集,.NET5里默认没有,所以才会报找不到的错误。
具体解决步骤
- 先删掉错误的引用:在VS项目里把那个
C:\App\db_home\ODP.NET\bin\4\Oracle.DataAccess.dll的引用删掉,别再用它了。 - 装对的组件:打开项目的NuGet包管理器(右键项目→管理NuGet程序包),搜索并安装
Oracle.ManagedDataAccess.Core——这是Oracle官方给.NET Core/.NET 5+准备的纯托管组件,不需要依赖本地Oracle Client,用起来更省心。要是你用EF Core操作数据库,也可以装Oracle.EntityFrameworkCore。 - 调整代码的命名空间:把代码里的
OracleConnection、OracleCommand这些类的命名空间从Oracle.DataAccess.Client改成Oracle.ManagedDataAccess.Client,记得在代码开头加Imports Oracle.ManagedDataAccess.Client。 - 优化连接代码:你的连接字符串格式没问题,不过也可以简化成
User Id=*USER_ID*;Password=*User_PWD*;Data Source=//*Host_URL*:*DB_Port*/*SERVICE_NAME*;。另外给你调整了下代码逻辑,原来的Exit Try没必要,而且成功时应该返回连接对象:Imports Oracle.ManagedDataAccess.Client Public Function OpenOracleBddConnexion() As OracleConnection Dim strOracleConnection As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=*Host_URL*)(PORT=*DB_Port*))) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=*SERVICE_NAME*))); User Id=*USER_ID*;Password=*User_PWD*;" Dim strMsgException As String = "Problème de connexion aux bases Oracles. " & strMsgErrorTellYourAdmin & vbCrLf & "-- Message d'erreur: " Dim conn As New OracleConnection(strOracleConnection) Try conn.Open() Return conn Catch ex As Exception MsgBox(strMsgException & ex.Message, MsgBoxStyle.Critical, "Erreur Connexion Bases Oracle") Return Nothing End Try End Function
额外提示
如果因为特殊需求必须用本地Oracle Client,那得装ODP.NET Core的非托管版本,还要确保Oracle Client是64位(和你的项目平台一致),并且把C:\App\db_home\bin加到系统PATH环境变量里。但还是推荐用托管版本,不用折腾本地客户端的配置。
内容的提问来源于stack exchange,提问作者8oris
相关产品推荐
相关产品推荐

