【问题标题】:Bug in MVC Core 2 - Stored Procedures returns nullMVC Core 2 中的错误 - 存储过程返回 null
【发布时间】:2018-10-14 21:37:02
【问题描述】:

如何向MVC Core2团队报告bug,存储过程输出参数返回null,

这是我的代码

var p = new SqlParameter
{
    ParameterName = "token",
    DbType = System.Data.DbType.String,
    Size = 100, Value = "Sarah",
    Direction = System.Data.ParameterDirection.Output
};
var z = p.SqlValue;
var resp = await _context.Database.ExecuteSqlCommandAsync("exec dbo.yourstoredprocedure {0}, {1}","test", p); 
var y = p.SqlValue;
var x = p.Value;

resp总是-1,x和y都是null,存储过程很简单

create PROCEDURE [dbo].[yourstoredprocedure] 
( @varone nvarchar(max),
@vartwo nvarchar(50) OUTPUT)
AS
 insert into test (two, three) select  @varone, @vartwo'
SET @vartwo =  scope_identity()
return @vartwo;

【问题讨论】:

  • 你没有声明@varfour。我希望它返回 NULL 因为 SP 正在生成错误。此外,您的 INSERT 末尾有一个未封闭的报价单。您将@vartwo 作为OUTPUT 参数,但您没有在SP 中为其分配任何值,然后您在@varfour 上使用RETURN(不要使用RETURN)(其中,如我说,是未申报的)。 SP 充满了语法错误,我怀疑这根本不是您的应用程序的问题。
  • 抱歉,我已经更正了 sp,但这不是问题,因为返回值始终为 null
  • 总是假设你搞砸了。即使是经验丰富的程序员,这也是一个很好的建议。当您开始将问题归咎于框架时,您将停止寻找解决方案。特别是在这种情况下,一个会导致 SP 返回 null 的通用错误会如此普遍,以至于已经存在与它相关的问题,并且会快速修复。鉴于它是开源的,并且每天只有数百万开发人员使用这些东西,因此很可能会来自社区的修复,这可能是问题的一部分。换句话说,它几乎肯定不是一个错误。

标签: sql-server asp.net-core output


【解决方案1】:

就像我在 cmets 中所说,您的 SP 充满了语法错误。它应该看起来更像这样:

CREATE PROCEDURE [dbo].[yourstoredprocedure] @varone nvarchar(max),
                                             @vartwo nvarchar(50),
                                             @varfour int OUTPUT AS --What happened to @varthree ?


    INSERT INTO test (two, three)
    VALUES (@varone, @vartwo);
    SET @varfour = SCOPE_IDENTITY();
GO

【讨论】:

  • 另外,调用函数看起来很糟糕,应该是 ExecuteSqlCommandAsync("EXEC dbo.yourstoredprocedure 'test', 'test', @varfour OUTPUT", p) 基于你的过程。
  • 抱歉,来晚了,我出城办银行了。我说有一个错误,因为我的同事正在使用我不喜欢的插入语句,我宁愿使用 SP,他们在网上向我展示了一些帖子,其中明确表示存在错误。我试图在 MS 网站上报告,但它说它已退休,这是一个 github 对话github.com/aspnet/EntityFrameworkCore/issues/9277
  • Mark G - 您的建议返回错误 ExecuteSqlCommandAsync("EXEC dbo.yourstoredprocedure 'test', 'test', @varfour OUTPUT", p)
  • @Ehi 我仍然非常怀疑这是 MCV 中的一个错误,就像 Chris 建议的那样。您的 SQL 中仍然存在语法错误(INSERT 语句末尾有一个未闭合的单引号 (') 并且您正在使用 @vartwo,作为 INPUTOUTPUT 参数冲突数据类型的一种非常奇怪的方式(SCOPE_IDENTITY 将返回int,那么为什么要将它分配给varchar)?您还为OUTPUT 参数分配了一个值,然后还使用了RETURN(不要使用RETURN)。问题将是您的语法错误和奇怪的用法,而不是错误。你需要修复你的代码。
猜你喜欢
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2017-03-16
  • 1970-01-01
  • 2020-08-03
相关资源
最近更新 更多