使用c#asp.net中的IDbDataParameter []动态设置参数类型

时间:2016-06-14 08:49:28

标签: c# asp.net c#-4.0

我有一个方法可以让我返回数据集。但为此我必须传递我的SP的所有参数 期待SQL。

我正在动态创建SP的所有参数。 因此,当我尝试创建参数时,它会给我空指针异常。

我有一个方法可以返回IDbDataParameter[]我要在IDbDataParameter[]数组中添加参数。

我写了这一行,为数组添加了5个参数

IDbDataParameter[] param = IDbDataParameter(5);

public IDbDataParameter[] CreateParams(WorkEntry workEntry,string CallingPage,string Operation)
{
      IDbDataParameter[] param = new IDbDataParameter(5);

      param[0].DbType = DbType.Int32;
      param[0].Size = 50;
      param[0].ParameterName = "@AutoID";
      param[0].Direction = ParameterDirection.ReturnValue;

      param[1].DbType = DbType.String;
      param[1].Size = 50;
      param[1].ParameterName = "@OperatorName";
      param[1].Direction = ParameterDirection.InputOutput;

      param[2].DbType = DbType.String;
      param[2].Size = 50;
      param[2].ParameterName = "@Date";
      param[2].Direction = ParameterDirection.InputOutput;

      param[3].DbType = DbType.String;
      param[3].Size = 50;
      param[3].ParameterName = "@StartDate";
      param[3].Direction = ParameterDirection.Input;

      param[4].DbType = DbType.String;
      param[4].Size = 50;
      param[4].ParameterName = "@EndDate";
      param[4].Direction = ParameterDirection.Input;

      return param;
}

在此行尝试添加参数后,它正在给我 对象引用未设置为对象的实例。

提前致谢。

2 个答案:

答案 0 :(得分:4)

这一行

IDbDataParameter[] param = IDbDataParameter(5);

看起来像*你正在创建一个新数组,但是它不会为数组中的每个元素创建一个实例。在下一行执行此操作:

param[0].DbType = DbType.Int32;

param[0]仍然为空。你需要实例化它

param[0] = new SqlParameter(); // or whatever implementation you're using.
param[0].DbType = DbType.Int32;
....

*我说"看起来像",但它看起来不像有效的语法 - 应该像

IDbDataParameter[] param = new IDbDataParameter[5];

答案 1 :(得分:2)

问题是您没有创建参数,因此您的数组包含5个空值。这是更好的实现,为您的db provider替换SqlParameter相应的参数类型。

  private IDbDataParameter CreateParameter(DbType parameterType, int size, string name, ParameterDirection direction)
  {
    return new SqlParameter
    {
      DbType = parameterType,
      Size = size,
      ParameterName = name,
      Direction = direction
    };
  }

  public IDbDataParameter[] CreateParams(WorkEntry workEntry, string CallingPage, string Operation)
  {
    IDbDataParameter[] param = new[]
    {
      CreateParameter(DbType.Int32, 50, "@AutoID", ParameterDirection.ReturnValue),
      CreateParameter(DbType.String, 50, "@OperatorName", ParameterDirection.InputOutput),
      CreateParameter(DbType.String, 50, "@Date", ParameterDirection.InputOutput),
      CreateParameter(DbType.String, 50, "@StartDate", ParameterDirection.Input),
      CreateParameter(DbType.String, 50, "@EndDate", ParameterDirection.Input),
    };

    return param;
  }

考虑使用DbProviderFactories类来创建参数。