首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在C#代码中MySQL返回总是为1,而在存储过程中测试时却不是?

为什么在C#代码中MySQL返回总是为1,而在存储过程中测试时却不是?
EN

Stack Overflow用户
提问于 2020-01-12 14:21:42
回答 1查看 97关注 0票数 0

我正在使用MySQL开发一个ASP.net应用程序,并且有一个与存储过程返回值相关的问题。

这是我的存储过程:

代码语言:javascript
复制
CREATE DEFINER=`pcg`@`%` PROCEDURE `UpdatePreSellerProfile`(
IN UserID INT(11),
IN SellerImageID INT(11),
IN BusinessImageID INT(11),
OUT ProfileUpdated INT(1)
)
BEGIN
SET @Approved = 'APPROVED';
UPDATE user SET 
    SELLER_IMAGE_ID = COALESCE((SELECT IMAGE_ID FROM image_url WHERE IMAGE_USER_ID = UserID AND IMAGE_ID=SellerImageID),SELLER_IMAGE_ID),
    SELLER_BUSINESS_LOGO_ID = COALESCE((SELECT IMAGE_ID FROM image_url WHERE IMAGE_USER_ID = UserID AND IMAGE_ID=BusinessImageID),SELLER_BUSINESS_LOGO_ID)
WHERE (USER_LOGIN_ID = UserID AND USER_PROFILE_STATUS = @Approved);
SET ProfileUpdated = ROW_COUNT();
END

当我使用下面的MySQL脚本测试这段代码时,当没有更新时,我总是得到0 (@ProfileUpdated)。

代码语言:javascript
复制
call UpdatePreSellerProfile(@UserID, @SellerImageID, @BusinessImageID ,@ProfileUpdated);

但是当我在我的C#代码中检查它时,它总是显示1 (ProfileUpdated)。

代码语言:javascript
复制
if (oMySQLConnecion.State == System.Data.ConnectionState.Open)
{
    MySqlCommand oCommand = new MySqlCommand("UpdatePreSellerProfile", oMySQLConnecion);
    oCommand.CommandType = System.Data.CommandType.StoredProcedure;

    MySqlParameter sqlProfileUpdated = new MySqlParameter("@ProfileUpdated", MySqlDbType.VarString);
    sqlProfileUpdated.Direction = System.Data.ParameterDirection.Output;
    oCommand.Parameters.Add(sqlProfileUpdated);

    oCommand.Parameters.AddWithValue("@UserID", UserID);
    oCommand.Parameters.AddWithValue("@SellerImageID", oSeller.SellerImageID);
    oCommand.Parameters.AddWithValue("@BusinessImageID", oSeller.BusinessLogoID);

    oCommand.ExecuteNonQuery();
    Int16 ProfileUpdated = Convert.ToInt16(oCommand.Parameters["@ProfileUpdated"].Value);

    if (ProfileUpdated > 0) // <<-- Should be greater only if it is updated is sucessfull
    {
        oDBStatus.Type = DBOperation.SUCCESS;
        oDBStatus.Message.Add(DBMessageType.SUCCESSFULLY_DATA_UPDATED);
    }
    else
    {
        oDBStatus.Type = DBOperation.ERROR;
        oDBStatus.Message.Add(DBMessageType.ERROR_NO_RECORDS_UPDATED);
    }
    oMySQLConnecion.Close();
}

为什么MySQL脚本与C#代码之间存在差异?

EN

回答 1

Stack Overflow用户

发布于 2020-01-12 22:00:47

除非您设置了UseAffectedRows连接字符串选项,否则默认为falseThis means

如果为false (默认值),则连接报告将找到行,而不是已更改(受影响)的行。设置为true将仅报告UPDATEINSERT … ON DUPLICATE KEY UPDATE语句实际更改的行数。

此外,还可以从documentation of the ROW_COUNT function

对于UPDATE语句,

-rows值缺省情况下是实际更改的行数。如果在连接到mysqld ed时将CLIENT_FOUND_ROWS标志指定为mysql_real_connect()。注意:这与UseAffectedRows相同,affected rows值是“找到”的行数;也就是说,与WHERE子句匹配。

因此,存储过程中的UPDATE user语句将返回查询找到的行数,而不是实际更新的行数。

要解决此问题,请执行以下任一操作:

  1. 在连接字符串中设置UseAffectedRows=true;;这可能会导致更改其他UPDATE查询。
  2. WHERE子句添加更多条件,例如WHERE ... AND SELLER_IMAGE_ID != SellerImageID AND SELLER_BUSINESS_LOGO_ID != BusinessImageID,以确保只有在确实需要更改行时才能找到并更新该行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59701480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档