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

本文关键字:COUNT 获取 SELECT 存储过程 | 更新日期: 2023-09-27 18:13:19

我使用存储过程来计数和验证数据库中是否已经存在用户名,但问题不存在,我的问题是当我试图获得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

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

您的参数有问题....

在存储过程中,有

@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参数之前,您需要实际执行您的存储过程!

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

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

存储过程的最后两行,如果它们真的在sp代码中,那么它们是没有意义的,你不需要它们,你对同一个存储过程进行递归调用,直到某些思维中断。你应该删除它们

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

再看看@marc_s的回答,他指出了你代码中的另一个问题。

这就是解决方案。它的工作原理!

            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

@Username CHAR (25),@Num_de_Usuarios INT OUTPUT

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

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