如山圖
錯誤的意思就是 進行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;
這樣的語句,一定要確定 原表和目標表列一致性