Example #1
0
        /// <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);
        }
Example #2
0
        /// <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));
            }
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
 /// <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));
 }
Example #6
0
 /// <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)));
 }
Example #7
0
 /// <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)));
 }
Example #8
0
 /// <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));
 }
Example #9
0
 /// <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));
 }
Example #10
0
 /// <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)));
 }
Example #11
0
 /// <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));
 }
Example #12
0
 /// <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));
 }
Example #13
0
 /// <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));
 }
Example #14
0
 /// <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));
 }
Example #15
0
 /// <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));
 }
Example #16
0
 /// <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));
 }
Example #17
0
 /// <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));
 }
Example #18
0
        /// <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);
        }
Example #19
0
 /// <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)));
 }
Example #20
0
 /// <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));
 }
Example #21
0
 /// <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));
 }
Example #22
0
 /// <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));
 }
Example #23
0
 /// <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));
 }