2016-08-05 151 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 

这是数据层的代码

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

执行存储过程时,它正确地返回“success”,但它返回-1作为数据层的结果,并且员工详细信息保存在数据库表中。什么想知道为什么应该总是-1作为结果?

+0

你应该检查出[?我们可以停止使用AddWithValue()已经(http://blogs.msmvps.com/jcoehoorn/blog/2014/05/ 12/can-we-stop-using-addwithvalue-already /)并停止使用'.AddWithValue()' - 它可能会导致意外的和令人惊讶的结果... –

+1

存储过程** always **返回一个'Int'作为其返回结果。通常,这用于指示成功或失败,或者在修改操作(插入,更新,删除)的情况下,传回的结果是受该操作影响的*行数*。这里 - 没有修改操作,所以默认情况下,存储过程返回-1(不修改行) –

+0

因此,请改用输出参数或数据读取器。 – ATC

回答

0

-1是成功执行命令的签名,否则如果要检查参数值,可以使用SqlParameter类用于所有参数,然后使用该SqlParameter对象的Value属性。

例如,见下面的代码:

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