首页 > 解决方案 > 从 C# 中的 vs 中的存储过程获取返回值

问题描述

我有一个数据库上下文文件,我在 SQL 中的 SSMS 中创建了一个过程:-

alter procedure gross_Sal(@empID int,@annual_sal int output)
as
begin
SELECT @annual_sal=SAL*12from EMP WHERE EMPNO=@empID
end

declare @ans int;
exec gross_Sal 1111, @annual_sal=@ans output;

select @ans as 'gross salary';

这在 SQL 中工作正常,但我不知道如何在 c# 中调用它

我已经写了代码:-

   private static void paramProc()
    {
            var ctx = new trainingContext();
            var param = new SqlParameter[] {
                new SqlParameter()
                {
                    ParameterName="@empno",
                    SqlDbType=System.Data.SqlDbType.Int,
                    Size =100,
                    Direction=System.Data.ParameterDirection.Input,
                    Value = 1111
                },
                new SqlParameter()
                {
                    ParameterName="@annual_sal",
                    SqlDbType=System.Data.SqlDbType.Int,
                    Size =100,
                    Direction=System.Data.ParameterDirection.Output,
                }
            };
            var ans = ctx.Emps.FromSqlRaw("@ans int");
            var result = ctx.Emps.FromSqlRaw("gross_Sal @empno, @annual_sal = @ans output", param[0],param[1]);
            Console.WriteLine("gross sal of the emp "+ans);
        }}

我的 c# 代码中可能有一个重大错误,但请帮助我。

我得到这个作为输出: -

     gross sal of the emp Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[HW_SQL.Models.Emp]

编辑1:-我试过这个:-

var result = ctx.Emps.FromSqlRaw($"EXEC gross_Sal  @empID, @annual_sal OUTPUT", param[0], param[1]).AsEnumerable().FirstOrDefault();
 Console.WriteLine("gross salary="+param[1].Value);

它将捕获块并显示错误。

   error

标签: c#sql-serverentity-framework

解决方案


这解决了问题:-

 ctx.Database.ExecuteSqlRaw("gross_Sal @empID, @annual_sal OUTPUT", param);
 Console.WriteLine("gross sal of the emp "+param[1].Value);

我正在使用 FromSqlRaw,我必须使用 EXEC 使其像这样工作:-

var result = ctx.Emps.FromSqlRaw($"EXEC gross_Sal  @empID, @annual_sal OUTPUT", param[0], param[1]).AsEnumerable().FirstOrDefault();
Console.WriteLine("gross salary="+param[1].Value);

但这引发了一个没有消息的错误。但是,使用

ctx.Database.ExecuteSqlRaw("gross_Sal @empID, @annual_sal OUTPUT", param);

你可以直接执行它。

我希望它可以帮助面临同样问题的人。


推荐阅读