SQL Server存储过程在codebehind中返回-1

时间:2015-11-04 14:09:11

标签: c# asp.net stored-procedures sql-server-2008-r2

我无法弄清楚为我的存储过程获得-1的原因是什么。

这里代码背后的代码(C#):

ContentProvider

这是我的存储过程代码:

SqlCommand _command = _connection.CreateCommand();
_command.CommandText = "usp_ZX_GetValidToken";
_command.CommandType = CommandType.StoredProcedure;
_command.Parameters.AddWithValue("@tokenstring", tokenString);
_command.Parameters.AddWithValue("@difference", lifeInSeconds);    
Object _response = _command.ExecuteNonQuery();

哦,是的!我还确保我的表有正确的数据,并且我总是在调用过程之前执行下面的代码:

CREATE procedure [dbo].[usp_ZX_GetValidToken]
    @tokenstring nvarchar(50), @difference int
AS
    IF EXISTS(SELECT * FROM AppAccessTokens 
              WHERE Consumed = 0 AND GUIDToken = RTRIM(@tokenstring) 
                AND DATEDIFF(SECOND, CreateDateTime, GETDATE()) <= @difference)
       RETURN 1;
    ELSE
       RETURN -1;

上述C#代码中的update AppAccessTokens set CreateDateTime = GETDATE() 总是_response,我真的无法自己解决这个问题。我需要重新审视这个。

我尝试重启机器,服务器和IIS。 (我知道它没有意义)但没有任何改变,它始终保持返回-1。

有人可以建议我该怎么办?

1 个答案:

答案 0 :(得分:2)

这是因为当您的SP执行时,它不会影响任何行,因此ExecuteNonQuery将始终返回0。像这样更改您的SP: -

IF EXISTS(SELECT * FROM AppAccessTokens WHERE Consumed = 0 
                  AND GUIDToken = RTRIM(@tokenstring) AND
 DATEDIFF(SECOND, CreateDateTime, GETDATE()) <= @difference)
 SELECT 1;
 ELSE
 SELECT -1;

然后使用ExecuteScalar执行它,它将读取第一列的第一行,我们只在SP中选择1个值,因此_response将获得正确的值: -

int _response = Convert.ToInt32(_command.ExecuteScalar());

或者,您也可以使用输出参数。