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;