Esempio n. 1
0
        private MethodInfo GetMethod(string name, Routine routine, bool[] hasConnection, bool returnsTable)
        {
            MethodInfo[] methods = this.GetMethods(name);
            int          i       = -1;

            for (int j = 0; j < methods.Length; j++)
            {
                int num4;
                int num3 = 0;
                hasConnection[0] = false;
                MethodInfo      info       = methods[j];
                ParameterInfo[] parameters = info.GetParameters();
                if ((parameters.Length != 0) && parameters[0].ParameterType.Equals(typeof(DbConnection)))
                {
                    num3             = 1;
                    hasConnection[0] = true;
                }
                if ((parameters.Length - num3) != routine.ParameterTypes.Length)
                {
                    continue;
                }
                if (returnsTable)
                {
                    if (typeof(IEnumerable).IsAssignableFrom(info.ReturnType))
                    {
                        goto Label_00AB;
                    }
                    continue;
                }
                SqlType parameterSqlType = Types.GetParameterSqlType(methods[j].ReturnType);
                if ((parameterSqlType == null) || (parameterSqlType.TypeCode != routine.ReturnType.TypeCode))
                {
                    continue;
                }
Label_00AB:
                num4 = 0;
                while (num4 < routine.ParameterTypes.Length)
                {
                    bool          flag          = false;
                    ParameterInfo info2         = parameters[num4 + num3];
                    Type          parameterType = info2.ParameterType;
                    if (parameterType.IsArray && !typeof(byte[]).Equals(parameterType))
                    {
                        parameterType = parameterType.GetElementType();
                        if (parameterType.IsPrimitive)
                        {
                            info = null;
                            break;
                        }
                        flag = true;
                    }
                    SqlType type3 = Types.GetParameterSqlType(parameterType);
                    if (type3 == null)
                    {
                        info = null;
                        break;
                    }
                    ColumnSchema parameter = routine.GetParameter(num4);
                    if (parameter.GetParameterMode() == 1)
                    {
                        if (!info2.IsOut && !parameterType.IsByRef)
                        {
                            goto Label_0183;
                        }
                        info = null;
                        break;
                    }
                    if (parameter.GetParameterMode() == 4)
                    {
                        if (info2.IsOut && parameterType.IsByRef)
                        {
                            goto Label_0183;
                        }
                        info = null;
                        break;
                    }
                    if ((parameter.GetParameterMode() == 2) && !parameterType.IsByRef)
                    {
                        info = null;
                        break;
                    }
Label_0183:
                    parameter.SetNullable(!parameters[j].ParameterType.IsPrimitive);
                    bool flag2 = routine.ParameterTypes[num4].TypeComparisonGroup == type3.TypeComparisonGroup;
                    if (flag2 && routine.ParameterTypes[num4].IsNumberType())
                    {
                        flag2 = routine.ParameterTypes[num4].TypeCode == type3.TypeCode;
                    }
                    if (flag && (routine.GetParameter(num4).ParameterMode == 1))
                    {
                        flag2 = false;
                    }
                    if (!flag2)
                    {
                        info = null;
                        if ((num4 + num3) > i)
                        {
                            i = num4 + num3;
                        }
                        break;
                    }
                    num4++;
                }
                if (info != null)
                {
                    for (int k = 0; k < routine.ParameterTypes.Length; k++)
                    {
                        routine.GetParameter(k).SetNullable(!parameters[k + num3].ParameterType.IsPrimitive);
                    }
                    return(info);
                }
            }
            if (i >= 0)
            {
                ColumnSchema parameter = routine.GetParameter(i);
                throw Error.GetError(0x1785, parameter.GetNameString());
            }
            return(null);
        }