【问题标题】:My SQL Server procedure always return -1我的 SQL Server 过程总是返回 -1
【发布时间】:2016-09-20 02:08:28
【问题描述】:

我正在使用实体框架使用 ASP.NET MVC 编写一个 Web 应用程序。

我在 C# 中这样调用过程:

var result = context.EditTechInfo(user.id, user.telephone, user.email);

context 是实体框架实例。

我有一个总是返回-1的过程,但它执行UPDATE它应该做的事情。我尝试使用SELECT 而不是RETURN 返回我的值,但无济于事。

程序如下:

ALTER PROCEDURE EditTechInfo
    (@tech INT,
     @telephone CHAR(10),
     @email VARCHAR(64))
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @result  INT = 0

    IF EXISTS (SELECT * FROM Techs WHERE id = @tech AND statut = 1)
    BEGIN
        UPDATE Techs
        SET telephone = @telephone, email = @email
        WHERE id = @tech

        SET @result = 1
    END
    --ELSE
    --BEGIN
        --SET @result = -1
    --END

    SELECT @result
END

即使 -1 可能是返回值的部分被注释...

我知道如果一个过程返回 -1 就意味着有一个错误,但我不知道在哪里也不知道为什么......

----编辑--------

正如评论中所问,这是 EF 生成的内容:

public virtual int EditTechInfo(Nullable<int> tech, string telephone, string email)
        {
            var techParameter = tech.HasValue ?
                new ObjectParameter("tech", tech) :
                new ObjectParameter("tech", typeof(int));

            var telephoneParameter = telephone != null ?
                new ObjectParameter("telephone", telephone) :
                new ObjectParameter("telephone", typeof(string));

            var emailParameter = email != null ?
                new ObjectParameter("email", email) :
                new ObjectParameter("email", typeof(string));

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("EditTechInfo", techParameter, telephoneParameter, emailParameter);
        }

【问题讨论】:

  • 你的IF EXISTS表达式返回什么?
  • @Shyju 从我推断的结果来看,它返回true,因为更新语句被执行了
  • EditTechInfo 是如何定义的?我敢打赌 EF 直接搞砸了,或者因为它和你的存储过程不匹配。
  • 如果您怀疑发生了异常,或者如果您确实想为过程使用返回值,则可以使用BEGIN TRY...BEGIN CATCH捕获任何异常,将@result参数标记为作为INT OUTPUT 并将其传递给模型/控制器代码中的结果变量。
  • 您对 sp 的排序和从 c# 代码调用的顺序不同..请注意

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


【解决方案1】:

试试这个代码。它将在 EF 6+ 上工作

String spQuery = String.Format("EditTechInfo {0},'{1}','{2}'", 0, "telephone  ", "email");
int result = context.Database.SqlQuery<int>(spQuery).FirstOrDefault();

【讨论】:

  • 啊,是的,每个 EF 问题的答案几乎都是“假装你在使用 Dapper”。
  • 这是一种解决方法,但我仍然不知道如何纠正我的错误以及为什么它总是返回 -1
【解决方案2】:

Tetsuya Yamamoto 建议我使用OUTPUT 参数。我在the subject 上阅读了更多内容。我决定使用这种方法,它奏效了。

我添加了一个新参数,注意OUTPUT 参数

这里是修改后的PROCEDURE

CREATE PROCEDURE EditTechInfo
(
    @tech           INT,
    @telephone      CHAR(10),
    @email          VARCHAR(64),
    @result         INT OUTPUT --- this is new
)
AS
BEGIN
    SET NOCOUNT ON
    SET @result = 0;

    IF EXISTS (SELECT * FROM Techs WHERE id = @tech AND statut = 1)
    BEGIN
        UPDATE Techs
            SET telephone = @telephone, email = @email
        WHERE id = @tech

        SET @result = 1
    END
    ELSE
    BEGIN
        SET @result = -1
    END

    RETURN @result -- I don't know if i have to actually return it since it is an output param
END

c# 中是这样称呼它的: (请注意,这是一个过度简化的代码)

这里的大插件是我将result 变量类型更改为ObjectParameter。之后,我必须检索结果的Value。我将它转换为int,否则它是一个简单的Object

public int GetEditTechInfoValue(int id, string telephone, string email)
        {
            var result = new ObjectParameter("result", 0);
            var type = result.ParameterType;

            // This is an instance of my EntityFramework entities...you get the point
            context.EditTechInfo(id, telephone, email, result);

            return (int)result.Value;
        }

【讨论】:

    【解决方案3】:

    由于SET NOCOUNT ON,它们得到-1。删除它或指定 SET NOCOUNT OFF 以获取受 proc 影响的行数。

    请注意,SET NOCOUNT ON 的广泛使用源于经典 ADODB,其中行数(实际上是 DONE_IN_PROC TDS 消息)混淆了不期望它们的应用程序。这不是 SqlClient 的问题,因为从开发的角度来看,API 表现得更好。

    【讨论】:

    • 这会影响返回值吗?
    • 不,SET NOCOUNT ON 不会影响返回值。使用它是一个好主意,因为它可以减少网络流量。 weblogs.asp.net/jongalloway/How-NOCOUNT-affects-ADO.NET
    • @JonathanAllen,我同意SET NOCOUNT 它不会影响存储过程的返回值,但会影响 SqlCommand.ExecuteNonQuery 返回的值。我不是一个 EF 人,但我认为这是实际返回的内容,而不是存储过程的返回值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2019-10-10
    相关资源
    最近更新 更多