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

VB.NET升级换Oracle.ManagedDataAccess后更新Oracle报错ORA-32796如何解决?

Oracle.ManagedDataAccess迁移写入报错解决方案

错误1:ORA-32796 报错原因与修复

ORA-32796: cannot update a generated always identity column 报错触发原因是目标表的ID列设置为GENERATED ALWAYS AS IDENTITY类型,Oracle官方禁止手动写入该类列的值。旧版Oracle组件自动生成更新语句时会默认跳过标识列,而Oracle.ManagedDataAccess的动态SQL生成逻辑会默认将查询返回的所有列加入UPDATE语句的SET字段,因此触发限制报错。
可选修复方案如下:

  • 手动指定更新语句,替代自动生成动态SQL的逻辑,UPDATE语句中明确排除ID列,同时指定主键作为过滤条件:
' VB.NET 示例代码
Dim conn As New OracleConnection("你的连接字符串")
Dim updateSql As String = "UPDATE 目标表 SET 需更新字段1 = :val1, 需更新字段2 = :val2 WHERE 主键ID = :pkId"
Dim updateCmd As New OracleCommand(updateSql, conn)
updateCmd.Parameters.Add("val1", OracleDbType.Varchar2, 100, "需更新字段1")
updateCmd.Parameters.Add("val2", OracleDbType.Int32, 0, "需更新字段2")
Dim pkParam = updateCmd.Parameters.Add("pkId", OracleDbType.Int32, 0, "主键ID")
pkParam.SourceVersion = DataRowVersion.Original
yourDataAdapter.UpdateCommand = updateCmd
yourDataAdapter.Update(yourDataTable)
  • 若需保留自动生成SQL的逻辑,填充数据后为DataTable的ID列设置对应属性,告知生成器跳过该列的更新:
yourDataTable.Columns("主键ID").ReadOnly = True
yourDataTable.Columns("主键ID").AutoIncrement = True
yourDataTable.PrimaryKey = New DataColumn() {yourDataTable.Columns("主键ID")}

错误2:Dynamic SQL generation failed 报错修复

该报错触发原因是动态SQL生成逻辑无法自动识别主键列,无法生成UPDATE语句的WHERE过滤条件,只需为DataTable手动指定主键即可修复:

yourDataTable.PrimaryKey = New DataColumn() {yourDataTable.Columns("主键ID列名")}

内容的提问来源于stack exchange,提问作者Jason Shoulders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:54:04