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;

		}

 

 

참 쉽죠?


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

만약 원하는 형태가 있다면 한 번 더 변환을 해야 합니다 ㅡ.-;

 

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

 

 

마무리

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

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

  1. 2011.07.24 20:10  Address  Edit/Delete  Reply

    비밀댓글입니다

    • Favicon of https://blog.danggun.net BlogIcon 당근천국 2011.07.25 01:54 신고  Address  Edit/Delete

      제로보드는 소스가 공개된 게시판이라 PHP좀 만질좀 알면 제로보드를 개조하여 앵간한건 다가능하저 ㅎㅎㅎ
      간단한 웹게임이나 쇼핑몰같은건 쉽게 되저 ㅎㅎ

      어찌됬건 그정도 급이되면 PHP도 어느정도 실력이 될테니 의미가 없나 ㅡ.-;;;
      ㅎㅎ

      아무래도 그분 휴가라도 나오면 한번 이야기 해보시는것이 좋을것 같네요.
      시작은 못하더라도 준비는 해두는게 좋을 테니까요.

댓글 작성

이름
패스워드
홈페이지
비밀글