违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 重写后解决

本文介绍了一次Oracle数据库批量更新操作中遇到的问题及解决方法。主要问题为违反并发性错误,即UpdateCommand影响了预期1条记录中的0条。通过调整代码结构并重新配置OracleDataAdapter与OracleCommand参数成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因由:

之前很少接触数据库连接的底层,对此了解甚少。 最近有需求大量修改数据,遂搜到两篇文章

   1<Oracle批量导入100万条数据不到1秒>http://blog.youkuaiyun.com/mrobama/article/details/53813133

   2<Oracle Data Provider for .NET 的使用经验(2 )>http://blog.youkuaiyun.com/xinsir/article/details/1014696

以文章2为底本写了个段UpdateCommand 发现报错如下:违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 解决办法 

网上说可能是由于 #1 检查是否设有主键#2检查更新的字段的原始值是否为空值 两个问题引起的 

逐一解决 未果

最后到msdn上寻找答案 

https://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracledataadapter.updatecommand(v=vs.110).aspx

解决:

由原文的          //更新用的oracle command
            oraParameter = new OracleParameter("I_VPAYPASSWORD", OracleDbType.Varchar2, 2000);
            oraParameter.SourceColumn = "VPAYPASSWORD";//更新字段值
            oraParameter.SourceVersion = DataRowVersion.Current;
            cmdUpdate.Parameters.Add(oraParameter);

散布在过程代码里

改为:实例化一个OracleDataAdapter 

  OracleDataAdapter cca =  CreateCustomerAdapter(con);
           nRecCount=cca.Update(i_Data);
实现如下
 public static OracleDataAdapter CreateCustomerAdapter(OracleConnection conn)
        {
            OracleDataAdapter da = new OracleDataAdapter();
            OracleCommand cmd;
            OracleParameter parm;

            // Create the UpdateCommand.

            cmd = new OracleCommand("UPDATE tableA SET Current = :I_Current  WHERE  Orig= :I_Orig", conn);

            cmd.Parameters.Add("I_Current", OracleDbType.Varchar2, 2000, "Current");
            //cmd.Parameters.Add("pDName", OracleType.NVarChar, 14, "DName");

            parm = cmd.Parameters.Add("I_Orig", OracleDbType.Varchar2, 10, "Orig");
            parm.SourceVersion = DataRowVersion.Original;

            da.UpdateCommand = cmd;

            return da;
        }









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值