2016-08-05 11 views
-1

Это хранимая procedure--Сохраненный результат prodecure всегда возвращают -1 в результате возврата

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 

Это код в Datalayer

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 
    { } 
} 

--Я также попытался это также , но показать тот же результат, как и выше ---

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; 
     } 
    } 

При выполнении хранимой процедуры, это правильно возвращает «успех», но его возвращение -1 как результат в datalayer, а также данные о сотрудниках сохраняются в таблице базы данных. Что нужно знать, почему всегда должно быть результатом -1?

+0

Вы должны проверить [? Можно ли прекратить использование AddWithValue() уже] (http://blogs.msmvps.com/jcoehoorn/blog/2014/05/ 12/can-we-stop-using-addwithvalue-уже /) и прекратить использование '.AddWithValue()' - это может привести к неожиданным и неожиданным результатам ... –

+1

Хранимая процедура ** всегда ** возвращает 'Int' как результат его возвращения. Как правило, это используется для указания успеха или неудачи, или в случае модификации операций (вставка, обновление, удаление), возвращаемый результат - это * количество строк *, затронутых этой операцией. Здесь - нет никакой операции модификации, поэтому по умолчанию хранимая процедура возвращает -1 (без изменений строк) –

+0

Так что вместо этого используйте выходной параметр или считыватель a.data. – ATC

ответ

0

-1 является подписью, которая выполняется команда успешно в противном случае, если вы хотите, чтобы проверить значение параметров, которые можно с помощью SqlParameter класса для всех параметров, а затем, используя Value свойства этого SqlParameter объекта.

См следующий код, например:

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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^