c# - C# 存储过程返回标量
问题描述
我有一个将返回 1 或 0 的存储过程。我似乎无法将它正确地包装在 C# 函数中。任何帮助表示赞赏。
这是我的存储过程(我已经在 SQL Server 中测试过并且可以正常工作):
CREATE PROCEDURE VerifyAccount
@Email VARCHAR(50),
@Pass VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Salt CHAR(25);
DECLARE @PwdWithSalt VARCHAR(125);
DECLARE @PwdHash VARBINARY(20);
SELECT @Salt = Salt, @PwdHash = Pass
FROM users
WHERE EMAIL = @Email;
SET @PwdWithSalt = @Salt + @Pass;
IF (HASHBYTES('SHA1', @PwdWithSalt) = @PwdHash)
RETURN 1;
ELSE
RETURN 0;
END;
如果我打开一个新的 SQL 查询并运行此代码,它可以工作:
DECLARE @Result INT;
EXEC @Result = VerifyAccount
@Email = 'myemail@email.com', @Pass = 'Str0ngP@ssw0rd!';
SELECT @Result;
当我尝试将它包装在 C# 代码中时,它返回一个 -1 值,这在此过程中是不可能的。它应该返回一个“1”。我究竟做错了什么?
public static int ValidateUser(User user)
{
int result = 0;
using (SqlConnection conn = new SqlConnection(SQLQuery.connDb))
{
using (var command = new SqlCommand("VerifyAccount", conn)
{
CommandType = CommandType.StoredProcedure,
Parameters =
{
new SqlParameter("@Email", user.Email),
new SqlParameter("@Pass", user.Password)
}
})
{
try
{
conn.Open();
result = command.ExecuteNonQuery();
conn.Close();
}
catch (Exception e)
{
result = -15;
Console.WriteLine(e.Message);
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
}
return result;
}
解决方案
ExecuteNonQuery 返回受影响的行数
你需要
result = (int)command.ExecuteScalar();
推荐阅读
- hyperledger-fabric - 在同一组织的多个对等点上安装智能合约
- jupyter-notebook - 如何在 Databricks 笔记本中捕获单元格的输出
- performance - 为什么 arm64 ABI 中不使用 SVC 的立即数?
- javascript - 两个 Django 表单 - 带有两个提交按钮的 Html 页面
- python - Tensorflow keras model.save 使用自定义层引发 InaccessibleTensorError
- docker - 从 docker 容器提交时,Spark 作业未安排给工作人员
- csvhelper - 使用 CsvHelper 将不同的列标题名称映射到 C# 实体类中的单个字段
- reactjs - react dropzone,限制上传的图片数量,超过限制时给出错误消息
- amazon-web-services - 如何监控和调试 AWS 中对 s3 的每个请求?
- actions-on-google - 已部署但未调用 Google 操作