如何创建 Web Api 执行存储过程

Posted

技术标签:

【中文标题】如何创建 Web Api 执行存储过程【英文标题】:How to create web Api execute stored procedure 【发布时间】:2021-09-16 22:35:18 【问题描述】:

我在 SQL Server 2012 和 Web API 实体框架 .NET core 2.2 上工作 所以我面临的问题是我无法在下面实现 Web API 执行存储过程

Create proc ItemCalculateStock
@ItemId  int = NULL,
@InventoryLocation int=NULL
as
begin




SELECT i.itemName,l.InventoryName, SUM(case when QTY > 0  then QTY else 0 end)  as PurchasedItem,SUM(case when QTY < 0  then -QTY else 0 end)  as ConsumItems,SUM(case when QTY > 0 then QTY else 0 end) + SUM(case when QTY < 0 then QTY else 0 end) as remaining  

FROM [dbo].[Invenroty] n with(nolock)
inner join [dbo].[InventoryLocations] l with(nolock) on l.id=n.InventoryLocID
inner join [dbo].[Items] i with(nolock) on n.itemid=i.id
inner join [dbo].[TransactionTypes] t with(nolock) on n.transactionTypeId=t.ID and InventoryLocID=case when @InventoryLocation is null then n.InventoryLocID else @InventoryLocation end
and i.id=case when @ItemId is null then n.itemid else @ItemId end 

GROUP BY i.itemName,l.InventoryName

end 

so 如何使用 Entity Framework .NET core 2.2 在 Web API 上获取存储过程的结果

[HttpGet("CalculateInventoryData")]
   
    public IActionResult CalculateInventoryData([FromQuery]int optionId, [FromQuery] int ItemId, [FromQuery] int InventoryLocation)
    
    // here how to get stored procedure result here
    // so i ask question to know how to get result of stored procedure above
    

要调用 API,我使用以下链接:

https://localhost:44374/api/Inventory/getInventoryData?optionId=1&ItemId=2&InventoryLocation=1

更新帖子

我在下面试试

context.Database.ExecuteSqlCommand("ItemCalculateStock @OptionId ,@ItemId,@InventoryLocation ", parameters: new[] optionId,ItemId,InventoryLocation);
 
i get error cannot implicitly convert type int into to Microsoft .aspnetcore.mvc.action result

so how to solve issue 

【问题讨论】:

【参考方案1】:

不带参数执行存储过程的代码如下:

SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;

执行带参数存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate)):

param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

这会添加一个输入参数。如果需要添加输出参数:

param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

获取存储过程的返回值:

param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

更多信息请参考此帖:How to run stored procedures in Entity Framework Core?

【讨论】:

以上是关于如何创建 Web Api 执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

sql server 存储过程如何调用存储过程

MySQL创建存储过程

C# Web API 使用 Dapper 使用存储过程插入数据 - 无法获取插入的记录 ID

EF6:创建存储过程。使用 Fluent API 或 DBMigrations?

Oracle 存储过程 - 创建游标后我可以清空临时表吗

如何在sql创建一条插入数据的存储过程