【问题标题】:ExecuteScalar() method is not working properlyExecuteScalar() 方法无法正常工作
【发布时间】:2013-07-30 01:44:26
【问题描述】:

我有以下功能;

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:对象引用未设置为对象的实例。谁能解决这个问题?

【问题讨论】:

  • 您是否尝试过调试并观察什么变量为空?
  • 是的,检查对象,看看 obj.username 或 obj.password 是否为空
  • 我没查,我现在查
  • 尝试使用 select 而不是 return Select 1 else Select 0 在.net 中你可以使用 ExecuteReader() 并使用 data[0] 值
  • NullReferenceException 的几乎所有情况都是相同的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

标签: c# sql-server-2008 c#-4.0 stored-procedures ado.net


【解决方案1】:

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

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

如果您想使用ExecuteScalar,则需要在 SP 中将 return(X) 替换为 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;

【讨论】:

  • 那个例子可能是在java中。我不知道如何在 C# 中使用 ado.net
  • 异常消失但匹配成功时不返回 1
  • 我刚刚用if(@UserName=@Password) 的简化程序尝试了这段代码,它对我来说工作正常。我的意思是它为相同的值返回 1,为不同的值返回 0。这里是代码pastebin.com/p6sNiujC我用LinqPad测试过。
猜你喜欢
  • 2019-06-02
  • 2021-12-29
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多