2013-07-30 115 views
0

我有以下功能;ExecuteScalar()方法无法正常工作

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:未将对象引用设置为对象的实例。任何人都可以解决这个问题

+0

你尝试调试和看什么变量为空? – eKek0

+0

是,检查对象,看看是否obj.username或obj.password为null – user710502

+0

我没有检查,我检查现在 – user2599269

回答

2

您需要的SP不同的方式与返回状态

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

如果你想使用ExecuteScalar你需要在SP与select X更换return(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; 
+0

这个例子可能在java中。我无法得到这个想法如何在C#中使用ado.net – user2599269

+0

你是对的,我已经用C#更新了答案示例 – dmay

+0

异常消失,但在成功匹配时不返回1 – user2599269