0

我有以下功能;

public int GetLoginClaim(IsValidLogin Obj)
{
    SqlConnection DBCon = new SqlConnection(ConString);
    SqlCommand CmdSelect = new SqlCommand("IsValidLogin", DBCon);
    CmdSelect.CommandType = CommandType.StoredProcedure;
    DBCon.Open();
    try
    {
        CmdSelect.Parameters.AddWithValue("@UserName", Obj.Username);
        CmdSelect.Parameters.AddWithValue("@Password", Obj.Password);

        return (int)CmdSelect.ExecuteScalar();
    }
    catch
    {
        throw;
    }
    finally
    {
        CmdSelect.Dispose();
        DBCon.Close();
        DBCon.Dispose();
    }
}

以及它所依赖的以下存储过程;

USE [SMania]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[IsValidLogin]
@UserName varchar(32),
@Password varchar(32)
As
if exists(Select * From NewClientTB Where UserName = @UserName And Password = @Password)
 return(1)
else
 return(0)

存储过程在 sql server 上执行时工作正常,但是当从我上面发布的函数调用时,它会出错。上面的函数在我的数据访问层。因此,在堆栈跟踪中,我在上述函数中遇到以下错误: NullReferenceException:对象引用未设置为对象的实例。任何人都可以解决这个问题吗?

4

1 回答 1

2

对于具有返回状态的 SP,您需要不同的方法

检查此 MSDN 文章http://msdn.microsoft.com/en-us/library/ms378371(v=sql.90).aspx上的示例

如果要使用,则ExecuteScalar需要在 SP 中替换return(X)为 with select X,因为它“返回结果集中第一行的第一列”,但您的 SP 中没有结果集,仅返回值。

这是在 C# 中获取返回状态的方法

CmdSelect.Parameters.AddWithValue("@UserName", Obj.Username);
CmdSelect.Parameters.AddWithValue("@Password", Obj.Password);

var return_state = CmdSelect.Parameters.Add("@ReturnVal", SqlDbType.Int);
return_state.Direction = ParameterDirection.ReturnValue;

CmdSelect.ExecuteNonQuery();
return (int)return_state.Value;
于 2013-07-30T01:48:28.403 回答