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

请帮我。

谢谢

4

2 回答 2

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());
于 2013-05-01T10:11:31.390 回答
0

使用参数方向作为“@RetVal”的“ ParameterDirection.ReturnValue ”。所以不需要在存储过程中指定这个参数。

并在其价值使用的恢复

_param[1].value.toString();

然后将其转换为整数。

于 2013-05-01T11:14:51.083 回答