必须使用 Oracle.ManagedDataAccess,因其是全托管驱动、不依赖本地 Oracle Client、支持 .NET 6/8 及跨平台,而 System.Data.OracleClient 已移除、Oracle.DataAccess 需安装客户端且易报错。

直接用 Oracle.ManagedDataAccess,别碰 System.Data.OracleClient 或旧版 Oracle.DataAccess —— 前者已废弃,后者必须装 Oracle Client,纯添堵。
为什么必须用 Oracle.ManagedDataAccess?
它是个全托管驱动,不依赖本地 Oracle Client DLL,部署时只扔一个 NuGet 包就行。而 System.Data.OracleClient 在 .NET Framework 4.8 之后就彻底移除了,.NET 6+ 根本没这个命名空间;Oracle.DataAccess(即 ODP.NET Unmanaged)则强制要求安装对应位数的 Oracle Instant Client,稍有不匹配就报 BadImageFormatException 或 ORA-12154。
-
Oracle.ManagedDataAccess支持 .NET 6 / .NET 8,也兼容 Windows/Linux/macOS - 连接字符串语法和旧驱动一致,迁移成本几乎为零
- 自动处理 TNS 解析、连接池、LOB 流式读写,
OracleCommand和OracleParameter行为更贴近 Oracle 实际语义(比如OracleDbType.Varchar2要显式指定长度)
怎么装?NuGet 包名和最低版本要求
在 .NET 8 项目中,运行以下命令:
dotnet add package Oracle.ManagedDataAccess --version 23.7.0
这是截至 2026 年 7 月最新的稳定版,支持 Oracle Database 11gR2 到 23c。不要用带 DevArt 或 Core 后缀的第三方包——它们不是 Oracle 官方维护,长期兼容性无保障。
- 若项目含
Microsoft.EntityFrameworkCore,再加装Oracle.EntityFrameworkCore(注意:它依赖同版本的Oracle.ManagedDataAccess) - VS 中右键项目 → “管理 NuGet 包” → 搜索
Oracle.ManagedDataAccess,勾选“包含预发行版”才能看到 23.x 版本 - 确认 csproj 里是
,不是packages.config方式
连接字符串怎么写?TNS、Easy Connect、Wallet 都行
最常用的是 Easy Connect(不用配 tnsnames.ora):
User Id=hr;Password=hr;Data Source=localhost:1521/XEPDB1
如果用 Oracle Wallet(推荐生产环境),格式是:
User Id=/;Data Source=mywalletalias;Connection Properties="(ENABLE=ON)(CONNECT_TIMEOUT=10)"
-
Data Source字段不支持空格或特殊字符,如含@或:必须 URL 编码 - 连接串里别写
Provider=—— 这是 OleDb 才要的,Oracle.ManagedDataAccess不认 - 加
Validate Connection=true;Connection Timeout=15;可让连接池主动剔除失效连接,避免首次查询卡死
常见报错和对应解法
连不上?先看 OracleException.Number,比错误消息靠谱得多:
-
ORA-12154:服务名解析失败 → 检查Data Source是否拼错,或尝试用完整 Easy Connect 格式host:port/service_name -
ORA-12541:监听器无响应 → 用tnsping XEPDB1或sqlplus hr/hr@localhost:1521/XEPDB1在服务器上验证通路 -
ORA-01017:用户名密码错 → 注意 Oracle 12c+ 默认区分大小写,且密码可能被策略强制重置 -
ORA-00942:表或视图不存在 → 确认用户有权限访问目标 schema,SELECT * FROM all_tables WHERE owner='HR'查一遍
真正容易被忽略的是:.NET 8 默认启用 Trimming(裁剪),若项目设了 ,Oracle.ManagedDataAccess 会丢掉部分反射逻辑,导致 OracleConnection.Open() 直接抛 MissingMethodException。关掉裁剪,或按官方文档加 。











