如何正确捕获从调用到存储过程的返回值

本文关键字:存储过程 返回值 调用 何正确 | 更新日期: 2023-09-27 18:31:30

首先,我要感谢任何阅读本文并回答的人。非常感谢您的帮助!

我一直在开发一个 ASP.NET 的Web应用程序,我需要在其中读取和写入数据库。为此,我一直试图从我的 C# 代码调用我编写的一些存储过程。具体来说,这个:

public static bool userExistsInDB(string username)
{
    int userExistsInDB = -1;
    using (SqlConnection con = new SqlConnection(DBConfig.DbConnectString))
    {
        using (SqlCommand cmd = new SqlCommand("tb_user_exists", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username;
            con.Open();
            userExistsInDB = cmd.ExecuteNonQuery();
        }
    }
    return userExistsInDB == 1;
}

我调用的存储过程是使用以下 SQL 脚本创建的:

CREATE PROCEDURE tb_is_logged_in
    @username VARCHAR(20)
AS
IF(EXISTS(SELECT * FROM logged_in_users WHERE "username" = @username))
BEGIN
    RETURN 1; 
END
ELSE
BEGIN
    RETURN 0; 
END

我在SQL Server Management Studio中自行测试了它,它似乎可以工作。但是,在单步执行我的 C# 代码时,我发现该行有问题

userExistsInDB = cmd.ExecuteNonQuery();

如果数据库中是否存在指定的用户,则存储过程应分别返回 1 或 0,并且如您所见,userExistsInDB使用 -1 初始化。但是,在执行行userExistsInDB = cmd.ExecuteNonQuery();userExistsInDB永远不会修改;它始终保留值-1 .所以似乎我错误地获取了返回值。我做错了什么?

编辑:

多亏了莱昂内尔,我找到了解决问题的方法。首先,我意识到我上面粘贴的存储过程不是正确的过程。它不是我在 C# 代码中实际调用的那个,当我尝试 Leonel 的修复程序时,它不起作用,因为我不小心编辑了上面粘贴的过程而不是我实际调用的过程。这是我调用的实际存储过程:

CREATE PROCEDURE tb_user_exists
    @username VARCHAR(20)
AS
IF(EXISTS (SELECT * FROM users WHERE username = @username))
BEGIN
    RETURN 1;  
END
ELSE
BEGIN
    RETURN 0; 
END

我的解决方案如下:更改此行

userExistsInDB = cmd.ExecuteNonQuery();

userExistsInDB = (int)cmd.ExecuteScalar();

并将存储过程更改为:

CREATE PROCEDURE tb_user_exists
    @username VARCHAR(20)
AS
IF(EXISTS (SELECT * FROM users WHERE username = @username))
BEGIN
    SELECT 1;  
END
ELSE
BEGIN
    SELECT 0; 
END

如何正确捕获从调用到存储过程的返回值

使用 MSDN 中的SqlCommand.ExecuteScalar();方法

例如:

userExistsInDB = (int)cmd.ExecuteScalar();

示例代码将执行SqlCommand并检索表的第一行(如果存在),并将变量的值设置为表中的项目数。在这种情况下,您可以删除 return 语句并使用

SELECT * FROM logged_in_users WHERE "username" = @username

并且使用后始终关闭连接

con.Open();
userExistsInDB = cmd.ExecuteScalar();
con.Close();

如果你只得到一个值,executeScalar() 就足够了。如果您仍有问题,可以询问

String get;
Get=cmd.executescalar().tostring();