방법: Visual C# .NET에서 DataSet JOIN 도우미 클래스 구현

기술 자료 번역 기술 자료 번역
기술 자료: 326080 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 구현하고 두 개 이상의 관련된 DataTable 정의에서 DataTable 개체를 만들려면 및 DataTable 대상 원본 DataTable 개체에서 정렬되고 필터링된 있는 레코드를 복사하려면 샘플 코드가 포함되어 있는 DataSetHelper 클래스를 사용하는 방법을 단계별로 설명합니다.

이렇게 하려면 다음 공용 메서드를 사용하십시오.
  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
SelectJoinInto 메서드를 CreateJoinTableInsertJoinInto 메서드를 호출합니다. 개인 도우미 메서드 및 데이터 멤버를 구문 분석된 필드 목록을 저장할 수 있습니다.

DataSetHelper 클래스 DataSet 멤버 변수가 포함됩니다. 필요에 따라 기존 DataSetDataSet 멤버 변수에 할당할 수 있습니다. 멤버 변수에 올바른 DataSet 에 가리키는 경우 CreateJoinTable 또는 SelectJoinInto 메서드를 만드는 DataTable 개체는 DataSet 에 추가됩니다. 두 경우 메서드 호출이 DataTable 개체에 대한 참조를 반환합니다. InsertJoinInto 메서드는 기존 대상 DataTable 필요하며 아무 것도 반환하지 않습니다.

DataSet 개체에 대한 자세한 내용은 아래 문서 번호를 눌러 Microsoft 기술 자료에 있는 문서를 클릭하십시오.
313485ADO.NET DataSet, DataView를 DataViewManager에 대한 정보: 로드맵

요구 사항

다음은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩의 목록입니다.
  • Microsoft Windows XP나 Windows 2000, Windows NT 4.0 서비스 팩 6a
  • Microsoft Visual Studio .NET
이 문서에서는 사용자가 다음 항목을 잘 알고 있다고 가정합니다.
  • Visual C# .NET 구문
  • ADO.NET 기본 사항 및 구문

DataSetHelper 셸 클래스

이 섹션에 있는 코드를 DataSetHelper 아티클을 모두 메서드 및 멤버 변수 추가 셸 클래스를 선언합니다.
  1. Visual Studio .NET 시작하십시오.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
  3. 새 프로젝트 대화 상자의 프로젝트 형식Visual C# 프로젝트 클릭한 다음 템플릿 에서 클래스 라이브러리 를 누릅니다.
  4. 이름 상자에 DataSetHelper를 입력하십시오.
  5. 클래스의 코드를 다음 코드로 바꿉니다:
    public class DataSetHelper
    {
        public DataSet ds;
    
        public DataSetHelper(ref DataSet DataSet)
        {
    	ds = DataSet;
        }
        public DataSetHelper()
        {
    	ds = null;
        }
    }
    					
    생성자에 대한 두 개의 오버로드를 사용하거나 사용하지 않고 참조 올바른 DataSet 클래스의 인스턴스를 만들 수 있습니다. 올바른 DataSet 참조가 클래스 메서드를 반환할 DataTable 개체는 자동으로 DataSet 에 추가됩니다.

필드 목록 파서

