【发布时间】:2019-08-01 04:48:28
【问题描述】:
我目前正在处理一个项目,对于我正在处理的这一部分,我需要调用一个存储过程,该存储过程以TodaysDate.Number 格式返回TicketNumber 字符串(例如11032019.0001)。
现在这就是问题所在。该过程有效,我可以通过在数据库上运行 SQL 语句来调用它,但是在控制器中尝试使用 C# 运行它时似乎没有任何效果。
我目前有这个:
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
我收到此错误:
数据读取器与指定的“PSARMM.Models.Ticket”不兼容。类型的成员“TicketId”在数据读取器中没有同名的对应列。
唯一的问题是该过程不会返回模型中的所有参数,而只是返回单个 ticketNumber 字符串,因此会引发错误。
另一个问题,我无法使用db.ExecuteSqlCommand,因为我无法安装Microsoft.EntityFrameworkCore,因为根据nuget,存在一些不兼容的文件。
我可以创建一个新表,用于临时存储我正在创建的这个新ticketNumber,但我觉得可能有更好的方法,所以我想看看你们是否有任何天才的想法:D
至于参数的方向,我不知道。
干杯
编辑:我最终放弃了这个想法,而是使用表本身内的触发器来调用过程并将结果放入正确列的新行中。它就像一个魅力。
【问题讨论】:
-
你在哪里得到错误,错误是什么?你的存储过程是如何定义的?是否需要将sql参数的参数方向设置为OUTPUT?
-
更新了更多信息,如果需要更多信息,请告诉我
-
我不确定您的 EF 错误,但您应该将 sql 参数方向设置为
ParameterDirection.Output -
离开 EF 并只使用“原始”SqlCommand 类会怎么样?
-
您的查询在门票数据库集的范围内,因此正试图将存储过程的结果转换为门票。如果您只想运行 sql 命令,我相信您会从基本上下文中执行此操作:
db.Database.SqlQuery.....
标签: c# sql-server entity-framework stored-procedures asp.net-mvc-5