C# 在WebApi2中,如何从存储过程中检索结果集并反射回页面
创建一个web应用程序,其中数据从SQL Server存储过程检索到web Api 2中的控制器类。我想访问控制器中resultset的值 结果集将使用角度uri发送回模型 存储过程: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
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);