2011. 11. 8. 13:27ㆍDatabase/LINQ to SQL
개발생산성 향상도구를 구축하는데 있어서 DB의 Table Name 또는 Column Name 등의 Meta Data을 얻는 기능은 매우 유용합니다. 각 Table Name과 Column Name을 바탕으로 Application의 List/Detail Code를 회사의 개발정책에 맞추어 자동 생성하거나, 보고서의 기본양식도 자동으로 생성할 수 있기 때문입니다. 여기에서는 C#에서 MetaModel 개체를 이용하여 이러한 정보를 얻는 방법에 대해서 안내해드리고자 합니다.
LinqToSQL이 아닌 MS SQL의 Meta Table을 통해서도 똑같은 정보를 얻을 수 있는데 자세한 내용은 http://nsinc.tistory.com/21를 참고하시기 바랍니다.
구현
MetaModel은 LinqToSQL이 DB에 대해서 Mapping한 거의 모든 정보를 조회할 수 있는 개체입니다. 여기에서는 Table명, Column명, 각 Type까지 얻는 방법에 대해 예제코드와 함께 설명 드리고자 합니다.
먼저 MetaModel을 얻을 수 있는 간단한 방법인 AttributeMappingSource를 이용한 방법입니다. 이는 DataContext를 실제 생성하지 않고도 바로 정보를 조회할 수 있는 방법이기도 합니다.
//1. MetaModel 생성 MetaModel model = new AttributeMappingSource().GetModel(typeof(TestDBDataContext)); IEnumerable<MetaTable> lstTables = model.GetTables(); //2. MetaModel에서 데이터 조회 List<string> lstResult = new List<string>(); foreach (MetaTable table in lstTables) lstResult.Add(table.TableName); //3. 출력 grdResult.DataSource = lstResult; grdResult.DataBind();
위와 다르게 DataContext를 이미 생성하였다면 아래와 같이 Mapping Property를 통해 바로 MetaModel을 얻을 수도 있는데 아래와 같습니다.
using (TestDBDataContext db = new TestDBDataContext() { ObjectTrackingEnabled = false }) { //1. MetaModel 생성 MetaModel model = db.Mapping; IEnumerable<MetaTable> lstTables = model.GetTables(); //2. MetaModel에서 데이터 조회 List<string> lstResult = new List<string>(); foreach (MetaTable table in lstTables) lstResult.Add(table.TableName); //3. 출력 grdResult.DataSource = lstResult; grdResult.DataBind(); }
Table명 뿐만 아니라 Column의 이름과 Type를 얻는 방법은 아래와 같습니다.
MetaModel model = new AttributeMappingSource().GetModel(typeof(TestDBDataContext)); MetaTable table = model.GetTables().Single(t => t.TableName == "dbo.TestTable"); ReadOnlyCollection<MetaDataMember> lstColumns = table.RowType.DataMembers; List<string> lstResult = new List<string>(); foreach (MetaDataMember column in lstColumns) lstResult.Add(column.MappedName + " (" + column.Type + ")"); grdResult.DataSource = lstResult; grdResult.DataBind();
참고 Site: http://blogs.msdn.com/b/jomo_fisher/archive/2007/07/30/linq-to-sql-trick-get-all-table-names.aspx