不能用System.Data.OracleClient,因其在.NET Framework 4.0已标记过时,.NET 8中彻底不存在;必须改用Oracle官方持续维护的纯托管驱动Oracle.ManagedDataAccess。
为什么不能用 System.Data.OracleClient
这个命名空间在 .net 8 中根本不存在——它早在 .net framework 4.0 就被标记为 obsolete,到 4.8 已移除关键 tls 握手能力。项目一引用就编译失败,运行时直接抛 system.io.filenotfoundexception: could not load file or assembly 'system.data.oracleclient'。别试补丁、别改 targetframework 混搭,纯属白费时间。
必须用 Oracle.ManagedDataAccess,且版本要对
这是 Oracle 官方唯一持续维护、纯托管、跨平台、无需本地 Oracle Client 的驱动。NuGet 包名就是 Oracle.ManagedDataAccess(注意不是 Oracle.DataAccess,那是旧版非托管驱动)。
安装命令:
dotnet add package Oracle.ManagedDataAccess
连接字符串中参数前缀是冒号 :,不是 SQL Server 风格的 @:
-
Data Source=localhost:1521/ORCLPDB1;User Id=myuser;Password=mypass;(推荐,Service_Name 方式) - 若强行用 SID,会报
ORA-12505: TNS:listener does not currently know of SID given in connect descriptor—— 因为 Oracle 19c PDB 没有独立 SID
连 19c PDB 必须配 TLS 和服务名,不能靠默认值
Oracle 19c 默认启用 TLS 1.2 且强制校验证书 DN,Oracle.ManagedDataAccess 若不显式声明,握手会静默失败或卡住。
正确连接字符串应包含:
SSL_VERSION=TLSv1.2-
SSL_SERVER_DN_MATCH=yes(关掉等于裸奔,别听网上“临时绕过”的馊主意) Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLPDB1)))
如果应用需同时连多个 PDB(如 HR_PDB、FIN_PDB),不要复用同一个连接字符串变量——每个 PDB 对应独立的 Service_Name,连接池也相互隔离。
用 ORM 而非裸 ADO.NET,SQLSugar 是更稳的选择
直接写 OracleConnection + OracleCommand 容易漏 Dispose、难统一日志、事务分散、参数绑定易错。EF Core 对 Oracle 支持仍偏弱(尤其序列、REF CURSOR、ARRAY 类型),而 SqlSugarCore 更轻量、适配更及时。
只需两步:
- 装包:
dotnet add package SqlSugarCore+dotnet add package Oracle.ManagedDataAccess - 注册时明确指定数据库类型:
DbType = DbType.Oracle,否则会走默认 SQL Server 行为,执行失败
复杂点在于:Oracle 的大小写敏感、双引号标识符、NVARCHAR2 与 VARCHAR2 字段映射、以及 PDB 切换时监听器动态注册延迟——这些不会报错,但查不到数据或插入乱码,得盯紧日志里实际发出的 SQL 和返回的字符集响应。



















