【问题标题】:Error trying to execute update stored procedure using entity framework core尝试使用实体框架核心执行更新存储过程时出错
【发布时间】:2017-10-03 06:21:16
【问题描述】:

我正在尝试在 ASP.Net Core 应用程序中运行以下命令。

await _context.Database.ExecuteSqlCommandAsync(
           "EXEC AdmissionConsultEndCurrentAndPending @PracticeId @UserId @AdmissionId", 
           parameters: new[] { AdmissionId, assignments.UserId, assignments.PracticeId });

我也尝试了这些组合的实际命令

EXEC AdmissionConsultEndCurrentAndPending @PracticeId, @UserId, @AdmissionId
AdmissionConsultEndCurrentAndPending, @PracticeId, @UserId, @AdmissionId

传递的三个值是三个整数。如果这里重要的是存储过程

ALTER PROCEDURE [dbo].[AdmissionConsultEndCurrentAndPending]
    @AdmissionId INT,
    @UserId INT,
    @PracticeId INT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE
        AdmissionConsults 
    SET
        CurrentConsult = 0
    WHERE
        AdmissionId = @AdmissionId AND
        PracticeId = @PracticeId AND
        CurrentConsult = 1
END

当我运行此程序时,我收到以下错误:No mapping to a relational type can be found for the CLR type 'Int32[]'.

我不确定这个错误是指我作为参数传递的 int 值,还是因为它是一个更新查询,它试图返回受影响行数的 int 值。不管怎样,我还没有让它工作。

【问题讨论】:

  • 是否需要逗号分隔Params?
  • 我最初拥有它们,然后将它们拿出来尝试模仿在 SQL 中运行它的方式。
  • 我会尝试几种组合。
  • 你确定AdmissionId, assignments.UserId, assignments.PracticeId都是int吗?从错误来看,其中之一是整数数组int[]
  • 您正在使用三个参数值创建 int 数组并将其作为单个参数传递,而不是传递单个 int 参数。这就是错误消息的原因。

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


【解决方案1】:

这是一个应该满足您要求的方法:

var parameters = new List<SqlParameter>
                 {
                     new SqlParameter("@PracticeId", assignmentsPracticeId),
                     new SqlParameter("@UserId", assignmentsUserId),
                     new SqlParameter("@AdmissionId", AdmissionId)
                 };
await _context.Database.ExecuteSqlCommandAsync(
       "EXEC AdmissionConsultEndCurrentAndPending @PracticeId, @UserId, @AdmissionId", 
       parameters.ToArray());

【讨论】:

  • 您的答案需要做一个小改动,您必须在命令中传递的参数之间加一个逗号。
  • 当然。复制和粘贴错误(我的,不是你的)。现在已经修好了。
【解决方案2】:

根据 cmets,我发现问题是我直接传递了值,我需要传递一个参数,而不是 int 本身。所以起作用的是:

SqlParameter u = new SqlParameter("@UserId", assignments.UserId);
SqlParameter a = new SqlParameter("@AdmissionId", AdmissionId);
SqlParameter pr = new SqlParameter("@PracticeId", assignments.PracticeId);
await _context.Database.ExecuteSqlCommandAsync("EXEC AdmissionConsultEndCurrentAndPending @PracticeId, @UserId, @AdmissionId",
                                    parameters: new[] { a, u, pr });

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 2020-03-03
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多