Procédure stockée renvoyant toujours 0

J'essaye d'get la valeur returnnée de la procédure stockée, mais elle renvoie toujours 0.

c # code

cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "AbsentEntry"; cmd.Parameters.Add("@EmpID", SqlDbType.VarChar).Value = ViewState["empID"].ToSsortingng(); cmd.Parameters.Add("@AttendanceDate", SqlDbType.Date).Value = date.ToSsortingng("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 

Dans tous les cas, il renvoie 0. Je ne peux pas comprendre le problème.

J'ai essayé un code similaire au vôtre et cela fonctionne comme prévu.
Cependant, dans votre code, vous appelez ExecuteNonQuery deux fois.

Lorsque le premier appel est effectué, l'logging est inséré comme prévu, puis vous ajoutez le paramètre pour la valeur de return et exécutez à nouveau la command. Mais maintenant l'logging existe et la procédure stockée tombe toujours dans le bloc else, returnnant toujours zéro.

 cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "AbsentEntry"; cmd.Parameters.Add("@EmpID", SqlDbType.VarChar).Value = ViewState["empID"].ToSsortingng(); cmd.Parameters.Add("@AttendanceDate", SqlDbType.Date).Value = date.ToSsortingng("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; 

C'est parce que vous utilisez executenonquery.

Vous devez utiliser executescalar pour renvoyer une seule valeur.

Vous n'avez pas de paramètre out dans votre procédure stockée, et vous utilisez ExecuteNonQuery – en gros, côté client, vous ne donnez pas la valeur reurn nulle part où aller. En termes de C #, c'est comme si vous appeliez une fonction, mais ne la faisiez pas partie d'une affectation. x = getX (); vs getX ();

Vous pouvez résoudre ce problème en modifiant la procédure stockée pour qu'elle possède un paramètre de sortie

 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 

Ou, plus simplement, en utilisant ExecuteScalar et assignez le résultat à une variable.

 int result = (int) cmd.ExecuteScalar() 

si count est dans votre requête de sélection, vous devriez utiliser executescaler .. like

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

ou

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