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

汤姆

首先,我要感谢所有阅读并回答的人。非常感谢您的帮助!

我一直在开发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所以看来我得到的返回值是错误的。我究竟做错了什么?

编辑:

感谢Leonel,我找到了解决问题的方法。首先,我意识到我上面粘贴的存储过程不是正确的过程。这不是我实际上在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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

在调用存储过程的方法中返回值

来自分类Dev

如何在Slick中调用存储过程并获取返回值(使用Scala)

来自分类Dev

如何使用存储过程的返回值设置值

来自分类Dev

如何从存储过程中获取返回值

来自分类Dev

如何从存储过程中获取返回值

来自分类Dev

如何正确捕获unix命令的返回值?

来自分类Dev

调用参数化的存储过程,该过程在C#中返回值

来自分类Dev

存储过程结果集与返回值

来自分类Dev

存储过程未返回值

来自分类Dev

MySQL存储过程返回值

来自分类Dev

存储过程未返回值

来自分类Dev

MySQL存储过程返回值错误

来自分类Dev

无法从存储过程获取返回值

来自分类Dev

不从ASP Classic中的存储过程中捕获返回值

来自分类Dev

Visual Basic 2019:调用SQL Server存储过程并存储返回值

来自分类Dev

如何从Scheme中的递归调用正确返回值?

来自分类Dev

如何从Scheme中的递归调用正确返回值?

来自分类Dev

如何在SystemVerilog中存储$ system(“ ...”)调用的返回值?

来自分类Dev

调用存储过程时,在C#中获取返回值和一组记录

来自分类Dev

调用存储过程,返回值,经典ASP我缺少什么?

来自分类Dev

将存储过程的返回值存储在变量中

来自分类Dev

将存储过程的返回值存储在变量中

来自分类Dev

如何将存储过程的返回值用作列中的默认值?

来自分类Dev

存储过程没有返回正确的值

来自分类Dev

存储过程在被另一个存储过程调用时没有返回正确的值

来自分类Dev

如何从实体框架的存储过程中获取返回值?

来自分类Dev

我如何检查实体框架中存储过程的返回值

来自分类Dev

如何在存储过程中使用查询的返回值

Related 相关文章

  1. 1

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

  2. 2

    在调用存储过程的方法中返回值

  3. 3

    如何在Slick中调用存储过程并获取返回值(使用Scala)

  4. 4

    如何使用存储过程的返回值设置值

  5. 5

    如何从存储过程中获取返回值

  6. 6

    如何从存储过程中获取返回值

  7. 7

    如何正确捕获unix命令的返回值?

  8. 8

    调用参数化的存储过程,该过程在C#中返回值

  9. 9

    存储过程结果集与返回值

  10. 10

    存储过程未返回值

  11. 11

    MySQL存储过程返回值

  12. 12

    存储过程未返回值

  13. 13

    MySQL存储过程返回值错误

  14. 14

    无法从存储过程获取返回值

  15. 15

    不从ASP Classic中的存储过程中捕获返回值

  16. 16

    Visual Basic 2019:调用SQL Server存储过程并存储返回值

  17. 17

    如何从Scheme中的递归调用正确返回值?

  18. 18

    如何从Scheme中的递归调用正确返回值?

  19. 19

    如何在SystemVerilog中存储$ system(“ ...”)调用的返回值?

  20. 20

    调用存储过程时,在C#中获取返回值和一组记录

  21. 21

    调用存储过程,返回值,经典ASP我缺少什么?

  22. 22

    将存储过程的返回值存储在变量中

  23. 23

    将存储过程的返回值存储在变量中

  24. 24

    如何将存储过程的返回值用作列中的默认值?

  25. 25

    存储过程没有返回正确的值

  26. 26

    存储过程在被另一个存储过程调用时没有返回正确的值

  27. 27

    如何从实体框架的存储过程中获取返回值?

  28. 28

    我如何检查实体框架中存储过程的返回值

  29. 29

    如何在存储过程中使用查询的返回值

热门标签

归档