我正在尝试从 C# 调用此存储过程
alter PROCEDURE GetLecturasEnRangoDeFechas
-- Add the parameters for the stored procedure here
@fecha as smalldatetime,
@idParteMaquina int,
@inicio int,
@inicioMasDuracion int,
@dia smalldatetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @inicioFecha as smalldatetime
set @inicioFecha=CONVERT(smalldatetime, DATEADD(s,@inicio,0))
declare @inicioMasDuracionFecha as smalldatetime
set @inicioMasDuracionFecha=CONVERT(smalldatetime, DATEADD(s,@inicioMasDuracion,0))
-- Insert statements for procedure here
select * from Lectura
where
cast(Fecha as Date) =cast(@fecha As Date) and
IdParteMaquina=@idParteMaquina and
(Fecha>=@inicioFecha and
Fecha<=@inicioMasDuracionFecha)
or
(@inicioMasDuracionFecha>@dia and
(@inicioFecha+Fecha<=@inicioMasDuracionFecha))
END
GO
C# 代码
using(ProduccionContexto pc=new ProduccionContexto())
{
var lects=pc.Database.SqlQuery<Lectura>("GetLecturasEnRangoDeFechas",fecha,partemaquina.Id, inicio.TotalSeconds, inicioMasDuracion.TotalSeconds, dia);
}
这让我:
Procedure or function 'GetLecturasEnRangoDeFechas' expects parameter '@fecha', which was not supplied.
如果我这样做:
using(ProduccionContexto pc=new ProduccionContexto())
{
var lects=pc.Database.SqlQuery<Lectura>("GetLecturasEnRangoDeFechas @fecha,@idParteMaquina,@inicio,@inicioMasDuracion,@dia",fecha,partemaquina.Id, inicio.TotalSeconds, inicioMasDuracion.TotalSeconds, dia);
}
扔给我:
Must declare the scalar variable "@fecha".
从 C# EF 6 CodeFirst 调用 SP 的正确语法是什么
您必须将参数作为对象传递,仅靠
SqlParameter
值是不够的。所以:实体框架只能访问该值,它不知道
fecha
应该将变量分配给参数@fecha
。使用MapToStoredProcedures将过程映射到实体而不是使用 SqlQuery() 不是更好吗
代码优先插入/更新/删除存储过程
这种形式用参数来指示实体映射的哪些属性要简单得多
这篇文章解释了如何执行这种类型的映射
干杯
参数必须指定为
SqlParameter
我应用这种方式来实现使用 EF 的 SP:
我声明了我的实体实例,即我与数据库的连接。
然后我声明一个将包含 SP 的变量:“ DeleteEmployee ”,后跟实体 + SP 的名称,然后是它执行所需的参数。
最后但并非最不重要的。调用实体并使用 SavesChanges() 保存更改;
这样它对我有用。
我希望这个答案对将来访问所提出的问题有用。