注册

C# DmProvider 参数化查询的DmCommand未按指定参数名称进行内部参数化绑定的问题

cjmld5 2021/07/14 1337 2

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:C# DmProvider
【操作系统】:
【CPU】:
【问题描述】*:c#版本的DmProvider(v1.1.0.0)在进行参数化的时候,未能根据参数名称进行参数绑定,而是根据参数顺序进行了绑定导致查询出来的结果集不正确
调度了下反编译后的源码,源码中在BindParameters时会根据SQL中的参数,去internalList中寻找相应的参数来进行匹配。设定的逻辑看源码应该是
:如果给定参数名称,应该按参数名称去匹配参数,如果未给定参数名称,则按参数顺序去匹配。

但是实际在调度时,如果同一个参数出现多次,在DmParameter有ParameterName名称的情况下,并非根据预想的去匹配相应的集合中该名称的值(前几次遍历相同的参数时,parameterInternal.GetName()返回为空),导致还是按未给定参数名称的情况下按顺序进行参数化匹配。

for (int index1 = 0; index1 < this.m_Stmt.DbInfo.GetParameterCount(); ++index1)
      {
        DmParameterInternal parameterInternal = ParamsInfo[index1];
        if (parameterInternal.GetInOutType() != (short) 1 && parameterInternal.GetCType() != 120)
        {
          DmParameter dmParameter = !parameterInternal.GetName().Equals(string.Empty) ? (DmParameter) this.m_Paras[parameterInternal.GetName()] : (DmParameter) this.m_Paras[index1];
          if (dmParameter != null)
          {
            object x = DmSysTypeConvertion.TypeConvertion(dmParameter);
            try
            {
              this.m_SetValue.SetObject(parameterInternal.GetParamValue()[0], x, parameterInternal.GetCType(), parameterInternal.GetPrecision(), parameterInternal.GetScale(), parameterInternal.GetTypeFlag());
            }
    ******
  }
}

回答 0
暂无回答
扫一扫
联系客服