/// <summary> /// DataSource로부터 새로운 Persistent object를 빌드합니다. /// </summary> /// <param name="dataReader">데이타 소스</param> /// <returns>Persistent object</returns> public override T Persist(IDataReader dataReader) { dataReader.ShouldNotBeNull("dataReader"); if (IsDebugEnabled) { log.Debug("Build Persistent object of Type [{0}] from IDataReader... Name Mapping method=[{1}]", typeof(T).FullName, NameMapper.GetType().FullName); } var persistent = FactoryFunction(); var columnNames = Enumerable.Range(0, dataReader.FieldCount).Select <int, string>(dataReader.GetName).ToArray(); foreach (var columnName in columnNames) { var propertyName = NameMapper.MapToPropertyName(columnName); if (propertyName.IsNotWhiteSpace()) { var columnValue = dataReader.AsValue(columnName); if (IsDebugEnabled) { log.Debug("속성명 [{0}]에 DataReader 컬럼명 [{1}]의 값 [{2}]를 설정합니다...", propertyName, columnName, columnValue); } DynamicAccessor.SetPropertyValue(persistent, propertyName, columnValue); } } return(persistent); }
/// <summary> /// 생성자 /// </summary> /// <param name="reader"></param> /// <param name="fieldNames"></param> public AdoResultRow(IDataReader reader, IList <string> fieldNames) { fieldNames = fieldNames ?? reader.GetFieldNames(); foreach (var fieldName in fieldNames) { Add(fieldName, reader.AsValue(fieldName)); } }
/// <summary> /// <paramref name="reader"/>를 읽어, <see cref="ResultRow"/>의 컬렉션인 <see cref="ResultSet"/>을 빌드합니다. /// </summary> /// <param name="reader">DataReader</param> /// <param name="nameMapper">컬럼명을 속성명으로 매핑해주는 매퍼입니다.</param> /// <param name="firstResult">첫번째 레코드 인덱스 (0부터 시작)</param> /// <param name="maxResults">최대 레코드 수</param> /// <returns><see cref="ResultSet"/> 인스턴스</returns> public static ResultSet CreateResultSet(this IDataReader reader, INameMapper nameMapper, int firstResult, int maxResults) { reader.ShouldNotBeNull("reader"); if (nameMapper == null) { nameMapper = new SameNameMapper(); } if (IsDebugEnabled) { log.Debug("IDataReader로부터 정보를 읽어 ResultRow들을 만들어 ResultSet 으로 빌드합니다..."); } var resultSet = new ResultSet(); while (firstResult-- > 0) { if (reader.Read() == false) { return(resultSet); } } if (maxResults <= 0) { maxResults = int.MaxValue; } resultSet.FieldNames = reader.GetFieldNames(); var rowIndex = 0; while (reader.Read() && rowIndex++ < maxResults) { var row = new ResultRow(); foreach (var fieldName in resultSet.FieldNames) { row.Add(nameMapper.MapToPropertyName(fieldName), reader.AsValue(fieldName)); } resultSet.Add(row); } if (IsDebugEnabled) { log.Debug("IDataReader로부터 정보를 읽어 ResultSet을 빌드했습니다!!! Row Count=[{0}]", resultSet.Count); } return(resultSet); }
/// <summary> /// <paramref name="reader"/>를 읽어, <see cref="ResultRow"/>를 빌드합니다. /// </summary> /// <param name="reader">DataReader</param> /// <param name="fieldNames">컬럼명 리스트</param> /// <param name="nameMapper">컬럼명을 속성명으로 매핑해주는 매퍼입니다.</param> /// <returns></returns> internal static ResultRow CreateResultRow(this IDataReader reader, IList <string> fieldNames, INameMapper nameMapper) { Guard.Assert(reader.IsClosed == false, "reader 가 닫혀있습니다."); var row = new ResultRow(); foreach (var fieldName in fieldNames) { row.Add(nameMapper.MapToPropertyName(fieldName), reader.AsValue(fieldName)); } return(row); }
/// <summary> /// System.Byte 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">Column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(byte) 값을 반환한다.</returns> public static byte AsByte(this IDataReader reader, int index, Func <byte> valueFactory = null) { return(reader.AsValue <byte>(index, valueFactory)); }
/// <summary> /// Get TimeSpan Value /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="columnName">column name</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>if value is DBNull, return TimeSpan.Zero</returns> public static TimeSpan AsTimeSpan(this IDataReader reader, string columnName, Func <TimeSpan> valueFactory = null) { return(reader.AsValue <TimeSpan>(reader.GetOrdinal(columnName), valueFactory ?? (() => TimeSpan.Zero))); }
/// <summary> /// Get TimeSpan Value /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>if value is DBNull, return TimeSpan.Zero</returns> public static TimeSpan AsTimeSpan(this IDataReader reader, int index, Func <TimeSpan> valueFactory = null) { return(reader.AsValue <TimeSpan>(index, valueFactory ?? (() => TimeSpan.Zero))); }
/// <summary> /// Get Int64 Value /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="columnName">column name</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>if value is DBNull, return Guid.Empty</returns> public static Int64 AsInt64(this IDataReader reader, string columnName, Func <Int64> valueFactory = null) { return(reader.AsValue <Int64>(reader.GetOrdinal(columnName), valueFactory)); }
/// <summary> /// Get Int64 Value /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>if value is DBNull, return Guid.Empty</returns> public static Int64 AsInt64(this IDataReader reader, int index, Func <Int64> valueFactory = null) { return(reader.AsValue <Int64>(index, valueFactory)); }
/// <summary> /// Get Guid Value /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="columnName">column name</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>if value is DBNull, return Guid.Empty</returns> public static Guid AsGuid(this IDataReader reader, string columnName, Func <Guid> valueFactory = null) { return(reader.AsValue <Guid>(reader.GetOrdinal(columnName), valueFactory ?? (() => Guid.Empty))); }
/// <summary> /// System.Char 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="columnName">Column name</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static char AsChar(this IDataReader reader, string columnName, Func <char> valueFactory = null) { return(reader.AsValue <char>(reader.GetOrdinal(columnName), valueFactory)); }
/// <summary> /// Boolean 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">Column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(bool) 값을 반환한다.</returns> public static bool AsBool(this IDataReader reader, int index, Func <bool> valueFactory = null) { return(reader.AsValue <bool>(index, valueFactory)); }
/// <summary> /// Double 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">Column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static double AsDouble(this IDataReader reader, int index, Func <double> valueFactory = null) { return(reader.AsValue <double>(index, valueFactory)); }
/// <summary> /// Double 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="columnName">Column name</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static double AsDouble(this IDataReader reader, string columnName, Func <double> valueFactory = null) { return(reader.AsValue <double>(reader.GetOrdinal(columnName), valueFactory)); }
/// <summary> /// Decimal 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="columnName">Column name</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static Decimal AsDecimal(this IDataReader reader, string columnName, Func <Decimal> valueFactory = null) { return(reader.AsValue <Decimal>(reader.GetOrdinal(columnName), valueFactory)); }
/// <summary> /// Decimal 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">Column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static Decimal AsDecimal(this IDataReader reader, int index, Func <Decimal> valueFactory = null) { return(reader.AsValue <Decimal>(index, valueFactory)); }
/// <summary> /// DateTime 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">Column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static DateTime AsDateTime(this IDataReader reader, int index, Func <DateTime> valueFactory = null) { return(reader.AsValue <DateTime>(index, valueFactory)); }
/// <summary> /// 지정된 IDataReader로부터 (컬럼명-속성명) 매핑 정보(<paramref name="nameMap"/>) 에 따라, 대상 객체를 인스턴싱하고, 속성에 값을 설정하여 반환합니다. /// </summary> /// <typeparam name="T">대상 객체의 수형</typeparam> /// <param name="reader">DataReader 객체</param> /// <param name="targetFactory">대상 객체 생성용 Factory</param> /// <param name="nameMap">DB 컬럼명- 클래스 속성명 매핑 정보</param> /// <param name="firstResult">첫번째 레코드 인덱스 (0부터 시작합니다. null이면 0으로 간주)</param> /// <param name="maxResults">매핑할 최대 레코드 수 (0이면, IDataReader의 끝까지 매핑합니다)</param> /// <param name="additionalMapping">컬럼-속성 단순 값 매핑 이외에 부가적인 매핑을 수행하기 위해 제공되는 델리게이트</param> /// <returns>매핑된 대상 객체의 컬렉션</returns> public static IList <T> Map <T>(this IDataReader reader, Func <T> targetFactory, INameMap nameMap, int firstResult, int maxResults, Action <IDataReader, T> additionalMapping) { reader.ShouldNotBeNull("reader"); nameMap.ShouldNotBeNull("nameMap"); targetFactory.ShouldNotBeNull("targetFactory"); Guard.Assert(reader.IsClosed == false, "지정된 IDataReader가 이미 닫혀 있습니다!!!"); if (IsDebugEnabled) { log.Debug("IDataReader를 읽어 INameMap을 이용하여 [{0}] 형식의 인스턴스 컬렉션을 반환합니다. " + "nameMap=[{1}], firstResult=[{2}], maxResults=[{3}]", typeof(T).FullName, nameMap.CollectionToString(), firstResult, maxResults); } var targets = new List <T>(); var firstIndex = firstResult; var maxCount = maxResults; while (firstIndex-- > 0) { if (reader.Read() == false) { return(targets); } } if (maxCount <= 0) { maxCount = Int32.MaxValue; } var targetAccessor = GetDynamicAccessor <T>(); var mappedCount = 0; var columNames = nameMap.Keys.ToArray(); while (reader.Read() && (mappedCount < maxCount)) { var target = targetFactory(); columNames.RunEach(colName => targetAccessor.SetPropertyValue(target, nameMap[colName], reader.AsValue(colName))); if (additionalMapping != null) { additionalMapping(reader, target); } targets.Add(target); mappedCount++; } if (IsDebugEnabled) { log.Debug("IDataReader로부터 [{0}] 수형의 인스턴스 [{1}]개를 생성했습니다.", typeof(T).FullName, targets.Count); } return(targets); }
/// <summary> /// Get Guid Value /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>if value is DBNull, return Guid.Empty</returns> public static Guid AsGuid(this IDataReader reader, int index, Func <Guid> valueFactory = null) { return(reader.AsValue <Guid>(index, valueFactory ?? (() => Guid.Empty))); }
/// <summary> /// Double 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">Column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static float AsFloat(this IDataReader reader, int index, Func <float> valueFactory = null) { return(reader.AsValue <float>(index, valueFactory)); }
/// <summary> /// System.Char 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="index">Column index</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static char AsChar(this IDataReader reader, int index, Func <char> valueFactory = null) { return(reader.AsValue <char>(index, valueFactory)); }
/// <summary> /// System.Char 형식으로 값을 읽는다. /// </summary> /// <param name="reader">IDataReader 인스턴스</param> /// <param name="columnName">Column name</param> /// <param name="valueFactory">기본값 설정 함수</param> /// <returns>Column value, 값이 DbNull이면, default(char) 값을 반환한다.</returns> public static float AsFloat(this IDataReader reader, string columnName, Func <float> valueFactory = null) { return(reader.AsValue <float>(reader.GetOrdinal(columnName), valueFactory)); }
/// <summary> /// IDataReader의 컬럼명의 값을 문자열로 반환합니다.없으면 <paramref name="valueFactory"/>의 반환값을 반환합니다. /// </summary> /// <param name="reader"></param> /// <param name="index"></param> /// <param name="valueFactory"></param> /// <returns></returns> public static string AsString(this IDataReader reader, int index, Func <string> valueFactory = null) { valueFactory = valueFactory ?? (() => string.Empty); return(reader.AsValue <string>(index, valueFactory)); }