【发布时间】:2014-07-19 21:44:27
【问题描述】:
问题: 我有一个运行以下更新的 mySql 存储过程:
IF target = 'sup' THEN
UPDATE my_table SET deleted = 1, last_updated = lastUpdate WHERE id = ID AND user_id = accountID;
END IF;
输入参数为:
(IN ID BIGINT, IN lastUpdate DATETIME, IN target VARCHAR(3), IN accountID BIGINT)
当调用这个 sproc 时,mySql 为 user_id 更新表中的所有行,并且似乎忽略了 WHERE 子句中的 id。
背景: 移动应用程序对 .NET Web 服务进行 ajax json 调用,然后调用 mySql sproc。
json调用是这样的:
{"id":["5","6","10"],"lastUpdated":"2014-07-19 22:28:53","target":"sup","accountID":"309"}
在.net webservice,它将每个id条目转换为Int64并将其发送到mySql sproc:
For Each checkedID As String In id
cmd.Parameters.AddWithValue("@ID", CType(checkedID, Int64)).Direction = ParameterDirection.Input
cmd.Parameters.AddWithValue("@lastUpdate", dte).Direction = ParameterDirection.Input
cmd.Parameters.AddWithValue("@target", target).Direction = ParameterDirection.Input
cmd.Parameters.AddWithValue("@accountID", accountID).Direction = ParameterDirection.Input
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()
Next
研究和修复尝试: 大量搜索
使用 MySQL 工作台;直接运行 SQL 会正确更新目标行:
UPDATE my_table SET deleted = 1, last_updated = '1970-01-01 10:10:10' WHERE id = "7" AND user_id = 309;
但是,如果我从 MySQL Workbench 中调用存储过程,它仍然会更新目标用户的所有行:
CALL `my_sproc`(7, '1990-01-01 10:10:10', 'sup', 309);
我看不出存储过程有什么问题,除非我看了太久。移动应用程序有接近 100 个 MySQL 存储区,这是唯一导致问题的存储区。
我被难住了。
【问题讨论】:
标签: mysql asp.net json web-services mysql-workbench