2011. 7. 24. 15:06

닷넷에서는 DB를 어떤 것으로 불러오든 기본적으로 'SqlDataReader'라고 보시는 것이 맞습니다.
리턴값은 다르지만 데이터리더(DataReader)로 읽어 들인 후 나머지 작업(한 줄만 뽑아 문자열로 리턴한다던가 하는 작업)이 가능하니까요.

문제는 'SqlDataReader'라는 녀석은 테이블의 스키마 정보나 데이터를 다 가지고 있지만 가공 안 한체로 들어있어서 그냥 사용하기에는 여러 가지로 번거롭습니다.
그래서 보통은 'List<T>'나 'DataSet'으로 변환하여 사용하죠.



'List<T>'로 변환하는 방법은 한가지뿐이 없습니다.
직접 반복문을 이용하여 바인딩하는 것입니다.

'DataSet'이나 'DataTable'의 경우 두 가지 방법이 있습니다.
'List<T>'와 같이 직접 바인딩하거나 'SqlDataAdapter'를 이용하는 방법입니다.

 

1. 직접 바인딩

'List<T>', 'DataSet', 'DataTable'등 어떤 것이든 가능합니다.
원한다면 2중 배열에도 바인딩이 가능 합니다.
직접 바인딩의 장점은 자신이 원하는 데로 바인딩할 수 있고 데이터를 넣는 과정에서 다른 문자열로 교체(컨버팅)이 가능합니다.

/// <summary>
/// sql처리를 위해 뒷부분에 해당하는 동작을 하는 메소드입니다.
/// sql처리 결과를 통체로 넘겨줍니다. 테이블 형태로 받을때 사용합니다.
/// SqlDataReader를 직접받아 처리 하도록 합니다.
/// </summary>
/// <param name="dtData">리턴할 데이터</param>
/// <returns>성공여부</returns>
private bool SQL_Execute_Body(ref DataTable dtData)
{
    bool bReturn = true;
    SqlDataReader sqlData;

    try
    {
        this.commSql.Connection.Open();					//커낵션을 연다.
        sqlData = commSql.ExecuteReader();				//쿼리를 실행한다.

        //컬럼을 만들기 위해 스키마 테이블을 생성합니다
        DataTable dtSchemaTable = sqlData.GetSchemaTable();
        //추가용 컬럼
        DataColumn dcData = null;
        //추가용 로우
        DataRow drData = null;

        //리턴할 데이터를 초기화 해준다.
        dtData = new DataTable();

        //스키마를 가지고 테이블을 만들어 줍니다.
        foreach (DataRow drColumn in dtSchemaTable.Rows)
        {
            //스키마로 받아온 데이터로 컬럼 데이터를 생성합니다.
            dcData = new DataColumn(drColumn["ColumnName"].ToString(), (Type)drColumn["DataType"]);

            //리턴할 데이터에 컬럼을 생성해 줍니다.
            dtData.Columns.Add(dcData);
        }



        //생성한 테이블에 데이터를 넣습니다.
        while (sqlData.Read())
        {
            //테이블에 맞게 로우를 생성해주고
            drData = dtData.NewRow();

            //생성한 로우에 데이터를 채우고
            for (int i = 0; i < sqlData.FieldCount; i++)
            {
                drData[i] = sqlData.GetValue(i);
            }

            //생성한 로우를 추가 해줍니다.
            dtData.Rows.Add(drData);

        }

        this.commSql.Connection.Close();	//커낵션 닫는다.

    }
    catch
    {
        //에러가 나면 실패다.
        bReturn = false;
        this.commSql.Connection.Close();	//커낵션 닫는다.
    }

    return bReturn;
}

 

참~ 복잡하죠? ㅎㅎㅎ

 

 

2. Sql데이터아답터(SqlDataAdapter)를 이용한 방법

이 방법은 'DataSet', 'DataTable'을 바인딩 할 수 있습니다.

/// <summary>
/// sql처리를 위해 뒷부분에 해당하는 동작을 하는 메소드입니다.
/// sql처리 결과를 통체로 넘겨줍니다. 테이블 형태로 받을때 사용합니다.
/// SqlDataReader를 직접받아 처리 하도록 합니다.
/// </summary>
/// <param name="dtData">리턴할 데이터</param>
/// <returns>성공여부</returns>
private bool SQL_Execute_Body2(ref DataTable dtData)
{
    SqlDataAdapter Adapter = new SqlDataAdapter(this.commSql);

    Adapter.Fill(dtData);

    return true;
}

 

참 쉽죠?


이 방법은 리턴온 데이터 테이블을 그대로 출력해준다는 장점이자 단점이 있습니다.

만약 원하는 형태가 있다면 한 번 더 변환을 해야하기 때문입니다.

 

하지만 간단한 방법이므로 쉽게 사용할 수 있습니다.

 

 

마무리

리스트야 그렇다 치지만 데이터셋은 왜 아답터 없이 바인딩이 안되는지 잘 모르겠습니다.

내부적으로는 어차피 반복문 돌려서 작업할 텐데 말이죠..