Как выполнить хранимую процедуру и получить результат возврата в 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.