SqlCommand.Parameters.AddWithValue问题:过程或函数X期望参数@Y,未提供

Pet*_*rus 7 c# parameters sqlcommand

我对下面的代码有疑问.我将一个parameter(List<SqlParameter>)传递给执行以下代码的方法.

执行时,SQL Server会抛出一条错误,指出proc需要一个未提供的参数.我知道这个错误并理解它,并且当单步执行代码时,我可以看到该cmdExecuteReader对象具有正确名称和值的参数集合.可能是什么问题呢?

     public SqlDataReader ExecuteReader(string storedProcedure, List<SqlParameter> parameters = null)
        {
                    SqlCommand cmdExecuteReader = new SqlCommand()
                    {
                        CommandType = System.Data.CommandType.Text,
                        Connection = conn,
                        CommandText = storedProcedure
                    };

                    if (parameters != null)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmdExecuteReader.Parameters.AddWithValue(param.ParameterName, param.Value);
                        }
                    }

                    if (conn.State == System.Data.ConnectionState.Closed)
                        conn.Open();
                    return cmdExecuteReader.ExecuteReader();
       }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 10

.Value设置为null任何参数?如果是这样,他们就不会被发送.尝试:

cmdExecuteReader.Parameters.AddWithValue(param.ParameterName,
        param.Value ?? DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

(注意null-coalescing with DBNull.Value)

另请注意,这AddWithValue可能会影响您的查询计划重用,因为(对于字符串等),它使用的长度.如果您需要最高性能,最好使用定义的尺寸手动设置参数.

还要注意,有可能一些在进入的列表的参数可以是输入输出,输出或结果.我很想替代更像的东西:

SqlParameter newParam = cmdExecuteReader.Parameters.Add(
      param.ParameterName, param.SqlDbType, param.Size);
newParam.Value = param.Value ?? DBNull.Value;
newParam.Direction = param.Direction;
Run Code Online (Sandbox Code Playgroud)