QueryRowImpl 最终块中的 cmd.Cancel() 在 Oracle 数据库查询中导致 ORA-1013 错误
作者: Raveendra-Pai创建于 2026年6月19日更新于 2026年7月11日
□ 总结
" QueryRowImpl < T > 中的最后 ' 块在读者时称为cmd.Cancel ()'
不作废也无闭. 虽然这与 SQL Server 安全工作,但它会导致甲骨文
将ORA-1013 (“用户要求取消当前操作”) 提升到任何
非快乐路径退出方法。
□ 受影响的方法
" SqlMapper.cs " – 韦里·罗林普尔 < T >
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 终于 { 如果( 阅读不为无效) { 如果 (! reader. 已关闭) { 尝试 {cmd?.Cancel ();} 抓取 { / * 不破坏任何已有的例外* /} {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 阅读器。处理( I) ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 如果( 已关闭) cnn. Close (); 算术? 清除( C) ; cmd?. 处理(); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
□ 根源
`cmd.Cancel()'在最后决定之前未处理`阅读者'时即送达
块。 这发生在**所有非幸福路径**,包括:
最终,
|-|-|-.
快乐之路(找到、处理)
`ThrowZeroRows()'称`不'-`Cancel()'开火'
`扔出多管()'称`不'-`放弃()'发射'
* 任何例外,如中读作 * * * * * * * * * *
在**SQL Server**上,`cmd.Cancel ()'是一种安全和常见的清理模式。
在**Oracle(ODP.NET / Oracle.ManagedDataAccess)**上,它发出明确取消通知.
向服务器发出信号,将 ORA-1013 提升为硬错误——掩盖
原始例外(如"找不到行","多行",或查询出错等).
□ 行为差异
- ** SQL 服务器**:`cmd.Cancel()'-默默承认,释放资源
- ** Oracle**:`cmd.Cancel()'-提出`ORA-1013',表面为不相干错误
应用程序中
# 工作间 #
在评论`cmd.Cancel ()'呼吁时,这一问题得到解决。 `阅读者.处理()'
单凭一个人就可以清理甲骨文——明确取消是不必要的.
和有害。
□ 建议修补
考虑将取消行为以提供者为条件, 或将其删除
完全因为“ reader.Dispose()” 已经处理过所有主要提供者的清理:
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
/ 如果 (! reader. Is Closed) (中文(简体) ).
//{{
//cmd. Cancel () 在甲骨文上触发了ORA-1013(见问题QQ).
/ 读取. 下面的处理( ) 足以在提供者之间进行清理 。
// 尝试 {cmd?.Cancel ();}
// catch {/* 不破坏任何现有的例外*/}
//].虽然提供者-不可知办法(仅去掉电话)较清洁, `处理() ' 已足够。
□ 环境
- Dapper版本:最新版本( " 主要分支 " )
- 甲骨文驾驶员:
甲骨文. 管理数据存取. 核心 - .NET版本:.NET 10
- 数据库:甲骨文
^ 参考文献
- Oracle ORA-1013: https://docs.oracle.com/error-help/db/ora-01013/ (中文(简体) )
内容来源: DapperLib/Dapper