6
votes

Comment exécuter une procédure stockée avec des paramètres de sortie à l'aide de FromSqlInterpolated / Database.ExecuteSqlInterpolated dans Dot Net Core 3.1?

Je voudrais exécuter une procédure stockée avec un paramètre de sortie dans Dot Net core 3.1. J'utilise la méthode d'extension ExecuteSqlInterpolated d'une classe DatabaseFacade .

Code C # pour obtenir le nombre d'employés.

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

Après l'exécution, employeeCount est null et -1 est la valeur de retour. Comme certaines personnes ont demandé un code proc stocké pour reproduire le problème, j'ai stocké proc comme ci-dessous

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


3 commentaires

et quel est le code de la procédure stockée?


Veuillez également ajouter un exemple simple de procédure de magasin afin que nous puissions reproduire.


Cette procédure stockée ne renvoie pas de valeur, elle définit un paramètre de sortie. Une procédure stockée peut avoir plusieurs paramètres de sortie. Les méthodes FromSql devront également ajouter un paramètre de sortie.


3 Réponses :


0
votes

ExecuteSqlInterpolated Exécute le SQL donné sur la base de données et renvoie le nombre de lignes affectées.

Vous ne pouvez pas vous attendre à ce que les données soient renvoyées avec cette méthode.

Reportez-vous à cette documentation MSDN. https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.executesqlinterpolated?view=efcore-3.1


0 commentaires

3
votes

J'ai trouvé un autre moyen qui fonctionne pour moi

  1. Ajouter le package Nuget Microsoft.Data.SqlClient

  2. Utilisez plutôt la méthode ExecuteSqlRaw

Ci-dessous le code

    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;
     }


0 commentaires

0
votes

change ça

string deptName="IT";

// make explicit SQL Parameter
var output = new SqlParameter("@EmployeeCount", SqlDbType.Int) { Direction = ParameterDirection.Output };

// use output parameter instead
Database.ExecuteSqlInterpolated($"exec dbo.usp_GetEmpCountByDept {deptName}, {output} out");

// assign output
int? employeeCount = output.Value;

à cela (a fonctionné pour moi avec .NET 5, je ne sais pas plus tôt)

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


0 commentaires