7

我对以下代码有疑问。我将参数 ( 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();
       }
4

2 回答 2

10

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

cmdExecuteReader.Parameters.AddWithValue(param.ParameterName,
        param.Value ?? DBNull.Value);

(注意与 的空合并DBNull.Value

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

另请注意,传入列表中的某些参数可能是输入-输出、输出或结果。我很想用类似的东西代替:

SqlParameter newParam = cmdExecuteReader.Parameters.Add(
      param.ParameterName, param.SqlDbType, param.Size);
newParam.Value = param.Value ?? DBNull.Value;
newParam.Direction = param.Direction;
于 2010-05-06T11:37:19.663 回答
0

我做了你想做的事情,这里有一些例子:

public int ChangeState(int id, int stateId)
{
    return DbUtil.ExecuteNonQuerySp("changeDossierState", Cs, new { id, stateId });
}

public IEnumerable<Dossier> GetBy(int measuresetId, int measureId, DateTime month)
{
    return DbUtil.ExecuteReaderSp<Dossier>("getDossiers", Cs, new { measuresetId, measureId, month });
}

我建议你看这里

并下载示例解决方案(其中包含 DAL 示例项目) http://valueinjecter.codeplex.com/

于 2010-08-23T21:11:26.210 回答