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 Réponses :
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
J'ai trouvé un autre moyen qui fonctionne pour moi
Ajouter le package Nuget Microsoft.Data.SqlClient
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; }
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");
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.