Est-ce que quelqu'un pourrait me guider sur la façon d'exécuter une procédure stockée SQL Server dans ASP.NET MVC/EF
demande et obtenir des résultats en retour?
Procédure stockée SQL Server
CREATE PROCEDURE dbo.StoredProcedure2 AS
declare @parameter2 int
SET @parameter2 = 4
RETURN @parameter2
Code MVC
private readonly TestDatastoreContext _context = new TestDatastoreContext();
public ViewResult Index(string id)
{
ViewData["EnvironmentId"] = id;
using (_context)
{
_context.Database.Connection.Open();
var command = _context.Database.Connection.CreateCommand();
command.CommandText = "dbo.StoredProcedure2";
command.CommandType = System.Data.CommandType.StoredProcedure;
var test = (command.ExecuteScalar());
}
var bigView = new BigViewModel
{
VersionsModel = _context.Versions.ToList(),
EnvironmentViewModel = _context.Environments.ToList(),
};
return View(model: bigView);
}
Votre problème est le suivant: vous renvoyez la valeur de la procédure stockée (à l'aide de RETURN @paramter2
), mais votre code .NET tente de lire un jeu de résultats; quelque chose qui serait "retourné" en utilisant une instruction SELECT .....
dans la procédure stockée
Alors changez votre procédure stockée en ceci:
CREATE PROCEDURE dbo.StoredProcedure2 AS
declare @parameter2 int
SET @parameter2 = 4
SELECT @parameter2
et ensuite votre code .NET devrait fonctionner correctement.
L'instruction RETURN
doit être utilisée pour codes d'état uniquement et ne peut renvoyer que des valeurs INT
. Si vous voulez utiliser cela, vous devrez définir une SqlParameter
pour votre procédure stockée avec un Direction.ReturnValue
Consultez ce document officiel sur la manière de mapper le Stored Procedure
à votre contexte:
Procédures stockées dans Entity Framework
Après le mappage, vous pourrez appeler le Stored Procedure
de cette façon:
var val = _context.StoredProcedure2();
Une option consiste simplement à faire ceci:
MyReturnEntity ret = context.Database
.SqlQuery<MyReturnEntity>("exec myStoredProc ?, ?", param1, parm2);
Vous pouvez utiliser cette bibliothèque: https://github.com/mrmmins/C-StoreProcedureModelBinding
Renvoie les valeurs sous forme de liste, il vous suffit de créer une classe simple avec les types de noms et de valeurs, comme:
var productos = DataReaderT.ReadStoredProceadures<MyCustomModel>(myDbEntityInstance, "dbo.MySPName", _generic);
et la classe MyCumtomModel est quelque chose comme:
public int id {get; set;}
public int salary {get; set;}
public string name {get; set;}
public string school {get; set;}
et générique comme:
List<Generic> _generic = = new List<Generic>
{
new Generic
{
Key = "@phase", Type = SqlDbType.Int, Value = "207"
}
}
};
Et maintenant, votre products
a les options suivantes: products.First()
, products.Count()
, foreach
etc.