Sql 必须声明标量变量"@“雇员ID”;在ASP.NET MVC 5中插入存储过程

Sql 必须声明标量变量"@“雇员ID”;在ASP.NET MVC 5中插入存储过程,sql,sql-server,entity-framework,asp.net-mvc-5,Sql,Sql Server,Entity Framework,Asp.net Mvc 5,我想使用ASP.NET MVC 5中的实体框架存储过程将数据插入数据库。它在SQL Server中工作,但当我在Visual Studio中插入时执行该过程时,会出现该错误 我的控制器代码是: [HttpPost] [ValidateAntiForgeryToken] public ActionResult SaveEntitlement(Entitlement entment) { if (!ModelState.IsValid) { var viewmodel

我想使用ASP.NET MVC 5中的实体框架存储过程将数据插入数据库。它在SQL Server中工作,但当我在Visual Studio中插入时执行该过程时,会出现该错误

我的控制器代码是:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SaveEntitlement(Entitlement entment)
{
    if (!ModelState.IsValid)
    {
        var viewmodel = new EntitlementViewModel(entment);
        return View("EntitlementIndex", viewmodel);
    }

    if (entment.EntitlementId == 0)
    {
        var courseList = _dbContext.Entitlement.SqlQuery ("exec APPLIEDDAYS @employeeid,@LeaveTypeId,@LeavePeriodId,@startdate,@enddate", entment.EmployeeId,entment.LeaveTypeId,entment.LeavePeriodId,entment.FromDate.ToShortDateString(),entment.UptoDate.ToShortDateString()).ToList<Entitlement>();
        ////_dbContext.Entitlement.Add(entment);
        _dbContext.SaveChanges();

        TempData["msg"] = "Record Saved Successfully!";
    }

    return RedirectToAction("EntitlementIndex", "LeaveSetup");
}
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果保存权限(权限条目)
{
如果(!ModelState.IsValid)
{
var viewmodel=新权利viewmodel(entment);
返回视图(“权利索引”,视图模型);
}
如果(entment.AuthenticationId==0)
{
var courseList=_dbContext.entity.SqlQuery(“exec APPLIEDDAYS@employeeid、@levetypeid、@leveperiodid、@startdate、@enddate”、entment.employeeid、entment.levetypeid、entment.FromDate.toportDateString()、entment.UptoDate.toportDateString()).ToList();
////_dbContext.entity.Add(entment);
_dbContext.SaveChanges();
TempData[“msg”]=“记录保存成功!”;
}
返回重定向操作(“权利索引”、“离开设置”);
}
错误是:


我相信当您使用的参数之一(本例中为employeeid)为null,而不是字符串中的“null”时,会发生这种情况。在调用过程之前,可以为参数指定适当的值。 假设entment.EmployeeId是int的一种类型:

  if (entment.EntitlementId == 0)
    {
        var param1 = !entment.EmployeeId.HasValue ? "null" : entment.EmployeeId.ToString();

        var courseList = _dbContext.Entitlement.SqlQuery ("exec APPLIEDDAYS @employeeid,@LeaveTypeId,@LeavePeriodId,@startdate,@enddate",
 param1,entment.LeaveTypeId,entment.LeavePeriodId,entment.FromDate.ToShortDateString(),entment.UptoDate.ToShortDateString()).ToList<Entitlement>();
        ////_dbContext.Entitlement.Add(entment);
        _dbContext.SaveChanges();

        TempData["msg"] = "Record Saved Successfully!";
    }
if(entment.authorizementId==0)
{
var param1=!entment.EmployeeId.HasValue?“null”:entment.EmployeeId.ToString();
var courseList=_dbContext.entity.SqlQuery(“exec APPLIEDDAYS@employeeid、@levetypeid、@leveperiodid、@startdate、@enddate”,
参数1,entment.LeaveTypeId,entment.LeavePeriodId,entment.FromDate.ToShortDateString(),entment.UptoDate.ToShortDateString()).ToList();
////_dbContext.entity.Add(entment);
_dbContext.SaveChanges();
TempData[“msg”]=“记录保存成功!”;
}

PS:不确定这是否是正确的方法,但它应该可以工作。

