Example #1
0
        internal static void AddParametersToCommand(this ISqlTemplate template, DbCommand command, DataService dataService)
        {
            if (template == null)
            {
                throw new ArgumentNullException(nameof(template));
            }
            if (command == null)
            {
                throw new ArgumentNullException(nameof(command));
            }
            Type templateType    = template.GetType();
            var  getters         = templateType.GetPropertyGetters();
            var  parameterPrefix = dataService.EntityLiteProvider.ParameterPrefix;

            foreach (var pi in templateType.GetProperties())
            {
                var attrs = pi.GetCustomAttributes(typeof(DbParameterAttribute), false);
                if (attrs.Length > 0)
                {
                    var parameterAttr          = (DbParameterAttribute)attrs[0];
                    IDbDataParameter parameter = command.CreateParameter();
                    parameter.ParameterName = parameterPrefix + pi.Name;
                    parameter.SourceColumn  = pi.Name;
                    if (parameterAttr.ProviderType == int.MaxValue)
                    {
                        parameter.DbType = parameterAttr.DbType;
                    }
                    else
                    {
                        dataService.EntityLiteProvider.SetProviderTypeToParameter(parameter, parameterAttr.ProviderType);
                    }
                    parameter.Direction = parameterAttr.Direction;
                    if (parameterAttr.Size != 0)
                    {
                        parameter.Size = parameterAttr.Size;
                    }
                    if (parameterAttr.Precision != 0)
                    {
                        parameter.Precision = parameterAttr.Precision;
                    }
                    if (parameterAttr.Scale != 0)
                    {
                        parameter.Scale = parameterAttr.Scale;
                    }
                    object propValue = getters[pi.Name](template);
                    parameter.Value = propValue == null ? DBNull.Value : propValue;
                    command.Parameters.Add(parameter);
                }

                attrs = pi.GetCustomAttributes(typeof(DbParameterSerieAttribute), false);
                if (attrs.Length > 0)
                {
                    var    parameterAttr = (DbParameterSerieAttribute)attrs[0];
                    object propValue     = getters[pi.Name](template);
                    if (propValue != null)
                    {
                        var items = propValue as IEnumerable;
                        if (items == null)
                        {
                            throw new ArgumentException(pi.Name + " property is not enumerable. Properties decorated with DbParameterSerieAttribute must be enumerable");
                        }
                        int i = 0;
                        foreach (object item in items)
                        {
                            IDbDataParameter parameter = command.CreateParameter();
                            parameter.ParameterName = parameterPrefix + pi.Name + i.ToString(CultureInfo.InvariantCulture);
                            parameter.SourceColumn  = pi.Name + i.ToString(CultureInfo.InvariantCulture);
                            if (parameterAttr.ProviderType == int.MaxValue)
                            {
                                parameter.DbType = parameterAttr.DbType;
                            }
                            else
                            {
                                dataService.EntityLiteProvider.SetProviderTypeToParameter(parameter, parameterAttr.ProviderType);
                            }
                            parameter.Direction = parameterAttr.Direction;
                            if (parameterAttr.Size != 0)
                            {
                                parameter.Size = parameterAttr.Size;
                            }
                            if (parameterAttr.Precision != 0)
                            {
                                parameter.Precision = parameterAttr.Precision;
                            }
                            if (parameterAttr.Scale != 0)
                            {
                                parameter.Scale = parameterAttr.Scale;
                            }

                            parameter.Value = item == null ? DBNull.Value : item;
                            command.Parameters.Add(parameter);
                            i++;
                        }
                    }
                }
            }
        }