最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在.NET应用中捕获Oracle的具体错误号ErrorCode进行分支处理
时间:2026-07-21 09:45:00 编辑:袖梨 来源:一聚教程网
OracleException.ErrorCode返回的是Oracle原生错误号(如1对应ORA-00001),是int类型值,需用数字比较而非字符串解析,且在.NET各版本驱动中行为一致。
OracleException.ErrorCode 返回的是 Oracle 错误号,不是 SQLSTATE
在 .net 中捕获 oracleexception 后,errorcode 属性返回的是 oracle 原生错误号(如 ora-00001 对应的整数 1),不是 sqlstate 或其他数据库通用码。这点和 sqlexception.number 类似,但含义完全由 oracle 定义——比如 errorcode == 1 表示唯一约束冲突,errorcode == 2292 表示外键子记录存在。
常见误区是把它当成字符串(如 "ORA-00001")去比对,实际它就是 int 类型值,必须用数字比较。
-
ErrorCode在 .NET Framework 的Oracle.ManagedDataAccess和 .NET Core/6+ 的Oracle.EntityFrameworkCore中行为一致 - 不要依赖
Message字段做分支判断——语言、格式、附加信息都可能变化 - 若使用旧版
System.Data.OracleClient(已弃用),ErrorCode含义不同,务必确认驱动版本
捕获并区分常见 Oracle 错误号的典型写法
直接 switch ex.ErrorCode 是最清晰的方式,避免字符串解析或正则匹配:
try{ cmd.ExecuteNonQuery();}catch (OracleException ex){ switch (ex.ErrorCode) { case 1: // ORA-00001: unique constraint violated HandleDuplicateKey(); break; case 2292: // ORA-02292: integrity constraint violated - child record found HandleForeignKeyViolation(); break; case 1403: // ORA-01403: no data found (SELECT INTO returned no rows) HandleNoDataFound(); break; default: throw; // 不认识的错误,不吞掉 }}
- Oracle 错误号定义稳定,官方文档可查(如 Oracle Error Messages Guide)
- 建议把常用错误号定义为常量,提高可读性:
const int OracleUniqueConstraint = 1; - 注意:某些错误(如网络中断)可能抛出
OracleException但ErrorCode == 0,需单独处理
EF Core 中如何拿到 OracleErrorCode
EF Core 本身不暴露底层 OracleException,必须从 InnerException 向下剥:
try{ context.SaveChanges();}catch (DbUpdateException ex){ var oracleEx = ex.InnerException as OracleException; if (oracleEx != null && oracleEx.ErrorCode == 1) { // 处理重复键 }}
- EF Core 7+ 的
DbUpdateException可能包装多层异常,InnerException不一定直达OracleException,需递归检查或用ex.InnerException?.InnerException - 若用 EF Core 的
SaveChangesAsync,同样适用,但注意 await 后异常栈位置不变 - 不要依赖
ex.ToString()解析错误号——不可靠且性能差
容易被忽略的兼容性与调试问题
Oracle 错误号看似简单,但在跨环境时容易出错:
- 同一语句在不同 Oracle 版本中可能触发不同错误号(极少见,但如
ORA-01722在某些补丁版本行为微调) - 连接字符串中若启用
Unicode=true或Pooling=false,不影响ErrorCode,但可能改变错误触发时机 - 本地调试时看到的
ErrorCode和生产环境一致,但日志若只记Message就丢失关键分支依据 - 如果用了 Oracle Wallet 或外部认证,部分权限类错误(如
ORA-01031)可能出现在连接阶段,此时异常类型可能是OracleConnectionException,没有ErrorCode属性
真正要靠 ErrorCode 分支的地方,得确保你 catch 的确实是 OracleException,并且它来自执行语句那一刻——不是连接、解析或超时阶段。
相关文章
- 梦幻西游凌波城109级装备搭配 07-28
- 三角洲行动仿星器控制室位于何处 07-28
- 三角洲行动压水堆服务器室在何处 07-28
- 三角洲行动铁路通道何处 07-28
- 三角洲行动托卡马克数据中心在哪 07-28
- 三角洲行动后处理厂机房何在 07-28