存储过程始终返回0

时间:2014-03-16 18:21:17

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

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

c#c​​ode

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。我无法弄清楚问题。

4 个答案:

答案 0 :(得分:1)

这是因为你正在使用executtenonquery。

您应该使用executioncalar返回单个值。

答案 1 :(得分: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 :(得分:1)

您的存储过程中没有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()

答案 3 :(得分:0)

如果在您的选择查询中有计数,则应使用executcaler ..比如

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

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