Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WebApi2中,如何从存储过程中检索结果集并反射回页面_C#_Sql_Sql Server_Angularjs_Asp.net Web Api - Fatal编程技术网

C# 在WebApi2中,如何从存储过程中检索结果集并反射回页面

C# 在WebApi2中,如何从存储过程中检索结果集并反射回页面,c#,sql,sql-server,angularjs,asp.net-web-api,C#,Sql,Sql Server,Angularjs,Asp.net Web Api,创建一个web应用程序,其中数据从SQL Server存储过程检索到web Api 2中的控制器类。我想访问控制器中resultset的值 结果集将使用角度uri发送回模型 存储过程: CREATE PROCEDURE proc_ToBeInitiate( @status varchar(50), @retVal int output) AS BEGIN select INITIATED_FOR, [emp name], INITIA

创建一个web应用程序,其中数据从SQL Server存储过程检索到web Api 2中的控制器类。我想访问控制器中resultset的值

结果集将使用角度uri发送回模型

存储过程:

CREATE PROCEDURE proc_ToBeInitiate(
    @status varchar(50),
    @retVal int output)
AS
BEGIN
    select 
        INITIATED_FOR, [emp name],  
        INITIATED_by, REQUESTED_DATE, 
        UPLOADED_LOA, UPLOADED_Bg_Check_Form
    from 
        tbl_User t , tbl_INITIATED I, tbl_SUBJECT_FORM S 
    where 
        t.[Emp No] = I.[INITIATED_FOR] 
        and S.[Emp No] = I.INITIATED_FOR 
        and i.PROGRESS_STATUS = @status



    SET @retVal = 100 --It is to check whether I am getting correct Output value
END
GO
过程正在返回预期的输出

以下是控制器类方法:

    [HttpGet]
    [ResponseType(typeof(ToBeIntiated))]
    [Route("api/ToBeInitiated/{status}")]
    public IHttpActionResult ToInitiated(string status)
    {

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

        var locstatus = new SqlParameter("status", SqlDbType.VarChar,255);
        locstatus.Value = status;

        using (var x = new DB_BgCheckEntities())
        {
            IEnumerable<ToBeIntiated> toBeInitiated = x.Database.SqlQuery<ToBeIntiated>
                           ("proc_ToBeInitiate @status,@retVal out", locstatus, retVal).ToList<ToBeIntiated>();

            foreach (WebApplication12.DTO.ToBeIntiated i in toBeInitiated)
            {
                Console.WriteLine(i.EmployeeID);
            }

            if ((int)retVal.Value == 10)
            {
                 return Ok(toBeInitiated); 
            }
            else{
                return NotFound();
            };

        }
var toBeInitiated未返回resultset,但在Sql Server中,正在填充值


请帮助我解决此问题。

空引用异常来自以下事实:retVal.Value为空,并且您正试图将其强制转换为int原语

原因可能在以下行中找到:

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

您正在将ParameterName设置为@val,但在存储过程中它的名称为@retVal。

在下一行中将参数名称从@val更改为@retVal

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

读取结果数据集后设置输出参数

请通过,它可能会对你有帮助

编辑:

您必须执行以下操作:

 var idParam = new SqlParameter {
     ParameterName = "id",
      Value = 1};
 var votesParam = new SqlParameter {
      ParameterName = "voteCount",
      Value = 0,
      Direction = ParameterDirection.Output };
 var results = context.Database.SqlQuery<Person>(
     "GetPersonAndVoteCount @id, @voteCount out",
      idParam,
      votesParam);

 var person = results.Single();//This line is important

 var votes = (int)votesParam.Value;
我看不见

OkResultsTobject


在您的代码中。

因此,最终能够解决我的错误。 以下是我和这里的朋友为解决我的错误所做的几件事:

使用Exec proc_name@var1,var2-我知道在VS2013中Exec是不必要的,这可能是错误的原因之一: sqlparameter已包含在另一个sqlparametercollection中

查找dbcontext.Database.ExecuteCommand和dbcontext.Database.SqlQuery之间的差异。前者用于创建、更新、删除、插入等命令,后者用于选择查询。 之前我使用的是dbcontext.Database.ExecuteCommand

结果集的类型为IEnumerable,当存在输出参数时,迭代结果集。例如:

foreach (WebApplication12.DTO.ToBeIntiated i in toBeInitiated)
        Console.WriteLine(i.EmployeeID);
然后,存储过程的输出参数才可用

如果在模型中传递了resultset变量,则不会将resultset转换为JSON数据。例:

var resultSet=dbcontext.Database.SQlquery storedproc@a,a.ToList; 返回OkresultSet//Json格式的数据将发送回模型

此外,TEntity属性的名称应与存储过程将返回的列名相同。这里提到了SQLQuery定义

最后,我的错误是,从存储过程中传递的status值是错误的

值是区分大小写的,这是我在案例中发现的

PS:谢谢大家解决我的问题。请随时纠正我的想法。 参考:
在使用retVal之前,请在@Nilesh中输入Credit

。值检查retVal的值不应为null;-20多年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表列表样式已被正确的ANSI连接语法所取代,其用法是不鼓励使用的。我已经检查过了。感谢您在存储过程中指出,我将更改联接样式。在纠正了前面提到的错误后,仍然会从过程中获取Null。目前在proc:set@retVal=10中完成此操作。所以值并没有出来。在纠正了前面提到的错误之后,仍然从过程中得到Null。目前在proc:set@retVal=10中完成此操作。所以值没有显示出来。在sqlserver中,Proc正在正常运行,但在C中,Proc的输出参数没有返回。很抱歉,我没有键入全部内容就发布了,实际上我的意思是将这些查询放在x.Database.SqlQuery函数中。这也不起作用,请您编写干净的代码,我收到了内部查询错误。我读了很多次这个博客,但没有得到它的使用。由于必须将数据发送回服务器,所以不需要对其进行迭代,这就是为什么return-okresultsetobject意味着return-OktoBeInitiated-else-return-NotFound。目前我可以获取输出参数的值,但resultset count仍然是0。我正在更新问题中的代码。您是否与SQL Server检查过,当您以相同状态执行sp时,它是否返回数据?是的,我检查过,它返回正确的输出,这是我用于执行过程的代码,声明@status varchar50声明@retVal int set@status='to initiated'exec proc_to beinitiate@status,@retVal out选择@retVal
foreach (WebApplication12.DTO.ToBeIntiated i in toBeInitiated)
        Console.WriteLine(i.EmployeeID);