C# 存储过程始终返回0

C# 存储过程始终返回0,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我试图从存储过程中获取返回值,但它总是返回0 c代码 服务提供商 在所有情况下,它都返回0。我想不出问题所在。这是因为您使用的是ExecuteOnQuery 您应该使用executescalar返回单个值。我尝试了类似于您的代码,它可以正常工作。 但是,在代码中有两次对ExecuteOnQuery的调用 当进行第一次调用时,将按预期插入记录,然后为返回值添加参数并再次执行该命令。但是现在记录存在,存储过程总是落在else块中,因此总是返回零 cmd = new SqlCommand(); cmd

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

c代码 服务提供商
在所有情况下,它都返回0。我想不出问题所在。

这是因为您使用的是ExecuteOnQuery


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

我尝试了类似于您的代码,它可以正常工作。 但是,在代码中有两次对ExecuteOnQuery的调用

当进行第一次调用时,将按预期插入记录,然后为返回值添加参数并再次执行该命令。但是现在记录存在,存储过程总是落在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;

如果选择查询中有计数,则应使用executescaler。。像

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


您的存储过程中没有out参数,您使用的是ExecuteOnQuery——基本上,在客户端,您不会在任何地方提供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()

我想要返回SP的值,而不是ExecuteOnQuery或ExecuteScaler值。再次查看代码并找到丢失的plzthanks。因为这个愚蠢的打字错误,我在过去的两个小时里一直在忍受痛苦。
int result = (Int32)cmd.ExecuteScalar();
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
int result = (int) cmd.ExecuteScalar()