You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm中OracleDataAdapter更新数据后查询不到最新记录问题

问题原因梳理

导致你遇到查询返回0行、更新结果未持久化的原因主要有以下几点:

  • 事务未提交导致变更回滚
    Oracle默认使用手动提交事务模式,OracleDataAdapter执行Update方法时不会自动提交事务。如果你的base.Connection没有被显式开启并持有事务,OracleDataAdapter的Fill、Update方法会自动打开连接,操作完成后自动关闭连接,连接关闭时未提交的事务会直接回滚,所有更新操作的变更都没有实际写入数据库。你在数据库客户端查询到的是之前已经提交的数据,而代码中更新后的变更已经被回滚,自然查询不到符合条件的记录。
  • 更新参数缺失导致更新未生效
    PerformOperation1中的更新SQL语句update results set count_1 = :count_1, count_2 = :count_2 WHERE seq_1 = :seq_1一共用到3个参数,但代码中仅添加了:count_1、:count_2两个参数,缺失了WHERE条件中:seq_1参数的绑定,导致更新语句执行时匹配不到任何数据行,更新操作实际没有修改任何记录。按照你描述的PerformOperation2和PerformOperation1逻辑完全一致的写法,PerformOperation2也会缺失:seq_1参数,is_valid字段的更新同样没有生效,后续查询is_valid = 'Y'的条件自然无法匹配到记录。
  • 参数绑定规则不匹配导致更新失败
    Oracle的OracleCommand默认按照参数添加的顺序绑定参数,而非按照参数名绑定。即使你为参数设置了和SQL中一致的名称,只要添加顺序和SQL语句中参数出现的顺序不一致,也会导致参数赋值错误,更新条件匹配失败,更新不生效。
  • 代码笔误导致行数统计错误
    你提供的代码中统计行数的语句var count = data.Rows.Count;存在明显错误:data是OracleDataAdapter实例,本身不存在Rows属性,正确的取值应该是table.Rows.Count,如果实际代码也是这种写法,不管查询结果有多少行,这里的返回值永远是0。
  • 多余的垃圾回收逻辑不影响结果,但会严重拖慢执行效率
    循环内强制调用GC.Collect()和GC.WaitForPendingFinalizers()是完全无用的代码,不会对数据库操作产生任何影响,但是会导致方法执行速度大幅变慢,建议直接删除。

内容的提问来源于stack exchange,提问作者A J Qarshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:15:05