当我使用ParameterDirection.ReturnValue时,“参数计数与参数值计数不匹配”即将到来

时间:2013-05-01 09:56:09

标签: asp.net sql-server-2008 c#-4.0

我希望通过从SQl过程返回来获取值,但是我收到此错误“参数计数与参数值计数不匹配”。 我的代码是:

public int getControlTypeIDByVal()
    {
        int retVal = 0;
        try
        {
            SqlParameter[] _param = new SqlParameter[2];
            _param[0] = new SqlParameter("@ControlName2", ControlName);
            _param[1] = new SqlParameter("@RetVal", SqlDbType.Int);
            _param[1].Direction = ParameterDirection.ReturnValue;

            SqlDataAccess.ExecuteNonQuery(SqlDataAccess.ConnectionString, "PR_getControlTypeIDByVal", _param);
            if (!clsCommonFn.isNullOrEmpty(_param[1].ToString()))
            {
                retVal = Convert.ToInt32(_param[1]);
            }
        }
        catch (Exception e)
        {
            errorMsg = e.Message;
        }
        return retVal;
    }

和Sp是: -

CREATE PROCEDURE PR_getControlTypeIDByVal
@ControlName2   NVARCHAR(200)
AS
-- EXEC PR_getControlTypeIDByVal 'Jaisalmer 2N/3D'
BEGIN
DECLARE @retVal INT
SET @retVal=0
    SELECT @retVal=ControlTypeID FROM ControlTypes
    WHERE LTRIM(RTRIM(ControlName))=LTRIM(RTRIM(@ControlName2))
PRINT(@retVal)  
RETURN @retVal
END

请帮帮我。

由于

2 个答案:

答案 0 :(得分:0)

如果您想使用ExecuteNonQuery(),则可以将 ParameterDirection 更改为ParameterDirection.OutPut。如果是这种情况,在c#中你要声明两个参数,一个用于输入,一个用于输出。但是在SQL Server中,您没有声明输出参数。

您需要显式定义输出参数。你能试试这个:

CREATE PROCEDURE PR_getControlTypeIDByVal
    @ControlName2   NVARCHAR(200)
    @retVal INT OUTPUT
    AS
    -- EXEC PR_getControlTypeIDByVal 'Jaisalmer 2N/3D'
    BEGIN

    SET @retVal=0
        SELECT @retVal=ControlTypeID FROM ControlTypes
        WHERE LTRIM(RTRIM(ControlName))=LTRIM(RTRIM(@ControlName2))

    RETURN
    END

更新:如果您想使用ParameterDirection.ReturnValue,可以使用这样的内容,而无需更改SP

retVal = yourSQLCommand.Parameters[@retVal].value;

但是,您可以通过不首先添加返回值并使用以下内容返回结果:

retVal = Convert.ToInt32(yourSQLCommand.ExecuteScalar());

答案 1 :(得分:0)

对“@RetVal”使用参数direction作为“ ParameterDirection.ReturnValue ”。所以不需要在存储过程中指定此参数。

关于其价值使用的回顾

_param[1].value.toString();

然后将其转换为integet。