Как выполнить хранимую процедуру с выходными параметрами, используя FromSqlInterpolated / Database.ExecuteSqlInterpolated в Dot Net Core 3.1? - PullRequest
5 голосов
/ 21 января 2020

Я хотел бы выполнить хранимую процедуру с выходным параметром в Dot Net core 3.1. Я использую ExecuteSqlInterpolated метод расширения класса DatabaseFacade.

C# код, чтобы получить счет сотрудника.

string deptName="IT";
int? employeeCount = null;
Database.ExecuteSqlInterpolated($"exec dbo.usp_GetEmpCountByDept {deptName}, {employeeCount} out");

После выполнения employeeCount равен null, а -1 - возвращаемому значению. Поскольку некоторые люди запрашивали хранимый pro c код для воспроизведения проблемы, я сохранил pro c, как показано ниже

CREATE PROCEDURE usp_GetEmpCountByDept
@Dept nvarchar(20),
@EmpCount int Output
AS
BEGIN
SELECT @EmpCount = COUNT(Id)
FROM [dbo].[Employees] 
WHERE Department = @Dept
END

Ответы [ 2 ]

3 голосов
/ 25 января 2020

Я нашел другой способ, который работает для меня

  1. Добавить пакет Nuget Microsoft.Data.SqlClient

  2. Вместо этого используйте метод ExecuteSqlRaw

Ниже приведен код

    int? employeeCount = null;
    string deptName="IT";

    // Use Microsoft.Data.SqlClient namespace for SqlParameter.Visual studio will suggest  "system.data.sqlclient" which does not work
    var deptNameSQLParam = new Microsoft.Data.SqlClient.SqlParameter("@Dept", deptName);
    var employeeCountSQLParam = new Microsoft.Data.SqlClient.SqlParameter("@EmpCount", SqlDbType.Int) { Direction = ParameterDirection.Output }; 
    Database.ExecuteSqlRaw("exec dbo.usp_GetEmpCountByDept @Dept={0}, @EmpCount={1} out", deptNameSQLParam, employeeCountSQLParam);

     if (employeeCountSQLParam.Value != DBNull.Value)
     {
        employeeCount = (int)employeeCountSQLParam.Value;
     }
1 голос
/ 22 января 2020

ExecuteSqlInterpolated Выполняет заданную SQL для базы данных и возвращает количество затронутых строк.

Вы не можете ожидать, что данные будут возвращены этим методом.

См. Эту документацию MSDN. https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.executesqlinterpolated?view=efcore-3.1

...