Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExecuteScalar()方法工作不正常_C#_Sql Server 2008_C# 4.0_Stored Procedures_Ado.net - Fatal编程技术网

C# ExecuteScalar()方法工作不正常

C# ExecuteScalar()方法工作不正常,c#,sql-server-2008,c#-4.0,stored-procedures,ado.net,C#,Sql Server 2008,C# 4.0,Stored Procedures,Ado.net,我有以下功能 public int GetLoginClaim(IsValidLogin Obj) { SqlConnection DBCon = new SqlConnection(ConString); SqlCommand CmdSelect = new SqlCommand("IsValidLogin", DBCon); CmdSelect.CommandType = CommandType.StoredProcedure; DBCon.Open();

我有以下功能

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:对象引用未设置为对象的实例。有人能解决此问题吗?

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

查看这篇MSDN文章中的示例

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

这就是如何在C中获得退货状态#


您是否尝试调试并查看哪个变量为空?是的,检查对象并查看obj.username或obj.password是否为空我没有检查,我现在正在检查它尝试使用select而不是return
select 1,否则选择0
,在.net中您可以使用ExecuteReader()并使用数据[0]值几乎所有
NullReferenceException
的情况都是相同的。请参阅“”以获取一些提示。该示例可能是用java编写的。我不知道如何在C#中使用ado实现它。netException消失了,但在成功匹配时没有返回1。我只是用
if(@UserName=@Password)
用简化的过程尝试了这段代码,它对我来说工作正常。我的意思是,相同的值返回1,不同的值返回0。下面是我使用LinqPad测试它的代码。
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;