首先,我要感谢所有阅读并回答的人。非常感谢您的帮助!
我一直在开发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] 删除。
我来说两句