【发布时间】:2021-11-05 17:42:29
【问题描述】:
我正在尝试在 ASP.NET Core 3.1 中运行 SQL Server 2019 存储过程,但无法正常运行。
我已经实现了存储库布局模式,并使用以下命令获取了数据库对象:
Scaffold-DbContext "Server="";Database="";User ID="";Password="";" Microsoft.EntityFrameworkCore.SqlServer -OutputDir database
执行程序时,如果结果是用户存在于数据库中,则应该返回1,否则返回0。总是返回1给变量“exists”的问题,但我想我是不执行存储过程(它有一个输出参数)或者我不知道该过程是否需要以某种方式导入到应用程序中。
程序示例:
CREATE PROCEDURE [dbo].[LOGIN]
@LOGIN VARCHAR(50),
@PASSWORD VARCHAR(50),
@EXIT INT OUTPUT
BEGIN
IF EXISTS (SELECT USER_APP FROM USERS
WHERE USER_APP = @LOGIN AND PASSWORD = @PASSWORD)
BEGIN
SET @EXIT = 1
RETURN @EXIT
END
SET @EXIT = 0
RETURN @EXIT
END
程序:
private readonly dbContext _context;
public UsuariosRepository(dbContext context)
{
_context = context;
}
public async Task<bool> lOG(string user, string password)
{
try
{
int exists= await _context.Database.ExecuteSqlRawAsync("EXECUTE Login {0},{1}", user, password);
return exists > 0;
}
catch (Exception ex)
{
throw ex;
}
}
根据我在中找到的教程,用我目前拥有的代码更新问题:
https://erikej.github.io/efcore/2020/11/02/ef-core-sproc-return-value.html
var retcode = new SqlParameter
{
ParameterName = "0",
SqlDbType = System.Data.SqlDbType.Int,
Direction = System.Data.ParameterDirection.Output,
Value=0
};
var result = _context.Database.ExecuteSqlRaw("EXEC Login {0},{1},{2}", usuario, password,retcode);
int returnValue = (int)retcode.Value;
即使进行了更改,它对我也不起作用,它会显示以下错误。
Unable to cast object of type 'System.DBNull' to type 'System.Int32
非常感谢您的帮助。
【问题讨论】:
-
我对这些命令进行了测试,但它表明它们在 NetCore 3.1 中已被弃用。谢谢
-
我发现的另一个不一致之处,在您的
store procedure中有RETURN它不应该返回任何内容,因为在store procedure中我们必须使用SELECT声明,我怀疑您的sp可以以这种方式返回1或0,另一件事是您已经定义了3 个参数但传递了2 个应该引发期望的参数,我认为根据您的情况,您应该在sp正文中写DECLARE @EXIT INT而不是定义它。 -
有 3 种方法可以从存储过程中返回信息:返回值 - 应该只用于指示操作的状态,而 not 用于返回业务逻辑,如“用户没有/ 不存在”,OUTPUT 参数发送单个值或一组值,选择一个结果集。你用错了..
-
旁白:请告诉您的新公司停止以纯文本形式存储密码!
标签: c# sql-server asp.net-core asp.net-web-api stored-procedures