C# 应用程序生成错误:必须在Web Api 2中声明标量变量。此外,还介绍了有关WebApi2中的代码和调试控制器方法的实践

C# 应用程序生成错误:必须在Web Api 2中声明标量变量。此外,还介绍了有关WebApi2中的代码和调试控制器方法的实践,c#,sql-server,asp.net-mvc-4,asp.net-web-api2,C#,Sql Server,Asp.net Mvc 4,Asp.net Web Api2,我在这里问了很多问题,因为我是MVC、WebApi和RestService的新手 因此,我正在使用一个应用程序,其中控制器内部调用StoredProcedure,但出现错误: 必须声明标量变量@empid 代码如下: [HttpGet] [Route("~/api/Login/{EmpID}/{pwd}")] public IHttpActionResult ValidateLoginDetails(string EmpID, string pwd)

我在这里问了很多问题,因为我是MVC、WebApi和RestService的新手

因此,我正在使用一个应用程序,其中控制器内部调用StoredProcedure,但出现错误:

必须声明标量变量@empid

代码如下:

    [HttpGet]
    [Route("~/api/Login/{EmpID}/{pwd}")]
            public IHttpActionResult ValidateLoginDetails(string EmpID, string pwd)
    {


        int a=0;
        if (EmpID == null)
            EmpID = "";
        else a = Int32.Parse(EmpID);

        if (pwd == null)
            pwd = "";

        var val = new  SqlParameter()
        {ParameterName="@val",Direction=ParameterDirection.Output,SqlDbType=SqlDbType.Int};

        var e = new SqlParameter("@empid", SqlDbType.Int) ;
        e.Value = a;
        //User.Identity.Name;
        var y = new SqlParameter("@pwd", SqlDbType.VarChar);
        y.Value = pwd;

        using (var x = new DB_BgCheckEntities()) 
        {
            var retVal = x.Database.SqlQuery<IEnumerable<int>>
            ("Exec proc_Bgcheck_login @empid,@pwd,@val out", e, y, val);

           // var ret = retVal.Single();
            //foreach(var ab in retVal)
            //{
            //    Console.WriteLine(ab.ToList());
            //}
            //retVal.ToList();
            x.Database.ExecuteSqlCommand("Exec proc_Bgcheck_login @eid,@pwd,@val out", e, y, val);
            if ((int)val.Value == 1)
            {
                return Ok(1);
            }
            else return NotFound();

        }
        }
存储过程:

CREATE PROCEDURE proc_Bgcheck_login
(
    @emp_no int,
    @pwd varchar(255),
    @val int output
)as
BEGIN
    SET @val=0;
    DECLARE @count int;
    SELECT @count=COUNT(*) FROM tbl_User_Login where [Emp No]=@emp_no and [Password]=@pwd;
    IF (@count = 1)
        BEGIN
            SET @val=1;
            RETURN @val;
        END
    ELSE
        RETURN @val;
END
GO
我需要问几个问题:

  • 像我一样在GetMethod中调用StoredProc是一种好的做法吗
  • 如何实现此方法的DTO(数据传输对象)?我用谷歌搜索了一下,但没有找到这个概念
  • 控制器内部的调试方法,如何逐行调试 PS:对于这个错误,我经历了StackOverflow的不同站点和线程,但没有解决我的解决方案

    错误:

    必须声明标量变量@empid已解析

    正如@amit所提到的,我还没有传递@empid@pwd的参数

    因此,传递参数的正确方法是:

    var retVal = dbcontext.Database.SqlQuery<tbl_User_Login>
                ("Exec proc_Bgcheck_login @empid,@pwd,@val ",e,y, val).ToList();
    
    var retVal=dbcontext.Database.SqlQuery
    (“Exec proc_Bgcheck_login@empid,@pwd,@val”,e,y,val).ToList();
    

    谢谢。

    procedure
    proc\u Bgcheck\u login
    acceps三个参数。是的,它接受三个参数。我已经交叉检查了我的数据库,它在那里工作,你通过了吗?我可以看到你只传递了
    val
    ,这不是
    params
    的一部分是的,我认为这是正确的方法。所以变量
    e
    y
    对你没有用?@AmitKumarGhosh确实,我错了,我面临另一个问题,当我试图执行查询时,
    var retVal=dbcontext.Database.SqlQuery(“Exec proc_Bgcheck_login@empid,@pwd,@val out”,e,y,val)我没有获取输出参数的值
    @val
    。它总是预定义的,即0。你能告诉我我遗漏了什么吗?不要分配任何默认值,还要检查你是否在proc中实际设置了它。删除默认值后,仍然面临类似问题(现在分配的值为空)。在proc中,它工作良好,我在sqlserver中执行了proc,它在那里工作良好,给出了正确的输出。
    创建过程proc_Bgcheck_登录(@emp_no int,@pwd varchar(255),@val int output)作为BEGIN SET@val=0;声明@countint;从tbl_用户登录中选择@count=count(*),其中[Emp No]=@Emp_No和[Password]=@pwd;如果(@count=1)开始设置@val=1;返回@val;结束否则返回@val;结束前进
    把它放在你的问题中。
    var retVal = dbcontext.Database.SqlQuery<tbl_User_Login>
                ("Exec proc_Bgcheck_login @empid,@pwd,@val ",e,y, val).ToList();