存储过程总是返回0
本文关键字:返回 存储过程 | 更新日期: 2023-09-27 17:50:27
我试图从存储过程中获得返回值,但它总是返回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。我想不出这个问题
我尝试了一个类似于你的代码,它像预期的那样工作。
但是,在您的代码中有两次对ExecuteNonQuery的调用。
第一次调用时,按预期插入记录,然后为返回值添加参数并再次执行命令。但是现在记录已经存在,并且存储过程始终落在else块中,因此始终返回0。
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;
这是因为您正在使用executenonquery。
在存储过程中没有out参数,并且正在使用ExecuteNonQuery——基本上,在客户端,您没有将返回值提供给任何地方。在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()
如果count在你的select查询中,你应该使用executescaler..像
int result=convert.toint32(cmd.executescalar());
或
int result = (Int32)cmd.ExecuteScalar();