다음을 통해 공유


DataSet에 기존 제약 조건 추가

적용 대상: .NET Framework .NET .NET Standard

ADO.NET 다운로드

SqlDataAdapterFill 메서드는 데이터 원본의 테이블 열과 행으로만 DataSet을 채웁니다. 제약 조건은 일반적으로 데이터 원본에서 설정하지만 Fill 메서드는 기본적으로 이 스키마 정보를 DataSet에 추가하지 않습니다.

데이터 원본의 기존 기본 키 제약 조건 정보로 DataSet를 채우려면 DataAdapterFillSchema 메서드를 호출하거나 Fill을 호출하기 전에 DataAdapterMissingSchemaAction 속성을 AddWithKey로 설정합니다. 이렇게 하면 DataSet의 기본 키 제약 조건이 데이터 원본의 제약 조건을 반영합니다.

참고 항목

외래 키 제약 조건 정보는 포함되지 않으므로 명시적으로 만들어야 합니다.

DataSet를 데이터로 채우기 전에 스키마 정보를 추가하면 기본 키 제약 조건이 DataSetDataTable 개체에 포함됩니다. 결과적으로 DataSet을 채우기 위한 추가 호출이 있으면 기본 키 열 정보를 사용하여 데이터 원본의 새 행을 각 DataTable의 현재 행과 일치시키고 테이블의 현재 데이터를 데이터 원본의 데이터로 덮어씁니다. 스키마 정보가 없으면 데이터 원본의 새 행이 DataSet에 추가되어 결국 행이 중복됩니다.

참고 항목

데이터 원본의 열이 자동 증분 열로 식별되면 FillSchema 메서드 또는 AddWithKeyMissingSchemaAction 속성이 있는 Fill 메서드는 AutoIncrement 속성이 true로 설정된 DataColumn을 만듭니다. 그러나 AutoIncrementStepAutoIncrementSeed 값은 직접 설정해야 합니다.

참고 항목

FillSchema를 사용하거나 MissingSchemaActionAddWithKey로 설정하려면 기본 키 열 정보를 확인하기 위해 데이터 원본에서 추가 처리를 수행해야 합니다. 이러한 추가 처리로 인해 성능이 낮아질 수 있습니다. 디자인 타임에 기본 키 정보를 알고 있으면 기본 키 열을 명시적으로 지정하여 최상의 성능을 얻을 수 있습니다.

다음 코드 예제에서는 FillSchema를 사용하여 스키마 정보를 DataSet에 추가하는 방법을 보여 줍니다.

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

다음 코드 예제에서는 MissingSchemaAction 속성 및 Fill 메서드를 사용하여 스키마 정보를 DataSet에 추가하는 방법을 보여 줍니다.

// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", orderConnection);

DataSet customerOrders = new DataSet();

custAdapter.Fill(customerOrders, "Customers");
ordAdapter.Fill(customerOrders, "Orders");

DataRelation relation = customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(pRow["CustomerID"]);
    foreach (DataRow cRow in pRow.GetChildRows(relation))
        Console.WriteLine("\t" + cRow["OrderID"]);
}

여러 결과 집합 처리

DataAdapterSelectCommand에서 반환된 여러 개의 결과 집합이 발생하면 DataSet에 여러 개의 테이블을 만듭니다. 테이블에는 0부터 시작하되 “Table0”이 아니라 Table로 시작하는 증분 기본 이름 Table N이 지정됩니다. 테이블 이름이 FillSchema 메서드에 인수로 전달되는 경우 테이블에는 0부터 시작하되 “TableName0”이 아니라 TableName으로 시작하는 증분 기본 이름 TableName N이 지정됩니다.

참고 항목