在不使用DBSet的情况下使用c#linq执行SQL Server存储过程

时间:2019-03-10 20:47:10

标签: c# sql-server entity-framework stored-procedures asp.net-mvc-5

目前,我正在一个项目上,对于这一部分,我需要调用一个存储过程,该存储过程以TicketNumber格式(例如{{ 1}})。

现在这是问题所在。该过程有效,我可以通过在数据库上运行SQL语句来调用此方法,但是在尝试使用C#在控制器中运行此方法时似乎没有任何作用。

我目前有这个:

TodaysDate.Number

存储过程如下:

11032019.0001

我收到此错误:

  

数据读取器与指定的“ PSARMM.Models.Ticket”不兼容。类型为“ TicketId”的成员在数据读取器中没有具有相同名称的对应列。

唯一的问题是该过程不会仅返回单个票证编号字符串就返回模型中的所有参数,因此会引发错误。

另一个问题,我无法使用var NewOrderIdOut = new SqlParameter("@NewOrderIdOut", ""); var result = await db.Tickets.SqlQuery("[dbo].[usp_NewOrderId] @NewOrderIdOut", NewOrderIdOut).SingleAsync(); ,因为我安装了CREATE PROCEDURE usp_NewOrderId (@NewOrderIdOut CHAR(13) OUTPUT ) AS BEGIN IF EXISTS (SELECT 1 FROM OrderNumberGenerator WHERE CreatedDate <> CAST(GETDATE() AS DATE)) TRUNCATE TABLE OrderNumberGenerator -- restart the counter everyday :) INSERT INTO OrderNumberGenerator DEFAULT VALUES SELECT @NewOrderIdOut = CONVERT(CHAR(8), GETDATE(), 112) + RIGHT( '.000' + CAST(SCOPE_IDENTITY() AS VARCHAR(4)), 4) END ,因为根据nuget,存在一些不兼容的文件。

我可以创建一个新表,用于临时存储我正在创建的这个新db.ExecuteSqlCommand,但是觉得可能有更好的方法,所以我伸出手来看看你们是否都有任何天才的想法:D

关于参数方向,我不知道。

欢呼

编辑:我最终放弃了这个想法,而是使用表本身内的触发器来调用过程并将结果放入正确列的新行中。而且它就像一种魅力。

1 个答案:

答案 0 :(得分:1)

  

另一个问题,我不能使用db.ExecuteSqlCommand,因为

当然可以。

EF6EF Core中都可用,DbContext.Database.ExecuteSqlCommand是调用存储过程的正确方法,该存储过程不返回映射到Entity的结果集。

类似这样:

var NewOrderIdOut = new SqlParameter("@NewOrderIdOut",System.Data.SqlDbType.Int);
NewOrderIdOut.Direction = System.Data.ParameterDirection.Output;

var result = await db.Database.ExecuteSqlCommandAsync("exec [dbo].[usp_NewOrderId] @NewOrderIdOut output", NewOrderIdOut);
相关问题