이 섹션에서는 필드 목록 파서에 대한 코드가 포함되어 있습니다. 구문 분석된 구조는 CreateJoinTableInsertJoinInto 메서드에 필드 목록을 재분석 않아도 사용됩니다. 이러한 메서드를 SelectJoinInto 메서드 또는 코드를 호출할 경우 필드 목록의 재분석 합니다. 구문 분석된 필드 목록과 구문 분석되지 않은 필드 목록을 DataSetHelper 클래스의 개인 멤버 변수에 저장됩니다.
  1. "" 절에서 만든 DataSetHelper 클래스에 다음 개인 클래스 정의에 추가합니다:
    private class FieldInfo
    {
        public string RelationName;
        public string FieldName;	//source table field name
        public string FieldAlias;	//destination table field name
        public string Aggregate;
    }
    					
    참고: 이 클래스의 다른 DataSetHelper 기사를 일반적입니다 및 이 문서에서는 사용하지 않는 일부 필드가 있습니다.

  2. DataSet 선언 바로 뒤에 클래스 정의에 다음 개인 멤버 변수를 추가하여:
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
    					
  3. 다음 개인 메서드를 클래스 정의에 추가하십시오. 이 메서드는 다른 DataSetHelper 기사가 사용되는 방법을 동일합니다.
    private void ParseFieldList(string FieldList, bool AllowRelation)
    {
        /*
         * This code parses FieldList into FieldInfo objects  and then 
         * adds them to the m_FieldInfo private member
         * 
         * FieldList systax:  [relationname.]fieldname[ alias], ...
        */ 
        if (m_FieldList == FieldList) return;
        m_FieldInfo = new System.Collections.ArrayList();
        m_FieldList = FieldList;
        FieldInfo Field; string[] FieldParts;
        string[] Fields=FieldList.Split(',');
        int i;
        for (i=0; i<=Fields.Length-1; i++)
        {
            Field=new FieldInfo();
            //parse FieldAlias
            FieldParts = Fields[i].Trim().Split(' ');
            switch (FieldParts.Length)
            {
                case 1:
                    //to be set at the end of the loop
                    break;
                case 2:
                    Field.FieldAlias=FieldParts[1];
                    break;
                default:
                    throw new Exception("Too many spaces in field definition: '" + Fields[i] + "'.");	                        
            }
            //parse FieldName and RelationName
            FieldParts = FieldParts[0].Split('.');
            switch (FieldParts.Length)
            {
                case 1: 
                    Field.FieldName=FieldParts[0];
                    break;
                case 2:
                    if (AllowRelation==false)
                        throw new Exception("Relation specifiers not permitted in field list: '" + Fields[i] + "'.");
                    Field.RelationName = FieldParts[0].Trim();
                    Field.FieldName=FieldParts[1].Trim();
                    break;
                default:
                    throw new Exception("Invalid field definition: " + Fields[i] + "'.");
            }
            if (Field.FieldAlias==null) 
                Field.FieldAlias = Field.FieldName;
            m_FieldInfo.Add (Field);
        }
    }
    					

CreateJoinTable 메서드

이 섹션에서는 CreateJoinTable 메서드에 대한 코드가 들어 있습니다.

CreateJoinTable 메서드에 대한 호출 규칙이 다음 입니다:
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");
				
있는 TableName TestTable 및 FName LName, 및 부서 세 개의 필드를 가진 새 DataTable 이 호출 샘플에서는 만듭니다. 이러한 세 가지 필드가 같은 데이터 이름 및 Employees 테이블의 성 필드 및 DepartmentEmployee DataRelation 개체를 통해 액세스되는 부모 테이블의 DepartmentName 필드 형식이 있습니다.

필드 목록에서 필드를 지정하려면 다음 구문을 사용하십시오:
[relationname.]fieldname[ alias], ...
				
이 구문 보려면 다음 참고:
  • ColumnName데이터 형식 속성을 대상 DataTable 복사되는 있는 유일한 속성입니다.
  • 확인된 결과 식이 들어 있는 필드에 복사됩니다.
  • 별칭 이름을 지정하여 DataTable 대상 필드 이름을 바꿀 수 있습니다.
  • 필드 목록에는 원본 DataTable 순서와 다른 순서로 나열된 필드 이름의 하위가 포함될 수 있습니다. 필드 목록이 비어 있으면 예외가 throw됩니다.
  • DataRelation 부모 테이블에 연결해야 합니다. 예를 들어, 필드를 직원, Customers 및 Orders 테이블을 결합하는 테이블을 만들려는 경우 원본 테이블과 Orders 테이블을 사용할 및 다음 관계를 통해 Customers 및 Employees 테이블에 있는 필드를 참조해야 합니다.
