wake-up-neo.com

Holen Sie sich den Rückgabewert von der gespeicherten Prozedur in asp.net

ich habe eine gespeicherte Prozedur 

ALTER PROC TESTLOGIN
    @UserName varchar(50),
    @password varchar(50)
As
Begin
    declare @return int;

    set @return  = (SELECT COUNT(*) 
                    FROM CPUser 
                    WHERE UserName = @UserName 
                    AND Password = @password);

    return @return;
End

und in c #

SqlConnection con = db.con;
SqlCommand cmd = new SqlCommand("TESTLOGIN", con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter parm = new SqlParameter("@return", SqlDbType.Int);
parm.Direction = ParameterDirection.ReturnValue;

cmd.Parameters.Add(parm);
cmd.Parameters.Add(new SqlParameter("@UserName", txtUserName.Text.ToString().Trim()));
cmd.Parameters.Add(new SqlParameter("@password", txtPassword.Text.ToString().Trim()));

cmd.ExecuteNonQuery();
con.Close();

int id = Convert.ToInt32(parm.Value);

aber immer 0 zurück. Bitte helfen Sie mir, dieses Problem zu lösen

18
Ahmad Abbasi

Sie benötigen einen Parameter, für den Direction im Code auf ParameterDirection.ReturnValue gesetzt ist, aber Sie müssen keinen zusätzlichen Parameter in SP hinzufügen. Versuche dies

  SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
  returnParameter.Direction = ParameterDirection.ReturnValue;
  cmd.ExecuteNonQuery();

  int id = (int) returnParameter.Value;
33

2 Dinge.

  • Die Abfrage muss auf dem SQL-Server abgeschlossen werden, bevor der Rückgabewert gesendet wird.

  • Die Ergebnisse müssen erfasst und dann beendet werden, bevor der Rückgabewert an das Objekt gelangt.

Beenden Sie auf Englisch die Arbeit und rufen Sie den Wert ab.

das wird nicht funktionieren:

                cmm.ExecuteReader();
                int i = (int) cmm.Parameters["@RETURN_VALUE"].Value;

Das wird funktionieren:

                        SqlDataReader reader = cmm.ExecuteReader();
                        reader.Close();

                        foreach (SqlParameter prm in cmd.Parameters)
                        {
                           Debug.WriteLine("");
                           Debug.WriteLine("Name " + prm.ParameterName);
                           Debug.WriteLine("Type " + prm.SqlDbType.ToString());
                           Debug.WriteLine("Size " + prm.Size.ToString());
                           Debug.WriteLine("Direction " + prm.Direction.ToString());
                           Debug.WriteLine("Value " + prm.Value);

                        }

wenn Sie sich nicht sicher sind, überprüfen Sie den Wert des Parameters vor und während und nachdem die Ergebnisse vom Leser verarbeitet wurden.

2
Slick

sie können dies versuchen. Fügen Sie den Parameter als Ausgaberichtung hinzu und erhalten Sie nach Ausführung der Abfrage den Ausgabeparameterwert.

  SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int);
  parmOUT.Direction = ParameterDirection.Output;
  cmd.Parameters.Add(parmOUT);
  cmd.ExecuteNonQuery();
  int returnVALUE = (int)cmd.Parameters["@return"].Value;
1
Tushar Cse

Prozedur gibt niemals einen Wert zurück. Sie müssen einen Ausgabeparameter in der Speicherprozedur verwenden.

ALTER PROC TESTLOGIN
@UserName   varchar(50),
@password   varchar(50)
@retvalue int output
 as
 Begin
    declare @return     int 
    set @return  = (Select COUNT(*) 
    FROM    CPUser  
    WHERE   UserName = @UserName AND Password = @password)

   set @[email protected]
  End

Dann müssen Sie einen sql-Parameter aus c # hinzufügen, dessen Parameterrichtung out ..__ ist. Hoffe das macht Sinn.

0
user1990587