我希望通过从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
请帮帮我。
由于
答案 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。