我认为当您使用的参数之一(本例中为employeeid)为null,而不是字符串中的“null”时,会发生这种情况。在调用过程之前,可以为参数指定适当的值。 假设entment.EmployeeId是int的一种类型:

  if (entment.EntitlementId == 0)
    {
        var param1 = !entment.EmployeeId.HasValue ? "null" : entment.EmployeeId.ToString();

        var courseList = _dbContext.Entitlement.SqlQuery ("exec APPLIEDDAYS @employeeid,@LeaveTypeId,@LeavePeriodId,@startdate,@enddate",
 param1,entment.LeaveTypeId,entment.LeavePeriodId,entment.FromDate.ToShortDateString(),entment.UptoDate.ToShortDateString()).ToList<Entitlement>();
        ////_dbContext.Entitlement.Add(entment);
        _dbContext.SaveChanges();

        TempData["msg"] = "Record Saved Successfully!";
    }
if(entment.authorizementId==0)
{
var param1=!entment.EmployeeId.HasValue?“null”:entment.EmployeeId.ToString();
var courseList=_dbContext.entity.SqlQuery(“exec APPLIEDDAYS@employeeid、@levetypeid、@leveperiodid、@startdate、@enddate”,
参数1,entment.LeaveTypeId,entment.LeavePeriodId,entment.FromDate.ToShortDateString(),entment.UptoDate.ToShortDateString()).ToList();
////_dbContext.entity.Add(entment);
_dbContext.SaveChanges();
TempData[“msg”]=“记录保存成功!”;
}

PS:不确定这是否是正确的方法,但它应该可以工作。

我认为您应该为存储过程中的每个参数声明参数,如下所示:

SqlParameter param1 = new SqlParameter("@employeeid", entment.EmployeeId);
SqlParameter param2 = new SqlParameter("@LeaveTypeId", entment.LeaveTypeId);
SqlParameter param3 = new SqlParameter("@LeavePeriodId", entment.LeavePeriodId);
SqlParameter param4 = new SqlParameter("@startdate", entment.FromDate);
SqlParameter param5 = new SqlParameter("@enddate", entment.UptoDate);
然后

var courseList = _dbContext.Entitlement.SqlQuery ("exec APPLIEDDAYS @employeeid,@LeaveTypeId,@LeavePeriodId,@startdate,@enddate", param1, param2, param3, param4, param5).ToList<Entitlement>();
var courseList=_dbContext.entity.SqlQuery(“exec APPLIEDDAYS@employeeid、@levetypeid、@leveperiodid、@startdate、@enddate”、param1、param2、param3、param4、param5”)。ToList();

我认为您应该为存储过程中的每个参数声明参数,如下所示:

SqlParameter param1 = new SqlParameter("@employeeid", entment.EmployeeId);
SqlParameter param2 = new SqlParameter("@LeaveTypeId", entment.LeaveTypeId);
SqlParameter param3 = new SqlParameter("@LeavePeriodId", entment.LeavePeriodId);
SqlParameter param4 = new SqlParameter("@startdate", entment.FromDate);
SqlParameter param5 = new SqlParameter("@enddate", entment.UptoDate);
然后

var courseList = _dbContext.Entitlement.SqlQuery ("exec APPLIEDDAYS @employeeid,@LeaveTypeId,@LeavePeriodId,@startdate,@enddate", param1, param2, param3, param4, param5).ToList<Entitlement>();
var courseList=_dbContext.entity.SqlQuery(“exec APPLIEDDAYS@employeeid、@levetypeid、@leveperiodid、@startdate、@enddate”、param1、param2、param3、param4、param5”)。ToList();

这将导致存储过程将
“null”
视为字符串,而不是
null
。我的错是,我认为这与使用_dbContext.Database.Connection.CreateCommand()时相同,这不是一个有效的答案。您的想法是正确的。只需使用值为
DbNull的
SqlParameter
。value
请参见,这将导致存储过程将
“null”
视为字符串,而不是
null
。是的,我很抱歉,我认为这与使用_dbContext.Database.Connection.CreateCommand()时相同,这不是一个有效的答案。您的想法是正确的。只需要使用一个
SqlParameter
和值
DbNull.value
See(OT)我希望您的
@startdate
@enddate
是日期。然后提供一个日期时间值,而不是字符串。随意猜测:has
@p0
作为参数。尝试使用
@p0
@p1
等作为参数名称,另请参见(OT)我希望您的
@startdate
@enddate
是日期。然后提供一个日期时间值,而不是字符串。随意猜测:has
@p0
作为参数。尝试使用
@p0
@p1
等作为参数名,另请参见