2013-07-30 112 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