如山图
错误的意思就是 进行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;
这样的语句,一定要确定 原表和目标表列一致性