Esempio n. 1
0
        private void SetValue(PropertyInfo property, object value)
        {
            if (value == null || value == DBNull.Value)
            {
                value = null;
            }
            else if (value.GetType() != property.PropertyType)
            {
                Type underlyingType = DbTypeMap.GetUnderlyingType(property.PropertyType);

                value = Convert.ChangeType(value, underlyingType);
            }

            property.SetValue(this, value);
        }
Esempio n. 2
0
        private void Build()
        {
            parameters.Clear();
            returnValueCallbacks.Clear();

            foreach (var property in this.GetType().GetProperties())
            {
                if (property.CanRead)
                {
                    string parameterName            = "@" + property.Name;
                    var    parameterDirectionAttrib = property.GetCustomAttributes(typeof(ParameterDirectionAttribute), false).FirstOrDefault() as ParameterDirectionAttribute;

                    if (parameterDirectionAttrib == null || parameterDirectionAttrib.ParameterDirection == ParameterDirection.Input)
                    {
                        if (typeof(DataTable).IsAssignableFrom(property.PropertyType))
                        {
                            var value = property.GetValue(this) as DataTable;

                            if (value != null)
                            {
                                this.parameters.Add(new QueryParameter(parameterName, value.TableName, value));
                            }
                        }
                        else
                        {
                            DbType dbType;
                            Type   underlyingType = DbTypeMap.GetUnderlyingType(property.PropertyType);

                            if (DbTypeMap.TryGetValue(underlyingType, out dbType))
                            {
                                object value = GetValue(property, underlyingType);

                                this.parameters.Add(new QueryParameter(parameterName, dbType, value));
                            }
                        }
                    }
                    else
                    {
                        if (!property.CanWrite)
                        {
                            throw new InvalidOperationException("Error: cannot declare a property as Output, InputOutput return ReturnValue if it is not writable.");
                        }

                        DbType dbType;
                        Type   underlyingType = DbTypeMap.GetUnderlyingType(property.PropertyType);

                        if (DbTypeMap.TryGetValue(underlyingType, out dbType))
                        {
                            object value = (parameterDirectionAttrib.ParameterDirection == ParameterDirection.InputOutput)
                                                    ? GetValue(property, underlyingType)
                                                    : DBNull.Value;

                            var parameter = new QueryParameter(parameterName, dbType, value, parameterDirectionAttrib.ParameterDirection);

                            this.parameters.Add(parameter);

                            this.returnValueCallbacks.Add(() =>
                            {
                                SetValue(property, parameter.Value);
                            });
                        }
                    }
                }
            }
        }