必须使用 oracle.manageddataaccess(无 .core 后缀)连接 .net framework 4.8,因其纯托管、不依赖本地客户端,而 oracle.manageddataaccess.core 不兼容该框架;需通过 nuget 安装同名包,配置 ezconnect 字符串并用 using 确保连接释放。

不能用 Oracle.ManagedDataAccess.Core —— 它压根不兼容 .NET Framework 4.8,连程序集都加载失败。
必须用 Oracle.ManagedDataAccess(非 Core 版)
这是唯一稳定支持 .NET Framework 4.8 的官方 Oracle ADO.NET 驱动。注意名称里没有 .Core 后缀,版本号通常为 21.12.0 或 23.5.0(截至 2026 年中)。NuGet 包 ID 是 Oracle.ManagedDataAccess,不是 Oracle.ManagedDataAccess.Core。
- 安装命令:
Install-Package Oracle.ManagedDataAccess(PowerShell)或通过 NuGet UI 搜索该包名 - 引用命名空间:
using Oracle.ManagedDataAccess.Client;,不是System.Data.OracleClient(后者已废弃且在 .NET Framework 4.8+ 中默认禁用) - 项目目标框架必须是
.NET Framework 4.8,不是.NET Core或.NET 5+;否则会因运行时不匹配导致System.IO.FileNotFoundException或Could not load file or assembly 'Oracle.ManagedDataAccess'
App.config 中的连接字符串写法与常见错误
连接字符串必须显式指定 Data Source(TNS 名或 Easy Connect 字符串),且不能依赖机器上的 tnsnames.ora 文件(除非你额外配置 TNS_ADMIN 环境变量)。
- 推荐写法(Easy Connect):
data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));user id=scott;password=tiger; - 若用 TNS 别名,需确保
TNS_ADMIN指向含tnsnames.ora的目录,并在 config 中写data source=MYDB; - 常见错误:
ORA-12154: TNS:could not resolve the connect identifier specified—— 多半是data source写错,或未配TNS_ADMIN,别急着查防火墙 - 不要在连接字符串里加
Unicode=true(该参数对Oracle.ManagedDataAccess无效,会被忽略)
代码中打开连接的最小可靠模式
OracleConnection.Open() 可能抛出 OracleException 或超时,必须捕获并检查 Connection.State,不能只靠 try/catch 就认为连上了。
- 务必用
using块包裹OracleConnection和OracleCommand,否则连接池耗尽后整个服务会卡死 - 示例关键片段:
using (var conn = new OracleConnection(connectionString)) { try { conn.Open(); if (conn.State != ConnectionState.Open) throw new InvalidOperationException("Connection not open"); // 后续操作 } catch (OracleException ex) when (ex.Number == 1017 || ex.Number == 12154) { // 账号密码错 / 连接串解析失败,日志要记清楚 ex.Message 和 ex.Number } } - 避免手动调用
OracleConnection.ClearPool(conn),除非你明确在做连接故障转移或测试环境重连逻辑
最易被忽略的一点:Oracle.ManagedDataAccess 默认启用连接池,但池行为受连接字符串中 Min Pool Size、Max Pool Size 和 Connection Lifetime 控制;Windows 服务类长期运行程序若没设 Connection Lifetime=0,可能因数据库侧连接老化导致偶发 ORA-03135 断开错误。











