存储过程在执行时返回-1

时间:2015-06-16 07:39:52

标签: sql-server-2008 stored-procedures asp.net-mvc-5

我在SQL Server 2008中有一个存储过程。它接收一个电子邮件作为参数,然后查找链接到它的用户是否有权访问移动MVC 5应用程序。存储过程返回1或0.这是存储过程的代码。

-- Add the parameters for the stored procedure here

    @email varchar(128)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

DECLARE @Check int

SELECT  

    @Check = (
                    SELECT P.MobileRights
                    FROM eMK_Person as P
                    WHERE P.ID = (SELECT FK_Person FROM eMK_contact WHERE eMK_Contact.Information = @Email)
                    )

IF (@Check is null) RETURN 0
RETURN (@Check)

END

GO

在帐户控制器的标准mvc5代码中,我添加了对此存储过程的简单检查,如果结果为0,则应该返回视图。这是我添加到Login任务操作结果中的代码:

var test = db.SP_MB_MobileRights(model.Email);
if (db.SP_MB_MobileRights(model.Email) == 0)
{
    return View(model);
}

我有两个测试帐户。一个拥有权利,一个拥有权利。如果我使用查询在管理工作室中执行存储过程,它就像它应该的那样工作,返回0表示一个,1表示另一个。

但是当我调试代码时,测试变量总是被-1填充。

以下是我将存储过程添加到模型时MVC为我做的代码。

public virtual int SP_MB_MobileRights(string email)
{
    var emailParameter = email != null ?
        new ObjectParameter("email", email) :
        new ObjectParameter("email", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SP_MB_MobileRights", emailParameter);
}

当我通过它进行调试时,我可以清楚地看到emailParameter变量填充了电子邮件地址:

Screen shot of debugged code

1 个答案:

答案 0 :(得分:0)

如果程序要返回1或0,请尝试将程序更改为:

AS
BEGIN
IF EXISTS (SELECT P.MobileRights FROM eMK_Person as P WHERE P.ID = (SELECT FK_Person FROM eMK_contact WHERE eMK_Contact.Information = @Email))
RETURN 1
ELSE
RETURN 0
END

您还应该将查询更改为JOIN而不是子查询。

类似的东西:

SELECT P.MobileRights FROM eMK_Person as P  
     JOIN eMK_contact as C ON c.FK_Person = P.ID WHERE C.Information = @Email