コード例 #1
0
        static Action <IDataReader, object> CreateSetValueAction(PropertyInfo info, Type columnType, string columnName)
        {
            Type propType = info.PropertyType;

            Action <IDataReader, object> SetValueAction;

            if (propType.BaseType.Equals(typeof(System.Enum)))
            {
                SetValueAction = (IDataReader dr, object obj) =>
                {
                    if (IDataReaderExtensionHelper.IsNumeric(dr[columnName]))
                    {
                        info.SetValue(obj, System.Enum.ToObject(propType, Convert.ToInt32(dr[columnName])), null);
                    }
                    else
                    {
                        if (!dr.GetString(columnName).IsNullOrEmptyAfterTrim() && Enum.IsDefined(propType, dr[columnName]))
                        {
                            object value = Enum.Parse(propType, dr[columnName].ToString());
                            info.SetValue(obj, value, null);
                        }
                    }
                };
            }
            else if (propType.Equals(columnType))
            {
                SetValueAction = (IDataReader dr, object obj) =>
                {
                    info.SetValue(obj, dr[columnName], null);
                };
            }
            else
            {
                //different types
                SetValueAction = (IDataReader dr, object obj) =>
                {
                    Type   t         = Nullable.GetUnderlyingType(propType) ?? propType;
                    object safevalue = dr[columnName] == null ? null : Convert.ChangeType(dr[columnName], t);
                    info.SetValue(obj, safevalue, null);
                };
            }

            return((IDataReader dr, object obj) =>
            {
                if (dr.HasColumn(columnName))
                {
                    if (Convert.IsDBNull(dr[columnName]))
                    {
                        info.SetValue(obj, null, null);
                        //  info.SetValue(obj, Null.GetNull(info), null);
                    }
                    else
                    {
                        SetValueAction.Invoke(dr, obj);
                    }
                }
            });
        }
コード例 #2
0
        public static T Single <T>(this IDataReader dr, bool closeDataReader = true)
        {
            T obj = default(T);

            while (dr.Read())
            {
                obj = IDataReaderExtensionHelper.CreateObject <T>(dr);
            }

            if (closeDataReader)
            {
                dr.Close();
            }

            return(obj);
        }
コード例 #3
0
        public static List <T> FillCollection <T>(this IDataReader dr, bool closeDataReader = true)
        {
            List <T> list = new List <T>();

            while (dr.Read())
            {
                T obj = IDataReaderExtensionHelper.CreateObject <T>(dr);
                list.Add(obj);
            }

            if (closeDataReader)
            {
                dr.Close();
            }

            return(list);
        }
コード例 #4
0
        static List <Action <IDataReader, object> > CreatePropertyMapping <T>(IDataReader dr)
        {
            List <PropertyInfo> properties = IDataReaderExtensionHelper.GetPropertyInfo <T>();
            List <Action <IDataReader, object> > mapping = new List <Action <IDataReader, object> >();

            int i;

            for (i = 0; i < dr.FieldCount; i++)
            {
                string columnName = dr.GetName(i);
                //now find matching property
                PropertyInfo propMatch = (from p in properties
                                          where p.Name.ToLower() == columnName.ToLower()
                                          select p).FirstOrDefault();
                if (propMatch != null)
                {
                    Type columnType = dr.GetFieldType(i);
                    Action <IDataReader, object> action = CreateSetValueAction(propMatch, columnType, columnName);
                    mapping.Add(action);
                }
            }
            return(mapping);
        }
コード例 #5
0
 public static int ExecuteNonQuery <T>(IDbCommand command, T item)
 {
     IDataReaderExtensionHelper.FillParameters <T>(item, command);
     return(command.ExecuteNonQuery());
 }