2015-11-04 47 views
0

我无法弄清楚为什么我的存储过程获取-1会是什么原因。SQL Server存储过程在代码隐藏中返回-1

这里代码隐藏代码(C#):

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; 

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

update AppAccessTokens 
set CreateDateTime = GETDATE() 

_response从上面的C#代码总是-1,我真的无法弄清楚这对我拥有。我需要一个新的眼睛来看这个。

我试过重新启动机器,服务器和IIS。 (我知道它没有意义)但没有任何变化,它始终保持-1。

任何人都可以建议我该怎么办?

+2

不要使用'RETURN'来返回自定义值。这是sp执行错误代码(0 - OK,其他错误)**'返回代码通常用于返回错误检查信息**。改用“SELECT”或“output parameter”。 – lad2025

+0

或者,这可能会有所帮助:http://stackoverflow.com/questions/31337492/how-to-identify-whether-sql-job-is-successfully-executed-or-not-in-c-sharp –

+0

@ lad2025 thanks for解释,它帮助! – Hitin

回答

1

这是因为当您的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()); 

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

相关问题