我如何知道执行更新的SQL Server存储过程是否有效?

时间:2014-12-05 23:45:33

标签: c# sql-server asp.net-mvc-4 stored-procedures

假设我有这个我无法控制的存储过程(并且无法访问第三方数据库)。

我如何知道它是否有效?

BEGIN
        Update USR
        Set usr_psswrd = @NewPassword
        where
            usr_usrnme = @UserName and usr_psswrd = @OldPassword
END

我知道如何在存储过程中有select语句时获取行并读取这些行,但我不知道如何检查此存储过程是否有效。

这就是我到目前为止所做的事情。存储过程有效,因为密码确实发生了变化我事后并不知道该怎么做。

using (SqlConnection connection = new SqlConnection(connectionString))
{
            // Create the command and set its properties.
            SqlCommand command = new SqlCommand();
            command.Connection = connection;
            command.CommandText = "USP_ChangePassword";
            command.CommandType = CommandType.StoredProcedure;

            command.Parameters.Add("@UserName", SqlDbType.VarChar).Value = email;
            command.Parameters.Add("@OldPassword", SqlDbType.VarChar).Value = oldPW;
            command.Parameters.Add("@NewPassword", SqlDbType.VarChar).Value = newPW;

            try
            {
                // Open the connection and execute the reader.
                connection.Open();
                command.ExecuteNonQuery();

                SqlDataReader reader = command.ExecuteReader();

                if (reader.HasRows)
                {
                    success = true;
                }

                reader.Close();

            }
            catch (SqlException ex)
            {
                System.Diagnostics.Debug.Write("SqlException Error " + ex.Number + ": " + ex.Message);
            }
            catch (InvalidOperationException ex)
            {
                System.Diagnostics.Debug.Write("Invalid Op Error: " + ex.Message);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.Write("Error: " + ex.Message);
            }
            finally
            {
                connection.Close();
            }
}

2 个答案:

答案 0 :(得分:5)

在有关ExecuteNonQuery的文档中,您可以找到

> Return Value 
> Type: System.Int32 
> The number of rows affected.

因此您可以将代码更改为

try
{
    // Open the connection and execute the reader.
    connection.Open();
    int rowsUpdated = command.ExecuteNonQuery();
    if(rowsUpdated > 0)
    {
        success = true;
    }
}

这是ExecuteNonQuery的正常行为,但请检查您的存储过程是否包含语句

SET NOCOUNT ON

如果你有这一行,那么ExecuteNonQuery不能返回受影响的行数,你总是得到-1作为返回值。如果您无法更改该存储过程,那么您就遇到了麻烦。

我想到的唯一解决方法是使用SELECT查询取回用户数据并检查插入的数据(非常不舒服的情况)

答案 1 :(得分:3)

如果您查看doco for the ExecuteNonQuery()方法,则会看到它返回int,具体为:

  

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。

因此,如果您执行方法调用并返回1,则可以安全地假设您的字段已成功更新。 这意味着您还应该删除SqlDataReader reader = command.ExecuteReader();行,并添加返回值,例如:

var success = command.ExecuteNonQuery() == 1; 

(这是一种紧凑的方式,你可以把它分成多行)。