如山图

错误的意思就是 进行UPDATE的时候,给定的列名和参数数量不符

排查了很久,一直纠结在MySqlParameter的处理上,结果发现语句

UPDATE `trades` SET `buyernick`=@buyernick,`sellerid`=@sellerid,`receivername`=@receivername,`receivermobile`=@receivermobile,`receiverstate`=@receiverstate,`receivercity`=@receivercity,`receiverarea`=@receiverarea,`receiveraddress`=@receiveraddress,`payment`=@payment,`paytime`=@paytime,`payway`=@payway,`createtime`=@createtime,`modifiedtime`=@modifiedtime,`sellermemo`=@sellermemo,`buyermessage`=@buyermessage,`postfee`=@postfee,`status`=@status,`hasrefund`=@hasrefund,`localstatus`=@localstatus,`platform`=@platform WHERE `Tid`=88166832817679985

  

 

和MySqlParameter内的parameters的对应没有问题,出去溜达了一圈突然想起来

MySqlCommand 在 ExecuteNonQuery 的时候 跟MYSQL的语句执行时一样,如果遇到触发器的错误,会返回触发器的错误

所以这个提示并不一定代表当前的UPDATE语句有问题.

而可能出现在触发器上  果然

一条触发器 

if new.modifiedtime >old.modifiedtime then
insert into tradessnaps select * from trades where tid=old.tid;
end if

  

trades表更新后执行

于是查看 

tradessnaps 表

发现

 

 


 

 

 

 如上图,这条触发器是在订单更新后执行了一个订单的快照表插入工作,而快照表要插入的数据的来源是通过SELECT*得来,所以得到的结果是全部的列的值 而 tradessnap表的列数量要比trades少,没有打到键值的一一对应标准.

所以 

 

1 当出现此错误的时候,检查自己要操作的目标表有没有触发器引发了错误(其他错误也可能因为触发器错误引起),所以触发器要保证绝对的准确性和稳定性,不然不好排查

2 类似 

insert into tradessnaps select * from trades where tid=old.tid; 
这样的语句,一定要确定 原表和目标表列一致性