CreateJoinTable 메서드를 호출하려면 "" 절에서 만든 DataSetHelper 클래스에 다음 메서드를 추가합니다:
public DataTable CreateJoinTable(string TableName, DataTable SourceTable, string FieldList)
{
    /*
     * Creates a table based on fields of another table and related parent tables
     * 
     * FieldList syntax: [relationname.]fieldname[ alias][,[relationname.]fieldname[ alias]]...
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //return CreateTable(TableName, SourceTable);
    }
    else
    {
        DataTable dt = new DataTable(TableName);
        ParseFieldList(FieldList, true);
        foreach(FieldInfo Field in m_FieldInfo)
        {
            if(Field.RelationName==null)
            {
                DataColumn dc = SourceTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
            else
            {
                DataColumn dc = SourceTable.ParentRelations[Field.RelationName].ParentTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
        }
        if (ds!=null)
            ds.Tables.Add(dt);
        return dt;
    }
}
				

InsertJoinInto 메서드

이 섹션에서는 InsertJoinInto 메서드에 대한 코드가 들어 있습니다. InsertJoinInto 메서드 및 원본 테이블에서 필터링된 정렬되며 대상 테이블에 관련 테이블에 레코드를 복사합니다. ParseFieldList 속성을 호출할 때 이 목록을 사용할 수 있는 경우 이전에 있던 구문 목록을 구문 분석할 수 있습니다. 필드 목록이 비어 있으면 예외가 throw됩니다.

다음 InsertJoinInto 메서드에 대한 호출 규칙이 있습니다:
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
    "EmployeeID<5", "BirthDate");
				
따라 필터링된 레코드 DataTable 직원 및 관련된 DataTable DepartmentName 필드 DataTable TestTable 위해 호출 샘플 복사합니다 "EmployeeID < 5" 및 생년월일에 의해 정렬됩니다.

참고: 필터와 정렬 식을 원본 테이블 및 모든 관련된 테이블을 적용합니다.

InsertJoinInto 메서드를 호출하려면 "" 절에서 만든 DataSetHelper 클래스에 다음 메서드를 추가합니다:
public void InsertJoinInto(DataTable DestTable, DataTable SourceTable, 
    string FieldList, string RowFilter, string Sort)
{
    /*
    * Copies the selected rows and columns from SourceTable and inserts them into DestTable
    * FieldList has same format as CreatejoinTable
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //InsertInto(DestTable, SourceTable, RowFilter, Sort);
    }
    else
    {
    ParseFieldList(FieldList, true);
    DataRow[] Rows = SourceTable.Select(RowFilter, Sort);
    foreach(DataRow SourceRow in Rows)
    {
            DataRow DestRow = DestTable.NewRow();
            foreach(FieldInfo Field in m_FieldInfo)
            {
                if(Field.RelationName==null)
                {
                    DestRow[Field.FieldName] = SourceRow[Field.FieldName];
                }
                else
                {
                    DataRow ParentRow = SourceRow.GetParentRow(Field.RelationName);
                    DestRow[Field.FieldName] = ParentRow[Field.FieldName];
                }
            }
            DestTable.Rows.Add(DestRow);
        }
    }
}
				

SelectJoinInto 메서드

이 섹션에서는 SelectJoinInto 메서드에 대한 코드가 들어 있습니다. 이 메서드는 CreateJoinTableInsertJoinInto 메서드에 조합입니다. 정렬 및 필터링된 새 DataTable 에 기존 DataTable 개체를 복사본과 레코드를 기반으로 새 DataTableSelectJoinInto 메서드를 만듭니다.

SelectJoinInto 메서드에 대한 호출 규칙이 다음 입니다:
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");
				
TestTable 라는 세 개의 필드를 DataTable 이 샘플에서는 호출 만듭니다. 이러한 세 가지 필드 이름 및 직원 DataTable LastName 필드와 통해 DepartmentEmployee DataRelation 참조되는 DataTable DepartmentName 필드를 기반으로 합니다. 이 샘플에서는 레코드를 에서 Employees DataTable 따라 필터링된 어떤 TestTable DataTable 을 복사합니다 다음 "EmployeeID < 5" 및 생년월일에 의해 정렬됩니다.

참고: 필터와 정렬 식을 원본 테이블 및 관련된 테이블을 적용합니다.

SelectJoinInto 메서드를 호출하려면 "" 절에서 만든 DataSetHelper 클래스에 다음 메서드를 추가합니다:
public DataTable SelectJoinInto(string TableName, DataTable SourceTable, string FieldList, string RowFilter, string Sort)
{
    /*
     * Selects sorted, filtered values from one DataTable to another.
     * Allows you to specify relationname.fieldname in the FieldList to include fields from
     *  a parent table. The Sort and Filter only apply to the base table and not to related tables.
    */ 
    DataTable dt = CreateJoinTable(TableName, SourceTable, FieldList);
    InsertJoinInto(dt, SourceTable, FieldList, RowFilter, Sort);
    return dt;
}
				

