如何从c#中的存储过程(SELECT COUNT)获取值

时间:2014-07-17 20:21:24

标签: c# sql stored-procedures count nullreferenceexception

我使用存储过程来计算和验证数据库中是否已存在用户名,但问题不在那里,我的问题是当我尝试在C#中获取SELECTION的值时在一些博客中我找到了这段代码:

// Create ConnectionString
string connectionString = ConfigurationManager.ConnectionStrings["ProjectPractice"].ConnectionString;

// Check if the username is not in the DataBase
SqlConnection con = new SqlConnection(connectionString);

SqlCommand cmo = new SqlCommand("spBuscaUsuarioMail", con);
cmo.CommandType = CommandType.StoredProcedure;
cmo.Parameters.AddWithValue("@Username", 1);

SqlParameter NroUserName = new SqlParameter("@Num_de_Usuarios", 0);
NroUserName.Direction = ParameterDirection.Output;
cmo.Parameters.Add(NroUserName);

con.Open();

int contarUsername = Int32.Parse(cmo.Parameters["@Num_de_Usuarios"].Value.ToString());

这似乎很棒!看起来功能非常好但是在最后一部分int contarUsername = Int32.Parse... C#给了我一个例外,这是下一个:

  

NullReferenceException未被用户代码处理   对象引用未设置为对象的实例。

然后,在我阅读的疑难解答提示中:

  • 在调用方法之前检查以确定对象是否为空。
  • 使用" new关键字创建对象实例。
  • 获取此例外的一般帮助。

我尝试了很多东西,但现在我觉得很累,我无法在一个新的解决方案中思考。

这是我使用的存储过程:

CREATE PROCEDURE spBuscaUsuarioMail
   @Username CHAR (25),
   @Num_de_Usuarios INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    SELECT @Num_de_Usuarios = COUNT (UserName)
    FROM dbo.Usuarios
    WHERE UserName = @Username
END

EXEC spBuscaUsuarioMail '1', @Num_de_Usuarios OUTPUT
SELECT @Num_de_Usuarios

3 个答案:

答案 0 :(得分:1)

如果不执行该命令,则很难获得输出参数的值

 cmo.Parameters.Add(NroUserName);
 con.Open();
 cmo.ExecuteNonQuery();
 int contarUsername = Convert.ToInt32(cmo.Parameters["@Num_de_Usuarios"].Value);

存储过程的最后两行,如果它们真的在sp代码中是没有意义的,你不需要它们,并且你会在同一个存储过程中得到一个递归调用,直到somethink断开。你应该删除它们

-- remove these two lines
EXEC spBuscaUsuarioMail '1', @Num_de_Usuarios OUTPUT
SELECT @Num_de_Usuarios

另请查看@marc_s的答案,他指出代码中的另一个问题。

答案 1 :(得分:1)

你的参数有问题......

在存储过程中,您有

@Username CHAR (25),
@Num_de_Usuarios INT OUTPUT

在您的C#代码中,您将它们设置为int,似乎:

cmo.Parameters.AddWithValue("@Username", 1);

SqlParameter NroUserName = new SqlParameter("@Num_de_Usuarios", 0);
NroUserName.Direction = ParameterDirection.Output;
cmo.Parameters.Add(NroUserName);

我认为你需要将@Username参数设置为字符串 - 并给它一些有意义的值!

cmo.Parameters.Add("@Username", SqlDbType.Char, 25).Value = "Steve";  // or whatever

当然,正如@Steve已经提到的那样:你需要实际执行你的存储过程才能读出OUTPUT参数!

答案 2 :(得分:0)

这是解决方案。它有效!

            string connectionString = connectionString = ConfigurationManager.ConnectionStrings["ProjectPractice"].ConnectionString;

            SqlConnection con = new SqlConnection(connectionString);

            SqlCommand cmo = new SqlCommand("spBuscaUsuario", con);
            cmo.CommandType = CommandType.StoredProcedure;
            cmo.Parameters.Add("@Username", SqlDbType.Char, 25).Value = txtUsername.Text;
            SqlParameter NroUserName = new SqlParameter("@Num_de_Usuarios", 0);
            NroUserName.Direction = ParameterDirection.Output;
            cmo.Parameters.Add(NroUserName);
            con.Open();
            cmo.ExecuteNonQuery();
            int contarUsername = Int32.Parse(cmo.Parameters["@Num_de_Usuarios"].Value.ToString());

这是存储过程...

CREATE PROCEDURE spBuscaUsuario

@Username CHAR(25), @Num_de_Usuarios INT OUTPUT

AS

BEGIN

SET NOCOUNT ON
SELECT @Num_de_Usuarios = COUNT (UserName)
FROM dbo.Usuarios
WHERE UserName = @Username

END

我希望这段代码对其他人有用。