2013-07-17 145 views
4

我有一個存儲過程如下:與OUT參數的存儲過程

ALTER PROCEDURE [dbo].[sp_CheckEmailAvailability] -- Add the 
parameters for the stored procedure here (@Email VARCHAR(50)=null, 
@Count int OUTPUT 

) AS BEGIN  
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. SET NOCOUNT ON; 

    -- Insert statements for procedure here  
    SELECT @Count=COUNT(*) from dbo.tx_UserPersonalDetails where [email protected] 


    END 

我在我的aspx.cs頁面下面的代碼: -

SqlCommand cmd = new SqlCommand("[dbo].[sp_CheckEmailAvailability]", objcon); 
     int result = 0; 

     try 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      SqlParameter parm = new SqlParameter("@Email", SqlDbType.VarChar); 
      parm.Value = txtUserName.Text.ToString(); 
      parm.Direction = ParameterDirection.Input; 
      cmd.Parameters.Add(parm); 

      SqlParameter parm1 = new SqlParameter("@Count", SqlDbType.Int); 
      // parm1.Value = txtUserName.Text.ToString(); 
      parm.Direction = ParameterDirection.Output; 
      cmd.Parameters.Add(parm1); 

      cmd.Connection.Open(); 
      result=cmd.ExecuteNonQuery(); 


      if (result>0) 
      { 
       lblAvailText.Text = "Email id is in use"; 



      } 
      else 
      { 
       lblAvailText.Text = "Email id is Available"; 
      } 
     } 
     catch (SqlException sql) 
     { 

     } 
     finally 
     { 
      cmd.Connection.Close(); 

     } 

當我運行代碼,我出現以下錯誤: -

正式參數「@Email」未聲明爲OUTPUT參數 ,但傳入的實際參數要求的輸出。

請幫我一把。

+0

你使用了太多的複製/粘貼,並在你的變量名犯了一個錯誤的第二個參數方向。 – Oded

回答

4

變化

parm.Direction = ParameterDirection.Output; 

parm1.Direction = ParameterDirection.Output; 

你是設置錯誤SqlParam。

parm用於@Email參數,它最初被正確地指定爲Input,但是當你創建parm1時,你不設置它的方向,你設置了parm的方向。

這就是爲什麼你應該使用良好的命名約定。

+0

啊,複製/粘貼問題是最糟糕的!我在這裏結束了大約相同的問題! Tx&1 up! –

2

替代方式 - 儘量使用RETURN -

ALTER PROCEDURE [dbo].[sp_CheckEmailAvailability] 
(
    @Email VARCHAR(50) 
) 
AS BEGIN 

    RETURN (
     SELECT COUNT(1) 
     FROM dbo.tx_UserPersonalDetails 
     WHERE s_Email = @Email 
    ) 

END 
+2

由於代碼中存在'> 0'約束,EXISTS可能是更好的選擇 –

+0

它是平等的。 'lblAvailText.Text = string.Format(「Email id is {0}」,result> 0?「use」:「Available」);' – Devart

+0

我的意思是count(1)是全表掃描 –