public ParameterTranslationsImpl(IEnumerable <IParameterSpecification> parameterSpecifications) { List <ParameterInfo> ordinalParameterList = new List <ParameterInfo>(); NullableDictionary <string, NamedParamTempHolder> namedParameterMap = new NullableDictionary <string, NamedParamTempHolder>(); int i = 0; foreach (IParameterSpecification spec in parameterSpecifications) { if (spec is PositionalParameterSpecification) { PositionalParameterSpecification ordinalSpec = ( PositionalParameterSpecification )spec; ordinalParameterList.Add(new ParameterInfo(i, ordinalSpec.ExpectedType)); } else if (spec is NamedParameterSpecification) { NamedParameterSpecification namedSpec = ( NamedParameterSpecification )spec; NamedParamTempHolder paramHolder = namedParameterMap[namedSpec.Name]; if (paramHolder == null) { paramHolder = new NamedParamTempHolder(); paramHolder.name = namedSpec.Name; paramHolder.type = namedSpec.ExpectedType; namedParameterMap.Add(namedSpec.Name, paramHolder); } paramHolder.positions.Add(i); } else { // don't care about other param types here, just those explicitly user-defined... // Steve Strong Note: The original Java does not do this decrement; it increments i for // every parameter type. However, within the Loader.GetParameterTypes() method, this introduces // nulls into the paramTypeList array, which in turn causes Loader.ConvertITypesToSqlTypes() to crash // with a null dereference. An alternative fix is to change the Loader to handle the null. I'm // not sure which fix is the most appropriate. // Legacy.FumTest.CompositeIDQuery() shows the bug if you remove the decrement below... i--; } i++; } _ordinalParameters = ordinalParameterList.ToArray(); _namedParameters = new Dictionary <string, ParameterInfo>(); foreach (NamedParamTempHolder holder in namedParameterMap.Values) { _namedParameters.Add(holder.name, new ParameterInfo(ArrayHelper.ToIntArray(holder.positions), holder.type)); } }
public ParameterTranslationsImpl(IEnumerable<IParameterSpecification> parameterSpecifications) { List<ParameterInfo> ordinalParameterList = new List<ParameterInfo>(); NullableDictionary<string, NamedParamTempHolder> namedParameterMap = new NullableDictionary<string, NamedParamTempHolder>(); int i = 0; foreach (IParameterSpecification spec in parameterSpecifications) { if ( spec is PositionalParameterSpecification) { PositionalParameterSpecification ordinalSpec = ( PositionalParameterSpecification ) spec; ordinalParameterList.Add( new ParameterInfo( i, ordinalSpec.ExpectedType) ); } else if ( spec is NamedParameterSpecification ) { NamedParameterSpecification namedSpec = ( NamedParameterSpecification ) spec; NamedParamTempHolder paramHolder = namedParameterMap[namedSpec.Name]; if ( paramHolder == null ) { paramHolder = new NamedParamTempHolder(); paramHolder.name = namedSpec.Name; paramHolder.type = namedSpec.ExpectedType; namedParameterMap.Add( namedSpec.Name, paramHolder ); } paramHolder.positions.Add( i ); } else { // don't care about other param types here, just those explicitly user-defined... // Steve Strong Note: The original Java does not do this decrement; it increments i for // every parameter type. However, within the Loader.GetParameterTypes() method, this introduces // nulls into the paramTypeList array, which in turn causes Loader.ConvertITypesToSqlTypes() to crash // with a null dereference. An alternative fix is to change the Loader to handle the null. I'm // not sure which fix is the most appropriate. // Legacy.FumTest.CompositeIDQuery() shows the bug if you remove the decrement below... i--; } i++; } _ordinalParameters = ordinalParameterList.ToArray(); _namedParameters = new Dictionary<string, ParameterInfo>(); foreach (NamedParamTempHolder holder in namedParameterMap.Values) { _namedParameters.Add(holder.name, new ParameterInfo( ArrayHelper.ToIntArray( holder.positions ), holder.type )); } }