응용 프로그램 테스트

  1. 저장하고 이전 섹션에서 만든 DataSetHelper 클래스를 컴파일하십시오.
  2. 새 Visual C# Windows 응용 프로그램 만들려면 다음과 같이 하십시오.
    1. Visual Studio .NET 시작하십시오.
    2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
    3. 새 프로젝트 대화 상자의 프로젝트 형식Visual C# 프로젝트 클릭한 다음 템플릿 에서 Windows 응용 프로그램 을 누릅니다.
  3. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭한 다음 기존 프로젝트 추가 클릭하십시오. DataSetHelper 프로젝트에 추가하십시오.
  4. 프로젝트 메뉴에서 참조 추가 클릭하십시오.
  5. 참조 추가 대화 상자에서 프로젝트 탭을 클릭한 다음 Windows Form 응용 DataSetHelper 프로젝트에 참조를 추가하십시오.
  6. 폼 디자이너에서 세 단추 컨트롤 및 DataGrid 컨트롤을 도구 상자에서 폼으로 끕니다. 단추 btnCreateJoin, btnInsertJoinIntobtnSelectJoinInto 이름을 지정합니다. DataGrid 컨트롤 (dataGrid1) 의 기본 이름을 유지하십시오.
  7. 양식 코드를 코드 창의 맨 다음 Using 문을 추가할:
    using System.Data;
    					
  8. 양식 정의가 다음 변수 선언을 추가합니다:
    DataSet ds; DataSetHelper.DataSetHelper dsHelper;
    					
  9. Form_Load 이벤트에 다음 코드를 추가합니다:
    ds = new DataSet();
    dsHelper = new DataSetHelper.DataSetHelper(ref ds);
    //Create source tables
    DataTable dt = new DataTable("Employees");
    dt.Columns.Add("EmployeeID",Type.GetType("System.Int32") );
    dt.Columns.Add("FirstName", Type.GetType("System.String"));
    dt.Columns.Add("LastName", Type.GetType("System.String"));
    dt.Columns.Add("BirthDate", Type.GetType("System.DateTime"));
    dt.Columns.Add("JobTitle", Type.GetType("System.String"));
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Rows.Add(new object[] {1, "Tommy", "Hill", new DateTime(1970, 12, 31),  "Manager", 42});
    dt.Rows.Add(new object[] {2, "Brooke", "Sheals", new DateTime(1977, 12, 31), "Manager", 23});
    dt.Rows.Add(new object[] {3, "Bill", "Blast", new DateTime(1982, 5, 6), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Kevin", "Kline", new DateTime(1978, 5, 13), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Martha", "Seward", new DateTime(1976, 7, 4), "Sales Clerk", 23});
    dt.Rows.Add(new object[] {1, "Dora", "Smith", new DateTime(1985, 10, 22), "Trainee", 42});
    dt.Rows.Add(new object[] {1, "Elvis", "Pressman", new DateTime(1972, 11, 5), "Manager", 15});
    dt.Rows.Add(new object[] {1, "Johnny", "Cache", new DateTime(1984, 1, 23), "Sales Clerk", 15});
    dt.Rows.Add(new object[] {1, "Jean", "Hill", new DateTime(1979, 4, 14), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Anna", "Smith", new DateTime(1985, 6, 26), "Trainee", 15});
    ds.Tables.Add(dt);
    
    dt = new DataTable("Departments");
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Columns.Add("DepartmentName", Type.GetType("System.String"));
    dt.Rows.Add(new object[] {15, "Men's Clothing"});
    dt.Rows.Add(new object[] {23, "Women's Clothing"});
    dt.Rows.Add(new object[] {42, "Children's Clothing"});
    ds.Tables.Add(dt);
    
    ds.Relations.Add("DepartmentEmployee",     ds.Tables["Departments"].Columns["DepartmentID"], 
        ds.Tables["Employees"].Columns["DepartmentID"]);
    					
  10. btnCreateJoin_Click 이벤트에 다음 코드를 추가합니다:
    dsHelper.CreateJoinTable("EmpDept",ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  11. btnInsertJoinInto_Click 이벤트에 다음 코드를 추가합니다:
    dsHelper.InsertJoinInto(ds.Tables["EmpDept"], ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department",
        "JobTitle='Sales Clerk'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  12. btnSelectJoinInto_Click 이벤트에 다음 코드를 추가합니다:
    dsHelper.SelectJoinInto("EmpDept2", ds.Tables["Employees"],
        "FirstName,LastName,BirthDate BDate,DepartmentEmployee.DepartmentName Department", 
        "JobTitle='Manager'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept2");
    					
  13. 응용 프로그램을 실행하고 각 단추를 클릭하십시오. DataGrid 테이블 및 코드가 데이터로 채워지고.

    참고: 한 번 btnCreateJoinbtnSelectJoinInto 단추 하나만 클릭하여 있습니다. 이 단추 중 하나를 두 번 이상 클릭하면 같은 테이블을 두 번 추가하려고 하는 오류 메시지가 나타납니다. 또한 btnInsertJoinInto 를 클릭하기 전에 btnCreateJoin 을 합니다. 그리고 그렇지 않으면, 대상 DataTable 만들어지지 않습니다. 여러 번 btnInsertJoinInto 단추를 클릭하는 경우 중복 레코드 DataGrid 채웁니다.

향상 아이디어

  • ColumnName데이터 형식 속성을 대상 DataTable 복사되는 있는 유일한 속성입니다. MaxLength 속성 같은 추가 속성을 복사할 CreateTable 메서드는 확장하거나 새 키 열을 만들 수 있습니다.
  • 속성 복사되지 않습니다; 대신, 계산된 결과가 복사됩니다. 따라서 대상 테이블에 식을 참조하는 필드를 추가할 필요가 없습니다. 또한 대상 열에 그렇지 않으면 이 열에 종속된 열이 아닌 결과 목록의 이전 나타날 수 있습니다. CreateTable InsertInto 열 열이 무시되므로 , 이는 이 단락 앞에서 설명한 제한 사항에 있지만 복사 방법을 수정할 수 있습니다.
  • CreateJoinTable, InsertJoinIntoSelectJoinInto 메서드에 대한 기능을 CreateTable, InsertIntoSelectInto 메서드에 문서로 병합할 수 있습니다. CreateTable, InsertIntoSelectInto 메서드에 대한 자세한 내용은 아래 문서 번호를 눌러 Microsoft 기술 자료에 있는 문서를 클릭하십시오.
    326009HOWTO: Visual C# .NET에서 DataSet SELECT INTO 도우미 클래스 구현
    이러한 메서드는 병합 않으려는 경우 단일 클래스에서 두 가지 방법 사용할 경우, CreateJoinTableInsertJoinInto 메서드에 Throw 문을 제거하여 및 CreateTableInsertInto 메서드에 다음 코드 줄에서 호출을 uncommenting 의해 빈 필드 목록을 처리하는 데 사용할 수 있습니다:
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //return CreateTable(TableName, SourceTable);
        }
    					
    - 및 -
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //InsertInto(DestTable, SourceTable, RowFilter, Sort);
        }
    					

문제 해결

  • 필드 목록에서 별칭 부분과 및 해당 fieldname DataColumn 명명 규칙을 준수해야 합니다. 이름을 마침표 (.)를 포함할 것을 파서가 이름, 또한 제한하는 쉼표 (,), 또는 공백 ().
  • 단추를 두 번 이상 클릭하면 같은 테이블은 두 번 예외가 결과 DataSet 추가됩니다. 이 문제를 해결하려면 동일한 이름의 DataTable 이미 있는지 여부를 확인하려면 테스트 응용 프로그램에 코드를 추가할 수 있습니다. 또는 DataSetHelper 클래스 DataSet 참조 없이 만들고 DataGrid.DataSource 속성 대신 dt 변수를 직접 SetDataBinding 메서드 호출을 사용하여 바인딩할 수 있습니다.
  • 사용자 지정 데이터 형식 (클래스) 원본 테이블을 사용하는 경우, 전체 데이터 복사본을 수행하도록 InsertJoinInto 메서드에 코드를 추가해야 합니다. 그렇지 않으면 참조만이 복사됩니다.

속성

기술 자료: 326080 - 마지막 검토: 2003년 9월 3일 수요일 - 수정: 2.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
키워드:?
kbmt kbhowtomaster kbsystemdata KB326080 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com