web-dev-qa-db-fra.com

Comment exécuter une procédure stockée et obtenir un résultat renvoyé dans MVC/EF/LINQ

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);
}
9
user845405

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 

9
marc_s

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();
4

Une option consiste simplement à faire ceci:

MyReturnEntity ret = context.Database
         .SqlQuery<MyReturnEntity>("exec myStoredProc ?, ?", param1, parm2);
2
Erik Funkenbusch

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.

0
MrMins