Как выполнить хранимую процедуру и получить результат возврата в MVC/EF / LINQ

может ли кто-нибудь помочь мне в выполнении хранимой процедуры SQL Server в ASP.NET MVC / EF
применение и получить результаты обратно?

хранимая процедура SQL Server

 CREATE PROCEDURE dbo.StoredProcedure2 AS
     declare @parameter2 int
     SET @parameter2 = 4

     RETURN @parameter2 

код 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);
}

4 ответов


ваша проблема заключается в следующем: вы возвращаете значение из хранимой процедуры (используя RETURN @paramter2), но ваш .NET-код пытается прочитать результирующий набор; что-то, что будет" возвращено " с помощью SELECT ..... инструкция внутри хранимой процедуры

поэтому измените хранимую процедуру следующим образом:

CREATE PROCEDURE dbo.StoredProcedure2 AS
     declare @parameter2 int
     SET @parameter2 = 4

     SELECT @parameter2 

и тогда ваш .NET-код должен работать нормально.

на RETURN оператор должен использоваться для коды состояния только и он может вернуться INT только значения. Если вы хотите использовать это, вам нужно определить SqlParameter для вашей хранимой процедуры с Direction.ReturnValue


проверьте этот официальный документ о том, как отобразить Stored Procedure к вашему контексту:

хранимые процедуры в Entity Framework

после отображения вы сможете вызвать Stored Procedure таким образом:

var val = _context.StoredProcedure2();

один из вариантов-просто сделать это:

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

вы можете использовать эту библиотеку: https://github.com/mrmmins/C-StoreProcedureModelBinding

возвращает значения в виде списка, вам нужно только создать простой класс с именами и типами значений, например:

var productos = DataReaderT.ReadStoredProceadures<MyCustomModel>(myDbEntityInstance, "dbo.MySPName", _generic);

и класс MyCumtomModel что-то вроде:

public int id {get; set;}
public int salary {get; set;}
public string name {get; set;}
public string school {get; set;}

и универсального типа:

List<Generic> _generic = = new List<Generic>
                          {
                              new Generic
                                  {
                                      Key = "@phase", Type = SqlDbType.Int, Value = "207"
                                  }
                          }
                      };

и products имеет такие параметры, как:products.First(), products.Count(), foreach etc.