1

我有一个简单的存储过程,它需要 1 个输入参数并有 2 个输出参数:

CREATE PROCEDURE [dbo].[usp_StoredProcName]
    @inputVal nvarchar(255),
    @isError bit OUTPUT,
    @errorInfo nvarchar(255) OUTPUT
AS BEGIN
DECLARE @totalRow int = 0;
DECLARE @inputValID uniqueidentifier;

SET @isError = 1;
SET @errorInfo = '';

SELECT @inputValID = [inputValID]
FROM testTable
WHERE inputVal = @inputVal;

IF @inputValID IS NULL
BEGIN
    SET @isError = 0;
    SET @errorInfo = 'inputVal not found';
    RETURN
END
END

为了执行这个参数化的存储过程,我使用了几个 C# 方法,它们都返回这个错误:

过程或函数“sp_StoredProcName”需要未提供的参数“@inputVal”。

方法一(调用参数化存储过程):

using (SqlConnection con = new SqlConnection(myFullConncectionStringToDB))
{
   using (SqlCommand cmd = new SqlCommand("sp_StoredProcName", con))
   {
      cmd.CommandType = CommandType.StoredProcedure;

      cmd.Parameters.AddWithValue("@inputVal", "MyParamVal_12345");

      cmd.Parameters["@isError"].Direction = ParameterDirection.Output;
      cmd.Parameters["@errorInfo"].Direction = ParameterDirection.Output;

      con.Open();
      cmd.ExecuteNonQuery();

      var isError = cmd.Parameters["@isError"].Value;
      var errInfo = cmd.Parameters["@errorInfo"].Value;
      con.Close();
   }
}

方法二(调用参数化存储过程):

SqlConnection con = new SqlConnection(myFullConncectionStringToDB);
SqlCommand cmd = new SqlCommand("sp_StoredProcName", con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter in_parm = new SqlParameter("@inputVal", SqlDbType.NVarChar);
in_parm.Size = 255;
in_parm.Value = "MyParamVal_12345";
in_parm.Direction = ParameterDirection.Input;
cmd.Parameters.Add(in_parm);

SqlParameter out_parm = new SqlParameter("@errorInfo", SqlDbType.NVarChar);
out_parm.Size = 255;
out_parm.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(out_parm);

SqlParameter out_parm1 = new SqlParameter("@isError", SqlDbType.Bit);
out_parm1.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(out_parm1);

con.Open();
cmd.ExecuteNonQuery();
con.Close();

上述两种 c# 方法都返回相同的错误:

过程或函数“sp_StoredProcName”需要未提供的参数“@inputVal”。

请告诉我我在执行存储过程的 C# 代码中做错了什么。

我显然在我的两种方法中都传递了参数值,但无法弄清楚为什么它一直显示此错误。

太感谢了!

4

1 回答 1

2

您在 Create Procedure 之后的行中将 @InputVal 设置为输入参数

CREATE PROCEDURE [dbo].[sp_StoredProcName]

@inputVal nvarchar(255),

然后再次创建它作为唯一标识符。

DECLARE @inputVal uniqueidentifier;

这不是有效的语法。改变一个或另一个。如果您不想采用输入参数(这将消除您所询问的错误),请删除第一个。

于 2013-09-04T14:13:52.843 回答