즐겁게 개발을...

개발보다 게임이 더 많이 올라오는 것 같은...

개발/C#

[2022.08] C# Dapper 불특정 테이블을 조회할 때

다물칸 2022. 8. 12. 15:31
728x90
반응형

안녕하세요. 오랜만에 개발 관련 글을 적어봅니다. 

오늘은 불특정 테이블을 조회할 때 C# 대표 ORM 라이브러리인 Dapper를 이용해 알려드리고자 합니다. 

(더 좋은 방법이 있다면 알려주세요)

 

특정 테이블이라면 Model클래스를 생성해서 타입지정해주면 알아서 IEnumerable<{Model클래스명}>으로 가져올 수 있습니다. 

그런데 불특정 테이블이라면 클래스를 생성할 수 없으니 미리 그리드를 세팅할 수도 없고, 클래스도 생성할 수 없습니다. 

 

코드와 주석을 함께 넣었습니다.

 

Datatable dt = new Datatable();

SqlMapper.GridReader reader = Conn.QueryMultiple("SELECT * from table");

var readDatas = reader.Read(); // Dapper의 Dynamic속성의 JSON형태 데이터로 나옵니다. 객체로 나오지 않아요.

// 컬럼 처리
foreach (IDictionary<string, object> row in readDatas)
{
   var colNames = row.Keys;
   foreach (string col in colNames)
   {
     dt.Columns.Add(new DataColumn(col, typeof(string), col));
   }
   break; // 컬럼은 한번만 생성하면 되니 브레이크 걸어서 for~loop를 빠져나갑니다. 
}

// 데이터(Row) 처리
foreach (IDictionary<string, object> row in readDatas)
{
  var colNames = row.Keys;
  DataRow dr = dt.NewRow(); // 데이터테이블에 Row데이터 넣을 공간 만들기
  
  foreach (string col in colNames) 
  {
    row.TryGetValue(col, out object val); // 키를 통해 값을 가져옵니다. 
    dt[col] = val.ToString(); // object에서 string으로 변환해서 넣어줍니다.
  }
  dt.Rows.Add(dr); // 데이터 Row 추가
}

GridControl.DataSource = dt;  // Devexpress GridControl에 반영합니다.

Dynamic을 직접 지정해서 하는 소스가 있었는데, 위처럼 했습니다. readDatas를 디버깅 상태에서 마우스를 올려보면, 아래처럼 표시됩니다. 

 

{{ DapperRow, { "Colname": Data, ... }}

 

키, 밸류 방식이라 KeyValuePair 객체로 담아보려했으나, 실패. 실패를 거듭하다 위처럼 성공해서 사용 중입니다. 

반응형