【问题标题】:Stored Procedure always returning 0存储过程总是返回 0
【发布时间】:2014-03-16 18:21:17
【问题描述】:

我试图从存储过程中获取返回值,但它总是返回 0。

c#代码

cmd = new SqlCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "AbsentEntry";
    cmd.Parameters.Add("@EmpID", SqlDbType.VarChar).Value = ViewState["empID"].ToString();
    cmd.Parameters.Add("@AttendanceDate", SqlDbType.Date).Value = date.ToString("yyyy-MM-dd");
    cmd.Connection = conn;
    conn.Open();
    cmd.ExecuteNonQuery();
    SqlParameter returnParameter = cmd.Parameters.Add("@returnval", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;
    cmd.ExecuteNonQuery();

    int result = (int)cmd.Parameters["@returnval"].Value;
    return result;

SP

    ALTER PROCEDURE [dbo].[AbsentEntry] 
@EmpID varchar(10), 
@AttendanceDate Date 

AS BEGIN
declare @returnval     int 
IF (SELECT COUNT(*) FROM tblEmpAttendance WHERE EmpID = @EmpID AND AttendanceDate=@AttendanceDate) = 0
    BEGIN
        insert into tblEmpAttendance (EmpID, AttendanceDate, IsInOut, SessionCount, IsPresent) values ( @EmpID,@AttendanceDate,'OUT',0,'A')
        set @returnval=1
    return @returnval
     END
ELSE
    BEGIN
       set @returnval=0 
    return @returnval
    END
END

在所有情况下,它都返回 0 。我无法弄清楚问题所在。

【问题讨论】:

    标签: c# sql sql-server stored-procedures


    【解决方案1】:

    我尝试了与您类似的代码,它按预期工作。
    但是,在您的代码中有两次调用 ExecuteNonQuery。

    当第一次调用时,记录按预期插入,然后添加返回值的参数并再次执行命令。但是现在记录存在并且存储过程总是落在 else 块中,因此总是返回零。

    cmd = new SqlCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "AbsentEntry";
    cmd.Parameters.Add("@EmpID", SqlDbType.VarChar).Value = ViewState["empID"].ToString();
    cmd.Parameters.Add("@AttendanceDate", SqlDbType.Date).Value = date.ToString("yyyy-MM-dd");
    SqlParameter returnParameter = cmd.Parameters.Add("@returnval", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;
    cmd.Connection = conn;
    conn.Open();
    cmd.ExecuteNonQuery();
    int result = (int)cmd.Parameters["@returnval"].Value;
    return result;
    

    【讨论】:

    • 谢谢。我因为这个愚蠢的打字错误而遭受了最后 2 个小时的痛苦。
    【解决方案2】:

    这是因为你使用了executenonquery。

    您应该使用 executescalar 来返回单个值。

    【讨论】:

    • 我想要返回 SP 的值,而不是 ExecuteNonQuery 或 ExecuteScaler 值。再看代码,找到缺失的plz
    【解决方案3】:

    您的存储过程中没有 out 参数,并且您正在使用 ExecuteNonQuery - 基本上,客户端您没有在任何地方提供 reurn 值。在 C# 术语中,就好像您调用了一个函数,但没有将其作为赋值的一部分。 x=getX(); vs getX();

    您可以通过更改存储过程使其具有输出参数来解决此问题

    ALTER PROCEDURE [dbo].[AbsentEntry] 
        @EmpID varchar(10), 
        @AttendanceDate Date,
        @returnval     int OUTPUT
    
    AS BEGIN
    
        IF (SELECT COUNT(*) FROM tblEmpAttendance 
            WHERE EmpID = @EmpID AND AttendanceDate=@AttendanceDate) = 0
        BEGIN
            insert into tblEmpAttendance (EmpID, AttendanceDate, IsInOut,
            SessionCount, IsPresent) values ( @EmpID,@AttendanceDate,'OUT',0,'A')
            set @returnval=1
        END
    ELSE
        BEGIN
           set @returnval=0 
        END
    END
    

    或者,更简单地说,使用 ExecuteScalar 并将结果分配给变量。

    int result = (int) cmd.ExecuteScalar()
    

    【讨论】:

      【解决方案4】:

      如果 count 在您的选择查询中,您应该使用 executescaler.. like

      int result=convert.toint32(cmd.executescalar());
      

      int result = (Int32)cmd.ExecuteScalar();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多