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); } } }); }
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); }
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); }
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); }
public static int ExecuteNonQuery <T>(IDbCommand command, T item) { IDataReaderExtensionHelper.FillParameters <T>(item, command); return(command.ExecuteNonQuery()); }