DataTable.Merge 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
오버로드
Merge(DataTable, Boolean, MissingSchemaAction) |
지정된 DataTable을 현재 |
Merge(DataTable, Boolean) |
지정된 DataTable을 현재 |
Merge(DataTable) |
예제
다음 콘솔 애플리케이션의 동작을 보여 줍니다.는 missingSchemaAction
의 매개 변수는 Merge 메서드. 이 예제에서는 두 번째 버전의 스키마를 수정하여 동일한 테이블의 두 버전을 만듭니다. 그런 다음 코드는 두 번째 테이블을 첫 번째 테이블에 병합하려고 시도합니다.
참고
이 예제에서는 오버로드된 Merge 버전 중 하나를 사용하는 방법을 보여줍니다. 사용할 수 있는 다른 예제를 오버 로드 개별 항목을 참조 하십시오.
private static void DemonstrateMergeTable()
{
DataTable table1 = new DataTable("Items");
// Add columns
DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(idColumn);
table1.Columns.Add(itemColumn);
// Set the primary key column.
table1.PrimaryKey = new DataColumn[] { idColumn };
// Add RowChanged event handler for the table.
table1.RowChanged += new
System.Data.DataRowChangeEventHandler(Row_Changed);
// Add ten rows.
DataRow row;
for (int i = 0; i <= 9; i++)
{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
table1.Rows.Add(row);
}
// Accept changes.
table1.AcceptChanges();
PrintValues(table1, "Original values");
// Create a second DataTable identical to the first.
DataTable table2 = table1.Clone();
// Add column to the second column, so that the
// schemas no longer match.
table2.Columns.Add("newColumn", typeof(System.String));
// Add three rows. Note that the id column can't be the
// same as existing rows in the original table.
row = table2.NewRow();
row["id"] = 14;
row["item"] = 774;
row["newColumn"] = "new column 1";
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 12;
row["item"] = 555;
row["newColumn"] = "new column 2";
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 13;
row["item"] = 665;
row["newColumn"] = "new column 3";
table2.Rows.Add(row);
// Merge table2 into the table1.
Console.WriteLine("Merging");
table1.Merge(table2, false, MissingSchemaAction.Add);
PrintValues(table1, "Merged With table1, schema added");
}
private static void Row_Changed(object sender,
DataRowChangeEventArgs e)
{
Console.WriteLine("Row changed {0}\t{1}", e.Action,
e.Row.ItemArray[0]);
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("\t " + row[col].ToString());
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
Dim table1 As New DataTable("Items")
' Add columns
Dim idColumn As New DataColumn("id", GetType(System.Int32))
Dim itemColumn As New DataColumn("item", GetType(System.Int32))
table1.Columns.Add(idColumn)
table1.Columns.Add(itemColumn)
' Set the primary key column.
table1.PrimaryKey = New DataColumn() {idColumn}
' Add RowChanged event handler for the table.
AddHandler table1.RowChanged, AddressOf Row_Changed
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = table1.NewRow()
row("id") = i
row("item") = i
table1.Rows.Add(row)
Next i
' Accept changes.
table1.AcceptChanges()
PrintValues(table1, "Original values")
' Create a second DataTable identical to the first.
Dim table2 As DataTable = table1.Clone()
' Add column to the second column, so that the
' schemas no longer match.
table2.Columns.Add("newColumn", GetType(System.String))
' Add three rows. Note that the id column can't be the
' same as existing rows in the original table.
row = table2.NewRow()
row("id") = 14
row("item") = 774
row("newColumn") = "new column 1"
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 12
row("item") = 555
row("newColumn") = "new column 2"
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 13
row("item") = 665
row("newColumn") = "new column 3"
table2.Rows.Add(row)
' Merge table2 into the table1.
Console.WriteLine("Merging")
table1.Merge(table2, False, MissingSchemaAction.Add)
PrintValues(table1, "Merged With table1, Schema added")
End Sub
Private Sub Row_Changed(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row changed {0}{1}{2}", _
e.Action, ControlChars.Tab, e.Row.ItemArray(0))
End Sub
Private Sub PrintValues(ByVal table As DataTable, _
ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.Write(ControlChars.Tab + " " + row(col).ToString())
Next col
Console.WriteLine()
Next row
End Sub
설명
메서드는 Merge
스키마가 거의 유사한 두 DataTable 개체를 병합하는 데 사용됩니다. 병합을 일반적으로 사용 됩니다 클라이언트 애플리케이션에서 데이터 원본에서 최신 변경 내용을 기존 통합할 DataTable합니다. 이렇게 하면 클라이언트 애플리케이션을 새로 고칠 수 있습니다. DataTable 데이터 원본의 최신 데이터를 사용 하 여 합니다.
병합 작업은 원래 테이블과 병합할 테이블만 고려합니다. 자식 테이블은 영향을 받거나 포함되지 않습니다. 테이블에 관계의 일부로 정의된 하나 이상의 자식 테이블이 있는 경우 각 자식 테이블을 개별적으로 병합해야 합니다.
Merge(DataTable, Boolean, MissingSchemaAction)
- Source:
- DataTable.cs
- Source:
- DataTable.cs
- Source:
- DataTable.cs
지정된 DataTable을 현재 DataTable
과 병합하여, 변경 내용을 유지할지 여부와 현재 DataTable
의 누락된 스키마 처리 방식을 나타냅니다.
public:
void Merge(System::Data::DataTable ^ table, bool preserveChanges, System::Data::MissingSchemaAction missingSchemaAction);
public void Merge (System.Data.DataTable table, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);
member this.Merge : System.Data.DataTable * bool * System.Data.MissingSchemaAction -> unit
Public Sub Merge (table As DataTable, preserveChanges As Boolean, missingSchemaAction As MissingSchemaAction)
매개 변수
- missingSchemaAction
- MissingSchemaAction
MissingSchemaAction 값 중 하나입니다.
예제
다음 콘솔 애플리케이션의 동작을 보여 줍니다.는 missingSchemaAction
의 매개 변수는 Merge 메서드. 이 예제에서는 두 번째 버전의 스키마를 수정하여 동일한 테이블의 두 버전을 만듭니다. 그런 다음 코드는 두 번째 테이블을 첫 번째 테이블에 병합하려고 시도합니다.
private static void DemonstrateMergeTable()
{
DataTable itemsTable = new DataTable("Items");
// Add columns
DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
itemsTable.Columns.Add(idColumn);
itemsTable.Columns.Add(itemColumn);
// Set the primary key column.
itemsTable.PrimaryKey = new DataColumn[] { idColumn };
// Add RowChanged event handler for the table.
itemsTable.RowChanged +=
new System.Data.DataRowChangeEventHandler(Row_Changed);
// Add ten rows.
DataRow row;
for (int i = 0; i <= 9; i++)
{
row = itemsTable.NewRow();
row["id"] = i;
row["item"] = i;
itemsTable.Rows.Add(row);
}
// Accept changes.
itemsTable.AcceptChanges();
PrintValues(itemsTable, "Original values");
// Create a second DataTable identical to the first.
DataTable itemsClone = itemsTable.Clone();
// Add column to the second column, so that the
// schemas no longer match.
itemsClone.Columns.Add("newColumn", typeof(System.String));
// Add three rows. Note that the id column can't be the
// same as existing rows in the original table.
row = itemsClone.NewRow();
row["id"] = 14;
row["item"] = 774;
row["newColumn"] = "new column 1";
itemsClone.Rows.Add(row);
row = itemsClone.NewRow();
row["id"] = 12;
row["item"] = 555;
row["newColumn"] = "new column 2";
itemsClone.Rows.Add(row);
row = itemsClone.NewRow();
row["id"] = 13;
row["item"] = 665;
row["newColumn"] = "new column 3";
itemsClone.Rows.Add(row);
// Merge itemsClone into the itemsTable.
Console.WriteLine("Merging");
itemsTable.Merge(itemsClone, false, MissingSchemaAction.Add);
PrintValues(itemsTable, "Merged With itemsTable, schema added");
}
private static void Row_Changed(object sender,
DataRowChangeEventArgs e)
{
Console.WriteLine("Row changed {0}\t{1}",
e.Action, e.Row.ItemArray[0]);
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("\t " + row[col].ToString());
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
Dim itemsTable As New DataTable("Items")
' Add columns
Dim idColumn As New DataColumn("id", GetType(System.Int32))
Dim itemColumn As New DataColumn("item", GetType(System.Int32))
itemsTable.Columns.Add(idColumn)
itemsTable.Columns.Add(itemColumn)
' Set the primary key column.
itemsTable.PrimaryKey = New DataColumn() {idColumn}
' Add RowChanged event handler for the table.
AddHandler itemsTable.RowChanged, AddressOf Row_Changed
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = itemsTable.NewRow()
row("id") = i
row("item") = i
itemsTable.Rows.Add(row)
Next i
' Accept changes.
itemsTable.AcceptChanges()
PrintValues(itemsTable, "Original values")
' Create a second DataTable identical to the first.
Dim itemsClone As DataTable = itemsTable.Clone()
' Add column to the second column, so that the
' schemas no longer match.
itemsClone.Columns.Add("newColumn", GetType(System.String))
' Add three rows. Note that the id column can't be the
' same as existing rows in the original table.
row = itemsClone.NewRow()
row("id") = 14
row("item") = 774
row("newColumn") = "new column 1"
itemsClone.Rows.Add(row)
row = itemsClone.NewRow()
row("id") = 12
row("item") = 555
row("newColumn") = "new column 2"
itemsClone.Rows.Add(row)
row = itemsClone.NewRow()
row("id") = 13
row("item") = 665
row("newColumn") = "new column 3"
itemsClone.Rows.Add(row)
' Merge itemsClone into the itemsTable.
Console.WriteLine("Merging")
itemsTable.Merge(itemsClone, False, MissingSchemaAction.Add)
PrintValues(itemsTable, "Merged With itemsTable, Schema added")
End Sub
Private Sub Row_Changed(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row changed {0}{1}{2}", _
e.Action, ControlChars.Tab, e.Row.ItemArray(0))
End Sub
Private Sub PrintValues(ByVal table As DataTable, ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.Write(ControlChars.Tab + " " + row(col).ToString())
Next col
Console.WriteLine()
Next row
End Sub
설명
메서드는 Merge
스키마가 거의 유사한 두 DataTable 개체를 병합하는 데 사용됩니다. 병합을 일반적으로 사용 됩니다 클라이언트 애플리케이션에서 데이터 원본에서 최신 변경 내용을 기존 통합할 DataTable합니다. 이렇게 하면 클라이언트 애플리케이션을 새로 고칠 수 있습니다. DataTable 데이터 원본의 최신 데이터를 사용 하 여 합니다.
병합 작업은 원래 테이블과 병합할 테이블만 고려합니다. 자식 테이블은 영향을 받거나 포함되지 않습니다. 테이블에 관계의 일부로 정의된 하나 이상의 자식 테이블이 있는 경우 각 자식 테이블을 개별적으로 병합해야 합니다.
메서드는 Merge
일반적으로 변경 내용 유효성 검사, 오류 조정, 변경 내용으로 데이터 원본 업데이트 및 마지막으로 기존 DataTable를 새로 고치는 일련의 프로시저 끝에 호출됩니다.
병합을 수행할 때 개발자가 매개 변수에 대해 false를 지정하지 않는 한 병합 전에 기존 데이터에 대한 변경 내용이 preserveChanges
병합 작업 중에 유지됩니다. 매개 변수가 preserveChanges
로 true
설정된 경우 들어오는 값은 기존 행의 현재 행 버전에서 기존 값을 덮어쓰지 않습니다. 매개 변수가 preserveChanges
로 false
설정된 경우 들어오는 값은 기존 행의 현재 행 버전에서 기존 값을 덮어씁 수 있습니다. 행 버전에 대한 자세한 내용은 행 상태 및 행 버전을 참조하세요.
클라이언트 애플리케이션에서는 단일 하는 단추가 사용자가 클릭할 수 있는 변경된 된 데이터를 수집 하 고 중간 계층 구성 요소를 다시 보내기 전에 유효성 검사를 수행 하는 데 평소 됩니다. 이 시나리오에서는 메서드가 GetChanges 먼저 호출됩니다. 해당 메서드는 유효성 검사 및 병합에 최적화된 두 번째 DataTable 를 반환합니다. 이 두 번째 DataTable 개체는 변경된 및 DataRow 개체만 DataTable 포함하므로 원래 DataTable의 하위 집합이 생성됩니다. 이 하위 집합은 일반적으로 더 작으므로 이 하위 집합은 중간 계층 구성 요소로 더 효율적으로 다시 전달됩니다. 그런 다음 중간 계층 구성 요소는 저장 프로시저를 통해 변경 내용으로 원래 데이터 원본을 업데이트합니다. 그런 다음 중간 계층은 원본 데이터와 데이터 원본의 최신 데이터를 포함하는 새 DataTable 를 다시 보내거나(원래 쿼리를 다시 실행하여) 데이터 원본에서 변경한 내용이 포함된 하위 집합을 다시 보낼 수 있습니다. (예를 들어, 데이터 원본에서 자동으로 고유 기본 키 값을 만드는 경우 이러한 값에 전파할 수 다시 클라이언트 애플리케이션입니다.) 두 경우 모두 반환 된 DataTable 클라이언트 애플리케이션의 원본에 다시 병합할 수 있게 DataTable 사용 하 여는 Merge 메서드.
메서드가 Merge 호출되면 스키마가 변경되었을 수 있으므로 두 DataTable 개체의 스키마가 비교됩니다. 예를 들어 비즈니스 간 시나리오에서는 자동화된 프로세스를 통해 새 열이 XML 스키마에 추가되었을 수 있습니다. 원본 DataTable 에 대상에 누락된 스키마 요소(추가 DataColumn 된 개체)가 포함된 경우 인수MissingSchemaAction.Add
를 로 설정 missingSchemaAction
하여 스키마 요소를 대상에 추가할 수 있습니다. 이 경우 병합된 에 추가된 DataTable 스키마 및 데이터가 포함됩니다.
스키마를 병합한 후 데이터가 병합됩니다.
새 원본 DataTable 을 대상에 병합할 때 값Unchanged
이 , Modified
또는 Deleted
인 모든 원본 행 DataRowState 이 동일한 기본 키 값을 가진 대상 행과 일치합니다. 값 Added
이 인 DataRowState 원본 행은 새 원본 행과 기본 키 값이 동일한 새 대상 행과 일치합니다.
추가 정보
적용 대상
Merge(DataTable, Boolean)
- Source:
- DataTable.cs
- Source:
- DataTable.cs
- Source:
- DataTable.cs
지정된 DataTable을 현재 DataTable
과 병합하여 현재 DataTable
에서 변경 내용을 유지할지 여부를 나타냅니다.
public:
void Merge(System::Data::DataTable ^ table, bool preserveChanges);
public void Merge (System.Data.DataTable table, bool preserveChanges);
member this.Merge : System.Data.DataTable * bool -> unit
Public Sub Merge (table As DataTable, preserveChanges As Boolean)
매개 변수
- table
- DataTable
현재 DataTable
과 병합할 DataTable
입니다.
- preserveChanges
- Boolean
현재 true
의 변경 내용을 유지하려면 DataTable
이고, 그렇지 않으면 false
입니다.
예제
다음 콘솔 애플리케이션을 만듭니다는 DataTable 해당 행의 데이터 중 일부를 수정 행을 포함 하 고 다른 데이터를 병합 하려고 DataTable합니다. 이 예제에서는 매개 변수에 대한 다양한 동작을 preserveChanges
보여 줍니다.
private static void DemonstrateMergeTable()
{
// Demonstrate merging, within and without
// preserving changes.
// In this example, take these actions:
// 1. Create a DataTable (table1) and fill the table with data.
// 2. Create a copy of table1, and modify its data (modifiedTable).
// 3. Modify data in table1.
// 4. Make a copy of table1 (table1Copy).
// 5. Merge the data from modifiedTable into table1 and table1Copy,
// showing the difference between setting the preserveChanges
// parameter to true and false.
// Create a new DataTable.
DataTable table1 = new DataTable("Items");
// Add two columns to the table:
DataColumn column = new DataColumn("id", typeof(System.Int32));
column.AutoIncrement = true;
table1.Columns.Add(column);
column = new DataColumn("item", typeof(System.String));
table1.Columns.Add(column);
// Set primary key column.
table1.PrimaryKey = new DataColumn[] { table1.Columns[0] };
// Add some rows.
DataRow row;
for (int i = 0; i <= 3; i++)
{
row = table1.NewRow();
row["item"] = "Item " + i;
table1.Rows.Add(row);
}
// Accept changes.
table1.AcceptChanges();
PrintValues(table1, "Original values");
// Using the same schema as the original table,
// modify the data for later merge.
DataTable modifiedTable = table1.Copy();
foreach (DataRow rowModified in modifiedTable.Rows)
{
rowModified["item"] = rowModified["item"].ToString()
+ " modified";
}
modifiedTable.AcceptChanges();
// Change row values, and add a new row:
table1.Rows[0]["item"] = "new Item 0";
table1.Rows[1]["item"] = "new Item 1";
row = table1.NewRow();
row["id"] = 4;
row["item"] = "Item 4";
table1.Rows.Add(row);
// Get a copy of the modified data:
DataTable table1Copy = table1.Copy();
PrintValues(table1, "Modified and new Values");
PrintValues(modifiedTable, "Data to be merged into table1");
// Merge new data into the modified data.
table1.Merge(modifiedTable, true);
PrintValues(table1, "Merged data (preserve changes)");
table1Copy.Merge(modifiedTable, false);
PrintValues(table1Copy, "Merged data (don't preserve changes)");
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
Console.Write("\t{0}", row[column, DataRowVersion.Current]);
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
' Demonstrate merging, within and without
' preserving changes.
' In this example, take these actions:
' 1. Create a DataTable (table1) and fill the table with data.
' 2. Create a copy of table1, and modify its data (modifiedTable).
' 3. Modify data in table1.
' 4. Make a copy of table1 (table1Copy).
' 5. Merge the data from modifiedTable into table1 and table1Copy,
' showing the difference between setting the preserveChanges
' parameter to true and false.
' Create a new DataTable.
Dim table1 As New DataTable("Items")
' Add two columns to the table:
Dim column As New DataColumn("id", GetType(System.Int32))
column.AutoIncrement = True
table1.Columns.Add(column)
column = New DataColumn("item", GetType(System.String))
table1.Columns.Add(column)
' Set primary key column.
table1.PrimaryKey = New DataColumn() {table1.Columns(0)}
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = table1.NewRow()
row("item") = "Item " & i
table1.Rows.Add(row)
Next i
' Accept changes.
table1.AcceptChanges()
PrintValues(table1, "Original values")
' Using the same schema as the original table,
' modify the data for later merge.
Dim modifiedTable As DataTable = table1.Copy()
For Each row In modifiedTable.Rows
row("item") = row("item").ToString() & " modified"
Next
modifiedTable.AcceptChanges()
' Change row values, and add a new row:
table1.Rows(0)("item") = "New Item 0"
table1.Rows(1)("item") = "New Item 1"
row = table1.NewRow()
row("id") = 4
row("item") = "Item 4"
table1.Rows.Add(row)
' Get a copy of the modified data:
Dim table1Copy As DataTable = table1.Copy()
PrintValues(table1, "Modified and New Values")
PrintValues(modifiedTable, "Data to be merged into table1")
' Merge new data into the modified data.
table1.Merge(modifiedTable, True)
PrintValues(table1, "Merged data (preserve changes)")
table1Copy.Merge(modifiedTable, False)
PrintValues(table1Copy, "Merged data (don't preserve changes)")
End Sub
Private Sub PrintValues(ByVal table As DataTable, _
ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each column As DataColumn In table.Columns
Console.Write("{0}{1}", ControlChars.Tab, row(column, _
DataRowVersion.Current))
Next column
Console.WriteLine()
Next row
End Sub
설명
Merge 메서드는 스키마가 거의 유사한 두 DataTable 개체를 병합하는 데 사용됩니다. 병합을 일반적으로 사용 됩니다 클라이언트 애플리케이션에서 데이터 원본에서 최신 변경 내용을 기존 통합할 DataTable합니다. 이렇게 하면 클라이언트 애플리케이션을 새로 고칠 수 있습니다. DataTable 데이터 원본의 최신 데이터를 사용 하 여 합니다.
병합 작업은 원래 테이블과 병합할 테이블만 고려합니다. 자식 테이블은 영향을 받거나 포함되지 않습니다. 테이블에 관계의 일부로 정의된 하나 이상의 자식 테이블이 있는 경우 각 자식 테이블을 개별적으로 병합해야 합니다.
메서드는 Merge
일반적으로 변경 내용 유효성 검사, 오류 조정, 변경 내용으로 데이터 원본 업데이트 및 마지막으로 기존 DataTable를 새로 고치는 일련의 프로시저 끝에 호출됩니다.
병합을 수행할 때 개발자가 매개 변수에 대해 false를 지정하지 않는 한 병합 전에 기존 데이터에 대한 변경 내용이 preserveChanges
병합 작업 중에 유지됩니다. 매개 변수가 preserveChanges
로 true
설정된 경우 들어오는 값은 기존 행의 현재 행 버전에서 기존 값을 덮어쓰지 않습니다. 매개 변수가 preserveChanges
로 false
설정된 경우 들어오는 값은 기존 행의 현재 행 버전에서 기존 값을 덮어씁 수 있습니다. 행 버전에 대한 자세한 내용은 행 상태 및 행 버전을 참조하세요.
클라이언트 애플리케이션에서는 단일 하는 단추가 사용자가 클릭할 수 있는 변경된 된 데이터를 수집 하 고 중간 계층 구성 요소를 다시 보내기 전에 유효성 검사를 수행 하는 데 평소 됩니다. 이 시나리오에서는 메서드가 GetChanges 먼저 호출됩니다. 해당 메서드는 유효성 검사 및 병합에 최적화된 두 번째 DataTable 를 반환합니다. 이 두 번째 DataTable 개체는 변경된 및 DataRow 개체만 DataTable 포함하므로 원래 DataTable의 하위 집합이 생성됩니다. 이 하위 집합은 일반적으로 더 작으므로 이 하위 집합은 중간 계층 구성 요소로 더 효율적으로 다시 전달됩니다. 그런 다음 중간 계층 구성 요소는 저장 프로시저를 통해 변경 내용으로 원래 데이터 원본을 업데이트합니다. 그런 다음 중간 계층은 원본 데이터와 데이터 원본의 최신 데이터를 포함하는 새 DataTable 를 다시 보내거나(원래 쿼리를 다시 실행하여) 데이터 원본에서 변경한 내용이 포함된 하위 집합을 다시 보낼 수 있습니다. (예를 들어, 데이터 원본에서 자동으로 고유 기본 키 값을 만드는 경우 이러한 값에 전파할 수 다시 클라이언트 애플리케이션입니다.) 두 경우 모두 반환 된 DataTable 클라이언트 애플리케이션의 원본에 다시 병합할 수 있게 DataTable 사용 하 여는 Merge 메서드.
새 원본 DataTable 을 대상에 병합할 때 값Unchanged
이 , Modified
또는 Deleted
인 모든 원본 행 DataRowState 이 동일한 기본 키 값을 가진 대상 행과 일치합니다. 값 Added
이 인 DataRowState 원본 행은 새 원본 행과 기본 키 값이 동일한 새 대상 행과 일치합니다.
추가 정보
적용 대상
Merge(DataTable)
- Source:
- DataTable.cs
- Source:
- DataTable.cs
- Source:
- DataTable.cs
public:
void Merge(System::Data::DataTable ^ table);
public void Merge (System.Data.DataTable table);
member this.Merge : System.Data.DataTable -> unit
Public Sub Merge (table As DataTable)
매개 변수
예제
다음 콘솔 애플리케이션을 만드는 간단한 DataTable 데이터 테이블에 추가 합니다. 그런 다음, 테이블의 복사본을 만들어 복사본에 행을 추가합니다. 마지막으로 이 예제에서는 메서드를 Merge 호출하여 두 번째 테이블의 데이터를 첫 번째 테이블의 데이터와 병합합니다.
private static void DemonstrateMergeTable()
{
DataTable table1 = new DataTable("Items");
// Add columns
DataColumn column1 = new DataColumn("id", typeof(System.Int32));
DataColumn column2 = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(column1);
table1.Columns.Add(column2);
// Set the primary key column.
table1.PrimaryKey = new DataColumn[] { column1 };
// Add RowChanged event handler for the table.
table1.RowChanged +=
new System.Data.DataRowChangeEventHandler(Row_Changed);
// Add some rows.
DataRow row;
for (int i = 0; i <= 3; i++)
{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
table1.Rows.Add(row);
}
// Accept changes.
table1.AcceptChanges();
PrintValues(table1, "Original values");
// Create a second DataTable identical to the first.
DataTable table2 = table1.Clone();
// Add three rows. Note that the id column can't be the
// same as existing rows in the original table.
row = table2.NewRow();
row["id"] = 14;
row["item"] = 774;
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 12;
row["item"] = 555;
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 13;
row["item"] = 665;
table2.Rows.Add(row);
// Merge table2 into the table1.
Console.WriteLine("Merging");
table1.Merge(table2);
PrintValues(table1, "Merged With table1");
}
private static void Row_Changed(object sender,
DataRowChangeEventArgs e)
{
Console.WriteLine("Row changed {0}\t{1}",
e.Action, e.Row.ItemArray[0]);
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("\t " + row[col].ToString());
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
Dim table1 As New DataTable("Items")
' Add columns
Dim column1 As New DataColumn("id", GetType(System.Int32))
Dim column2 As New DataColumn("item", GetType(System.Int32))
table1.Columns.Add(column1)
table1.Columns.Add(column2)
' Set the primary key column.
table1.PrimaryKey = New DataColumn() {column1}
' Add RowChanged event handler for the table.
AddHandler table1.RowChanged, AddressOf Row_Changed
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = table1.NewRow()
row("id") = i
row("item") = i
table1.Rows.Add(row)
Next i
' Accept changes.
table1.AcceptChanges()
PrintValues(table1, "Original values")
' Create a second DataTable identical to the first.
Dim table2 As DataTable = table1.Clone()
' Add three rows. Note that the id column can't be the
' same as existing rows in the original table.
row = table2.NewRow()
row("id") = 14
row("item") = 774
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 12
row("item") = 555
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 13
row("item") = 665
table2.Rows.Add(row)
' Merge table2 into the table1.
Console.WriteLine("Merging")
table1.Merge(table2)
PrintValues(table1, "Merged With table1")
End Sub
Private Sub Row_Changed(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row changed {0}{1}{2}", _
e.Action, ControlChars.Tab, e.Row.ItemArray(0))
End Sub
Private Sub PrintValues(ByVal table As DataTable, _
ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.Write(ControlChars.Tab + " " + row(col).ToString())
Next col
Console.WriteLine()
Next row
End Sub
설명
Merge 메서드는 스키마가 거의 유사한 두 DataTable 개체를 병합하는 데 사용됩니다. 병합을 일반적으로 사용 됩니다 클라이언트 애플리케이션에서 데이터 원본에서 최신 변경 내용을 기존 통합할 DataTable합니다. 이렇게 하면 클라이언트 애플리케이션을 새로 고칠 수 있습니다. DataTable 데이터 원본의 최신 데이터를 사용 하 여 합니다.
병합 작업은 원래 테이블과 병합할 테이블만 고려합니다. 자식 테이블은 영향을 받거나 포함되지 않습니다. 테이블에 관계의 일부로 정의된 하나 이상의 자식 테이블이 있는 경우 각 자식 테이블을 개별적으로 병합해야 합니다.
메서드는 Merge
일반적으로 변경 내용 유효성 검사, 오류 조정, 변경 내용으로 데이터 원본 업데이트 및 마지막으로 기존 DataTable를 새로 고치는 일련의 프로시저 끝에 호출됩니다.
병합을 수행할 때 병합 전에 기존 데이터에 대한 변경 내용은 병합 작업 중에 기본적으로 유지됩니다. 개발자는 이 메서드에 대한 다른 두 오버로드 중 하나를 호출하고 매개 변수에 대해 false 값을 지정하여 이 동작을 수정할 preserveChanges
수 있습니다.
클라이언트 애플리케이션에서는 단일 하는 단추가 사용자가 클릭할 수 있는 변경된 된 데이터를 수집 하 고 중간 계층 구성 요소를 다시 보내기 전에 유효성 검사를 수행 하는 데 평소 됩니다. 이 시나리오에서는 메서드가 GetChanges 먼저 호출됩니다. 해당 메서드는 유효성 검사 및 병합에 최적화된 두 번째 DataTable 를 반환합니다. 이 두 번째 DataTable 개체는 변경된 개체만 DataRow 포함하므로 원래 DataTable의 하위 집합이 생성됩니다. 이 하위 집합은 일반적으로 더 작으므로 중간 계층 구성 요소로 더 효율적으로 다시 전달됩니다. 그런 다음 중간 계층 구성 요소는 저장 프로시저를 통해 변경 내용으로 원래 데이터 원본을 업데이트합니다. 그런 다음 중간 계층은 원본 데이터와 데이터 원본의 최신 데이터를 포함하는 새 DataTable 를 다시 보내거나(원래 쿼리를 다시 실행하여) 데이터 원본에서 변경한 내용이 포함된 하위 집합을 다시 보낼 수 있습니다. (예를 들어, 데이터 원본에서 자동으로 고유 기본 키 값을 만드는 경우 이러한 값에 전파할 수 다시 클라이언트 애플리케이션입니다.) 두 경우 모두 반환 된 DataTable 클라이언트 애플리케이션의 원본에 다시 병합할 수 있게 DataTable 사용 하 여는 Merge 메서드.
새 원본 DataTable 을 대상에 병합할 때 값Unchanged
이 , Modified
또는 Deleted
인 모든 원본 행 DataRowState 이 동일한 기본 키 값을 가진 대상 행과 일치합니다. 값 Added
이 인 DataRowState 원본 행은 새 원본 행과 기본 키 값이 동일한 새 대상 행과 일치합니다.
추가 정보
적용 대상
.NET