2016-08-05 17 views
-1

Dies ist die procedure--Das gespeicherte prodecure Ergebnis zurückgeben wird immer -1 im Rückergebnis

ALTER PROCEDURE [dbo].[EMPLOYEE_DETAILS_ADD_NEW] 
    @EMPLOYE_NAME VARCHAR(50), 
    @EMPLOYE_ADDRESS VARCHAR(100), 
    @EMPLOYE_PHONE VARCHAR(50), 
    @EMPLOYE_EMAIL VARCHAR(100), 
    @EMPLOYE_STATUS INT 
AS 
BEGIN 
    BEGIN TRY 
    BEGIN TRAN 
     SET NOCOUNT ON; 

     IF NOT EXISTS(SELECT 1 FROM EMPLOYE_DETAILS 
         WHERE (EMPLOYE_NAME = @EMPLOYE_NAME AND EMPLOYE_STATUS <> 3)) 
     BEGIN 
      -- Insert statements for procedure here 
      INSERT INTO EMPLOYE_DETAILS (EMPLOYE_NAME, EMPLOYE_ADDRESS, EMPLOYE_PHONE, EMPLOYE_EMAIL, EMPLOYE_STATUS) 
      VALUES (@EMPLOYE_NAME, @EMPLOYE_ADDRESS, @EMPLOYE_PHONE, @EMPLOYE_EMAIL, @EMPLOYE_STATUS) 

      SELECT 'SUCCESS' AS result 
     END 
     ELSE 
     BEGIN 
      SELECT 'EXIST' AS result 
     END 
    COMMIT TRAN 
    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT > 0 
      ROLLBACK TRAN 

     SELECT 'FAIL' AS result 
    END CATCH 
END 
gespeichert

Dies ist der Code in data

public string EmployeDetailsAdd(EmployeInfo info) 
{ 
    try 
    { 
     SqlCommand cmd = new SqlCommand("EMPLOYEE_DETAILS_ADD_NEW", con); 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.AddWithValue("@EMPLOYE_NAME", info.EMPLOYE_NAME); 
     cmd.Parameters.AddWithValue("@EMPLOYE_ADDRESS", info.EMPLOYE_ADDRESS); 
     cmd.Parameters.AddWithValue("@EMPLOYE_PHONE", info.EMPLOYE_PHONE); 
     cmd.Parameters.AddWithValue("@EMPLOYE_EMAIL", info.EMPLOYE_EMAIL); 
     cmd.Parameters.AddWithValue("@EMPLOYE_STATUS", info.EMPLOYE_STATUS); 

     con.Open(); 
     string result = cmd.ExecuteNonQuery().ToString(); 
     con.Close(); 

     return result.ToString() ; 
    } 
    catch(Exception ee) 
    { 
     throw ee; 
    } 
    finally 
    { } 
} 

-I auch schon versucht, diese auch , aber wie oben das gleiche Ergebnis zeigen ---

public string EmployeDetailsAdd(EmployeInfo info) 
    { 
     try 
     { 
      SqlParameter[] parameter = new SqlParameter[5]; 

      parameter[0] = PrepareParameter("@EMPLOYE_NAME", SqlDbType.VarChar, ParameterDirection.Input,info.EMPLOYE_NAME); 
      parameter[1] = PrepareParameter("@EMPLOYE_ADDRESS", SqlDbType.VarChar, ParameterDirection.Input, info.EMPLOYE_ADDRESS); 
      parameter[2] = PrepareParameter("@EMPLOYE_PHONE", SqlDbType.VarChar, ParameterDirection.Input, info.EMPLOYE_PHONE); 
      parameter[3] = PrepareParameter("@EMPLOYE_EMAIL", SqlDbType.VarChar, ParameterDirection.Input, info.EMPLOYE_EMAIL); 
      parameter[4] = PrepareParameter("@EMPLOYE_STATUS", SqlDbType.VarChar, ParameterDirection.Input, info.EMPLOYE_STATUS); 
      object result = ExecuteScalar("EMPLOYEE_DETAILS_ADD_NEW", CommandType.StoredProcedure, parameter); 
      return result.ToString(); 
     } 

     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

Wenn die gespeicherte Prozedur ausgeführt wird, ist es richtig zurückgibt „Erfolg“, aber es Rückkehr -1 als Ergebnis im Datenlayer und auch die Mitarbeiterdetails werden in der Datenbanktabelle gespeichert. Was willst du wissen warum sollte immer -1 als Ergebnis?

+0

Sie sollten überprüfen, [? Können wir AddWithValue() bereits nicht mehr verwenden] (http://blogs.msmvps.com/jcoehoorn/blog/2014/05/ 12/can-we-stop-using-addwithvalue-already /) und hört mit '.AddWithValue()' auf - es kann zu unerwarteten und überraschenden Ergebnissen führen ... –

+1

Eine gespeicherte Prozedur ** always ** gibt ein 'Int' zurück als sein Ergebnis. In der Regel wird dies verwendet, um Erfolg oder Misserfolg anzuzeigen, oder im Falle von Modifizierungsvorgängen (Einfügen, Aktualisieren, Löschen) ist das zurückgegebene Ergebnis die * Anzahl der Zeilen *, die von dieser Operation betroffen sind. Hier - es gibt keine Modifizierungsoperation, daher gibt die gespeicherte Prozedur standardmäßig -1 zurück (keine Zeilen geändert) –

+0

Verwenden Sie stattdessen einen Ausgabeparameter oder einen Datenleser. – ATC

Antwort

0

-1 ist die Signatur, dass der Befehl erfolgreich ausgeführt wird. Wenn Sie Werte von Parametern überprüfen möchten, können Sie die Klasse SqlParameter für alle Parameter verwenden und dann Value die Eigenschaft SqlParameter Object verwenden.

Siehe folgenden Code zum Beispiel:

using (System.Data.SqlClient.SqlConnection myConnection = new System.Data.SqlClient.SqlConnection(ConfigurationManager. 
ConnectionStrings["ConnectionString2"].ConnectionString)) 
{ 
System.Data.SqlClient.SqlCommand myCommand2 = new System.Data.SqlClient.SqlCommand(); 
myCommand2.CommandText = "usp_get_email_to"; 
myCommand2.CommandType = CommandType.StoredProcedure; 
myCommand2.Connection = myConnection; 

// Return value as parameter 
SqlParameter returnEmail = new SqlParameter("Email", SqlDbType.NVarChar); 
returnEmail.Direction = ParameterDirection.ReturnValue; 
myCommand2.Parameters.Add(returnEmail); 

// Execute the stored procedure 
myConnection.Open(); 
myCommand2.ExecuteNonQuery(); 
myConnection.Close(); 

return returnEmail.Value.ToString();