첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170
using System;
using System.Data;

/// <summary>
/// 객체 데이터 리더
/// </summary>
public class ObjectDataReader : IDataReader
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Field
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region Field

    /// <summary>
    /// 현재 행
    /// </summary>
    private int currentRow = -1;

    /// <summary>
    /// 컬럼명 배열
    /// </summary>
    private string[] columnNameArray;

    /// <summary>
    /// 데이터 배열
    /// </summary>
    private object[][] dataArray;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 깊이 - Depth

    /// <summary>
    /// 깊이
    /// </summary>
    public int Depth
    {
        get
        {
            return 0;
        }
    }

    #endregion
    #region 닫기 여부 - IsClosed

    /// <summary>
    /// 닫기 여부
    /// </summary>
    public bool IsClosed
    {
        get
        {
            return this.currentRow < this.dataArray.Length;
        }
    }

    #endregion
    #region 영향 받은 레코드 수 - RecordsAffected

    /// <summary>
    /// 영향 받은 레코드 수
    /// </summary>
    public int RecordsAffected
    {
        get
        {
            return this.dataArray.Length;
        }
    }

    #endregion
    #region 필드 수 - FieldCount

    /// <summary>
    /// 필드 수
    /// </summary>
    public int FieldCount
    {
        get
        {
            return this.dataArray[0].Length;
        }
    }

    #endregion
    #region 인덱서 - this[name]

    /// <summary>
    /// 인덱서
    /// </summary>
    /// <param name="name">명칭</param>
    /// <returns>인덱서 값</returns>
    public object this[string name]
    {
        get
        {
            int index = this.GetOrdinal(name);

            return this.dataArray[this.currentRow][index];
        }
    }

    #endregion
    #region 인덱서 - this[index]

    /// <summary>
    /// 인덱서
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>인덱서 값</returns>
    public object this[int index]
    {
        get
        {
            return this.dataArray[this.currentRow][index];
        }
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - ObjectDataReader(columnNameArray, dataArray)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="columnNameArray">컬럼명 배열</param>
    /// <param name="dataArray">데이터 배열</param>
    public ObjectDataReader(string[] columnNameArray, object[][] dataArray)
    {
        this.columnNameArray = columnNameArray;
        this.dataArray       = dataArray;
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 스키마 테이블 구하기 - GetSchemaTable()

    /// <summary>
    /// 스키마 테이블 구하기
    /// </summary>
    /// <returns>데이터 테이블</returns>
    public DataTable GetSchemaTable()
    {
        return null;
    }

    #endregion
    #region 다음 결과 여부 구하기 - NextResult()

    /// <summary>
    /// 다음 결과 여부 구하기
    /// </summary>
    /// <returns>다음 결과 여부</returns>
    public bool NextResult()
    {
        return false;
    }

    #endregion
    #region 데이터 읽기 - Read()

    /// <summary>
    /// 데이터 읽기
    /// </summary>
    /// <returns>처리 결과</returns>
    public bool Read()
    {
        this.currentRow++;

        return this.IsClosed;
    }

    #endregion

    #region 불린형 값 구하기 - GetBoolean(index)

    /// <summary>
    /// 불린형 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>불린형 값</returns>
    public bool GetBoolean(int index)
    {
        return Convert.ToBoolean(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 바이트 값 구하기 - GetByte(index)

    /// <summary>
    /// 바이트 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>바이트 값</returns>
    public byte GetByte(int index)
    {
        return Convert.ToByte(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 바이트 수 구하기 - GetBytes(index, fieldOffset, bufferArray, bufferOffset, length) (Not Implemented)

    /// <summary>
    /// 바이트 수 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <param name="fieldOffset">필드 오프셋</param>
    /// <param name="bufferArray">버퍼 배열</param>
    /// <param name="bufferOffset">버퍼 오프셋</param>
    /// <param name="length">길이</param>
    /// <returns>바이트 수</returns>
    public long GetBytes(int index, long fieldOffset, byte[] bufferArray, int bufferOffset, int length)
    {
        throw new Exception("The method or operation is not implemented.");
    }

    #endregion
    #region 문자 값 구하기 - GetChar(index)

    /// <summary>
    /// 문자 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>문자 값</returns>
    public char GetChar(int index)
    {
        return Convert.ToChar(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 문자 수 구하기 - GetChars(index, fieldOffset, bufferArray, bufferOffset, length)

    /// <summary>
    /// 문자 수 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <param name="fieldOffset">필드 오프셋</param>
    /// <param name="bufferArray">버퍼 배열</param>
    /// <param name="bufferOffset">버퍼 오프셋</param>
    /// <param name="length">길이</param>
    /// <returns>문자 수</returns>
    public long GetChars(int index, long fieldOffset, char[] bufferArray, int bufferOffset, int length)
    {
        Convert.ToString(this.dataArray[this.currentRow][index]).CopyTo((int)fieldOffset, bufferArray, bufferOffset, length);

        return length;
    }

    #endregion
    #region 일시 값 구하기 - GetDateTime(index)

    /// <summary>
    /// 일시 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>일시 값</returns>
    public DateTime GetDateTime(int index)
    {
        return Convert.ToDateTime(this.dataArray[this.currentRow][index]);
    }

    #endregion 
    #region 십진수 값 구하기 - GetDecimal(index)

    /// <summary>
    /// 십진수 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>십진수 값</returns>
    public decimal GetDecimal(int index)
    {
        return Convert.ToDecimal(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 배정도 실수 값 구하기 - GetDouble(index)

    /// <summary>
    /// 배정도 실수 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>배정도 실수 값</returns>
    public double GetDouble(int index)
    {
        return Convert.ToDouble(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 단정도 실수 값 구하기 - GetFloat(index)

    /// <summary>
    /// 단정도 실수 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>단정도 실수 값</returns>
    public float GetFloat(int index)
    {
        return Convert.ToSingle(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region GUID 값 구하기 - GetGuid(index)

    /// <summary>
    /// GUID 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>GUID 값</returns>
    public Guid GetGuid(int index)
    {
        return new Guid(this.GetString(index));
    }

    #endregion
    #region 16비트 정수 값 구하기 - GetInt16(index)

    /// <summary>
    /// 16비트 정수 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>16비트 정수 값</returns>
    public short GetInt16(int index)
    {
        return Convert.ToInt16(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 32비트 정수 값 구하기 - GetInt32(index)

    /// <summary>
    /// 32비트 정수 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>32비트 정수 값</returns>
    public int GetInt32(int index)
    {
        return Convert.ToInt32(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 64비트 정수 값 구하기 - GetInt64(index)

    /// <summary>
    /// 64비트 정수 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>64비트 정수 값</returns>
    public long GetInt64(int index)
    {
        return Convert.ToInt64(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 문자열 구하기 - GetString(index)

    /// <summary>
    /// 문자열 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>문자열</returns>
    public string GetString(int index)
    {
        return Convert.ToString(this.dataArray[this.currentRow][index]);
    }

    #endregion
    #region 값 구하기 - GetValue(index)

    /// <summary>
    /// 값 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>값</returns>
    public object GetValue(int index)
    {
        return this.dataArray[this.currentRow][index];
    }

    #endregion
    #region 값 배열 길이 구하기 - GetValues(valueArray)

    /// <summary>
    /// 값 배열 길이 구하기
    /// </summary>
    /// <param name="valueArray">값 배열</param>
    /// <returns>값 배열 길이</returns>
    public int GetValues(object[] valueArray)
    {
        this.dataArray[this.currentRow].CopyTo(valueArray, 0);

        return this.dataArray[this.currentRow].Length;
    }

    #endregion
    #region DB 널 여부 구하기 - IsDBNull(index)

    /// <summary>
    /// DB 널 여부 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>DB 널 여부</returns>
    public bool IsDBNull(int index)
    {
        return Convert.IsDBNull(this.dataArray[this.currentRow][index]);
    }

    #endregion

    #region 데이터 구하기 - GetData(index) (Not Implemented)

    /// <summary>
    /// 데이터 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>IDataReader</returns>
    public IDataReader GetData(int index)
    {
        throw new Exception("The method or operation is not implemented.");
    }

    #endregion
    #region 필드 타입 구하기 - GetFieldType(index)

    /// <summary>
    /// 필드 타입 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>필드 타입</returns>
    public Type GetFieldType(int index)
    {
        return this.dataArray[this.currentRow][index].GetType();
    }

    #endregion
    #region 데이터 타입명 구하기 - GetDataTypeName(index)

    /// <summary>
    /// 데이터 타입명 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>데이터 타입명</returns>
    public string GetDataTypeName(int index)
    {
        return GetFieldType(index).Name;
    }

    #endregion
    #region 명칭 구하기 - GetName(index)

    /// <summary>
    /// 명칭 구하기
    /// </summary>
    /// <param name="index">인덱스</param>
    /// <returns>명칭</returns>
    public string GetName(int index)
    {
        return this.columnNameArray[index];
    }

    #endregion
    #region 순서 구하기 - GetOrdinal(name)

    /// <summary>
    /// 순서 구하기
    /// </summary>
    /// <param name="name">명칭</param>
    /// <returns>순서</returns>
    public int GetOrdinal(string name)
    {
        for(int i = 0; i < this.columnNameArray.Length; i++)
        {
            if(name.Equals(this.columnNameArray[i]))
            {
                return i;
            }
        }

        return -1;
    }

    #endregion

    #region 닫기 - Close()

    /// <summary>
    /// 닫기
    /// </summary>
    public void Close()
    {
    }

    #endregion
    #region 리소스 해제하기 - Dispose()

    /// <summary>
    /// 리소스 해제하기
    /// </summary>
    public void Dispose()
    {
    }

    #endregion
}
728x90
반응형
그리드형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요