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
相关产品推荐
相关产品推荐

