【问题标题】:stored procedure with out parameter不带参数的存储过程
【发布时间】:2013-07-17 13:23:34
【问题描述】:

我有一个存储过程如下:

 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 s_Email=@Email


     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 参数, 但实际参数在请求的输出中传递。

请帮帮我。

【问题讨论】:

  • 您使用了过多的复制/粘贴,并在第二个参数方向的变量名称中出错。

标签: sql-server c#-4.0 stored-procedures


【解决方案1】:

改变

parm.Direction = ParameterDirection.Output;

parm1.Direction = ParameterDirection.Output;

您设置了错误的 SqlParam。

parm 用于@Email 参数,最初正确指定为输入,但是当您创建parm1 时,您没有设置它的方向,而是设置了parm 的方向。

这就是为什么您应该使用良好的命名约定。

【讨论】:

  • 啊,复制/粘贴问题是最糟糕的!我最终遇到了大致相同的问题! 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

【讨论】:

  • 由于代码中有> 0 约束,EXISTS 可能是更好的选择
  • 它是平等的。 lblAvailText.Text = string.Format("Email id is {0}", result > 0 ? "use" : "Available");
  • 我的意思是 count(1) 是全表扫描
  • 一般 - 否(在 sql server 2005 上检查)。如果您没有聚集索引 - 是的。
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
相关资源
最近更新 更多