Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#asp.net中使用IDbDataParameter[]动态设置参数类型_C#_Asp.net_C# 4.0 - Fatal编程技术网

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

在c#asp.net中使用IDbDataParameter[]动态设置参数类型,c#,asp.net,c#-4.0,C#,Asp.net,C# 4.0,我有一个方法可以返回数据集。但为此,我必须传递SP所需的所有参数 对SQL的期望值 我正在动态创建SP的所有参数。 因此,当我尝试创建参数时,它会给我null指针异常 我有一个方法返回给我IDbDataParameter[]我想在IDbDataParameter[]数组中添加参数 我写这行代码是为了给数组添加5个参数 IDbDataParameter[] param = IDbDataParameter(5); public IDbDataParameter[] CreateParams(Wo

我有一个方法可以返回数据集。但为此,我必须传递SP所需的所有参数 对SQL的期望值

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

我有一个方法返回给我
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;
}
在这行之后,当它尝试添加参数时,它会给我 对象引用未设置为对象的实例

提前谢谢。

这一行

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];
这条线

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];

问题是您没有创建参数,因此数组包含5个空值。下面是更好的实现,将SqlParameter替换为适合您的db提供程序的参数类型

  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;
  }

考虑使用DbProviderFactorys类创建参数。

问题在于您没有创建参数,因此数组包含5个空值。下面是更好的实现,将SqlParameter替换为适合您的db提供程序的参数类型

  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;
  }

考虑使用DbProviderFactorys类创建参数。

哪一行出错?此行参数[0]。DbType=DbType.Int32;显示方法的代码
GetParameters(5)
很抱歉,我现在已经更新了问题您仍然没有在问题中添加
GetParameters
方法代码哪一行出现错误?此行参数[0]。DbType=DbType.Int32;显示方法的代码
GetParameters(5)
抱歉,我现在更新了问题您仍然没有在问题中添加
GetParameters
方法代码是的,先生,它工作得非常好。&还有一个疑问是,没有创建对象的原因是接口?因为它没有进行初始化另一个疑问是如何允许我们为接口IDbDataParameter[]param=newIDBDataParameter[5]创建对象;是的,先生,它工作得很好还有一个疑问是,没有创建对象的原因是接口?因为它没有进行初始化另一个疑问是如何允许我们为接口IDbDataParameter[]param=newIDBDataParameter[5]创建对象;谢谢,先生,它也在工作。但是我确实喜欢这个IDbDataParameter[]param=CreateParameter(DbType parameterType,int size,string name,ParameterDirection),但是在这种情况下,我不必每次都创建sqlparameter对象&CreateParameter将返回IDbDataParameter[]。但我确实喜欢这个IDbDataParameter[]param=CreateParameter(DbType parameterType、int size、字符串名称、ParameterDirection方向),但在这种情况下,我不必每次都创建sqlparameter对象&CreateParameter将返回IDbDataParameter[]