存储过程始终返回0
我试图从存储过程中返回值,但它总是返回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块中,因此总是返回零。
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;
这是因为你正在使用executtenonquery。
您应该使用executioncalar返回单个值。
您的存储过程中没有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()
如果count在你的select查询中你应该使用executioncaler ..就像
int result=convert.toint32(cmd.executescalar());
要么
上述就是C#学习教程:存储过程始终返回0分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
int result = (Int32)cmd.ExecuteScalar();
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1023985.html