DataSet.Merge メソッド (DataTable, Boolean, MissingSchemaAction)
指定した DataTable およびそのスキーマを現在の DataSet にマージします。指定した引数に従って、この DataSet に行われた変更を保持または破棄し、互換性のないスキーマを処理します。
Overloads Public Sub Merge( _
ByVal table As DataTable, _ ByVal preserveChanges As Boolean, _ ByVal missingSchemaAction As MissingSchemaAction _)
[C#]
public void Merge(DataTabletable,boolpreserveChanges,MissingSchemaActionmissingSchemaAction);
[C++]
public: void Merge(DataTable* table,boolpreserveChanges,MissingSchemaActionmissingSchemaAction);
[JScript]
public function Merge(
table : DataTable,preserveChanges : Boolean,missingSchemaAction : MissingSchemaAction);
パラメータ
- table
データとスキーマをマージする対象の DataTable 。 - preserveChanges
DataSet に対して行われた変更を保持するには true 。保持しない場合は false 。 - missingSchemaAction
MissingSchemaAction 値の 1 つ。
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | dataSet が null 参照 (Visual Basic では Nothing) です。 |
解説
Merge メソッドを使用して、スキーマがほとんど同様の 2 つの DataSet オブジェクトをマージします。マージは、通常、データ ソースから既存の DataSet に直前の変更を組み込むために、クライアント アプリケーションで使用されます。これにより、クライアント アプリケーションが更新された DataSet と、データ ソースからの最新データを入手できます。
通常、 Merge メソッドは、変更の検証、エラーの調整、変更されたデータ ソースの更新、および最後に既存の DataSet の更新に関係する一連のプロシージャの終わりに呼び出されます。
クライアント アプリケーションには、通常、変更されたデータを収集し、それを中間層コンポーネントに戻す前に検証するためにユーザーがクリックできる単一のボタンがあります。このシナリオでは、初めに GetChanges メソッドを呼び出します。このメソッドは、検証とマージのために最適化された 2 番目の DataSet を返します。2 番目の DataSet オブジェクトには、変更された DataTable オブジェクトおよび DataRow オブジェクトだけが含まれ、元の DataSet のサブセットになります。このサブセットは一般的に小さいため、中間層コンポーネントに効率よく渡されます。次に、中間層コンポーネントは、ストアド プロシージャを通じて変更のある元のデータ ソースを更新します。次に、中間層は (元のクエリを再び実行することによって) 元のデータとデータ ソースからの最新のデータを含む新しい DataSet を返信するか、データ ソースから変更の加えられたサブセットを返信できます。たとえば、データ ソースが自動的に一意の主キー値を作成する場合、その値はクライアント アプリケーションに反映できます。どちらの場合にも、返された DataSet は、 Merge メソッドで、クライアント アプリケーションの元の DataSet にマージできます。
Merge メソッドが呼び出されたときは、スキーマが変更されている可能性があるため、2 つの DataSet オブジェクトのスキーマが比較されます。たとえば、B to B シナリオでは、自動処理によって新しい列が XML スキーマに追加されていることがあります。ソース DataSet がターゲットに不足しているスキーマ要素 (追加された DataColumn オブジェクト) を格納している場合、そのスキーマ要素は引数 missingSchemaAction を MissingSchemaAction.Add に設定して、ターゲットに追加できます。この場合、マージされた DataSet は、追加されたスキーマとデータを格納します。
スキーマのマージ後に、データをマージします。
新しいソース DataSet をターゲットにマージする場合、 DataRowState 値が Unchanged 、 Modified 、または Deleted であるすべてのソース行が、同じ主キー値を持つターゲット行と照合されます。 DataRowState の値が Added であるソース行は、新しいソース行と同じ主キー値を持つ新しいターゲット行と照合されます。マージ中に、制約は無効になります。マージの終了時に制約を有効にできない場合は、 ConstraintException が生成され、制約は無効になりますが、マージされたデータは保持されます。この場合、 EnforceConstraints プロパティは false に設定され、無効なすべての行はエラー時にマークされます。エラーは、 EnforceConstraints プロパティを true にリセットする前に解決する必要があります。
使用例
[Visual Basic, C#, C++] 1 つのテーブル、2 列、および 10 行で単純な DataSet を作成する例を次に示します。最初の DataTable に似ているが新しい DataColumn が追加される点で異なる、2 つ目のテーブルを作成します。2 つ目のテーブルに 2 つの行を追加した後、引数 preserveChanges を false 、引数 missingSchemaAction を MissingSchemaAction.Add に設定した DataSet にこのテーブルをマージします。
Private Sub DemonstrateMergeTableAddSchema()
' Create a DataSet with one table, two columns, and ten rows.
Dim ds As New DataSet("myDataSet")
Dim t As New DataTable("Items")
' Add tables to the DataSet
ds.Tables.Add(t)
' Create and add two columns to the DataTable
Dim c1 As New DataColumn("id", Type.GetType("System.Int32"), "")
c1.AutoIncrement = True
Dim c2 As New DataColumn("Item", Type.GetType("System.Int32"), "")
t.Columns.Add(c1)
t.Columns.Add(c2)
' DataColumn array to set primary key.
Dim keyCol(1) As DataColumn
' Set primary key column.
keyCol(0) = c1
t.PrimaryKey = keyCol
' Add RowChanged event handler for the table.
AddHandler t.RowChanged, AddressOf Row_Changed
' Add ten rows.
Dim i As Integer
Dim r As DataRow
For i = 0 To 9
r = t.NewRow()
r("Item") = i
t.Rows.Add(r)
Next i
' Accept changes.
ds.AcceptChanges()
PrintValues(ds, "Original values")
' Create a second DataTable identical to the first
' with one extra column using the Clone method.
Dim t2 As New DataTable
t2 = t.Clone()
' Add column.
t2.Columns.Add("extra", Type.GetType("System.String"))
' Add two rows. Note that the id column can't be the
' same as existing rows in the DataSet table.
Dim newRow As DataRow
newRow = t2.NewRow()
newRow("id") = 12
newRow("Item") = 555
newRow("extra") = "extra Column 1"
t2.Rows.Add(newRow)
newRow = t2.NewRow()
newRow("id") = 13
newRow("Item") = 665
newRow("extra") = "extra Column 2"
t2.Rows.Add(newRow)
' Merge the table into the DataSet.
Console.WriteLine("Merging")
ds.Merge(t2, False, MissingSchemaAction.Add)
PrintValues(ds, "Merged With Table, Schema Added")
End Sub
Private Sub Row_Changed(sender As Object, e As DataRowChangeEventArgs)
Console.WriteLine("Row Changed " + e.Action.ToString() _
+ ControlChars.Tab + e.Row.ItemArray(0).ToString())
End Sub
Private Sub PrintValues(ds As DataSet, label As String)
Console.WriteLine(ControlChars.Cr + label)
Dim t As DataTable
Dim r As DataRow
Dim c As DataColumn
For Each t In ds.Tables
Console.WriteLine("TableName: " + t.TableName)
For Each r In t.Rows
For Each c In t.Columns
Console.Write(ControlChars.Tab + " " + r(c).ToString())
Next c
Console.WriteLine()
Next r
Next t
End Sub
[C#]
private void DemonstrateMergeTableAddSchema(){
// Create a DataSet with one table, two columns, and ten rows.
DataSet ds = new DataSet("myDataSet");
DataTable t = new DataTable("Items");
// Add table to the DataSet
ds.Tables.Add(t);
// Create and add two columns to the DataTable
DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"),"");
c1.AutoIncrement=true;
DataColumn c2 = new DataColumn("Item", Type.GetType("System.Int32"),"");
t.Columns.Add(c1);
t.Columns.Add(c2);
// Set the primary key to the first column.
t.PrimaryKey = new DataColumn[1]{ c1 };
// Add RowChanged event handler for the table.
t.RowChanged+= new DataRowChangeEventHandler(Row_Changed);
// Add ten rows.
for(int i = 0; i <10;i++){
DataRow r=t.NewRow();
r["Item"]= i;
t.Rows.Add(r);
}
// Accept changes.
ds.AcceptChanges();
PrintValues(ds, "Original values");
// Create a second DataTable identical to the first, with
// one extra column using the Clone method.
DataTable t2 = t.Clone();
t2.Columns.Add("extra", typeof(string));
// Add two rows. Note that the id column can't be the
// same as existing rows in the DataSet table.
DataRow newRow;
newRow=t2.NewRow();
newRow["id"]= 12;
newRow["Item"]=555;
newRow["extra"]= "extra Column 1";
t2.Rows.Add(newRow);
newRow=t2.NewRow();
newRow["id"]= 13;
newRow["Item"]=665;
newRow["extra"]= "extra Column 2";
t2.Rows.Add(newRow);
// Merge the table into the DataSet.
Console.WriteLine("Merging");
ds.Merge(t2,false,MissingSchemaAction.Add);
PrintValues(ds, "Merged With Table, Schema Added");
}
private void Row_Changed(object sender, DataRowChangeEventArgs e){
Console.WriteLine("Row Changed " + e.Action.ToString() + "\t" + e.Row.ItemArray[0]);
}
private void PrintValues(DataSet ds, string label){
Console.WriteLine("\n" + label);
foreach(DataTable t in ds.Tables){
Console.WriteLine("TableName: " + t.TableName);
foreach(DataRow r in t.Rows){
foreach(DataColumn c in t.Columns){
Console.Write("\t " + r[c] );
}
Console.WriteLine();
}
}
}
[C++]
private:
void DemonstrateMergeTableAddSchema(){
// Create a DataSet with one table, two columns, and ten rows.
DataSet* ds = new DataSet(S"myDataSet");
DataTable* t = new DataTable(S"Items");
// Add table to the DataSet
ds->Tables->Add(t);
// Create and add two columns to the DataTable
DataColumn* c1 = new DataColumn(S"id", Type::GetType(S"System.Int32"),S"");
c1->AutoIncrement=true;
DataColumn* c2 = new DataColumn(S"Item", Type::GetType(S"System.Int32"),S"");
t->Columns->Add(c1);
t->Columns->Add(c2);
// Set the primary key to the first column.
DataColumn* temp[] = { c1 };
t->PrimaryKey = temp;
// Add RowChanged event handler for the table.
t->RowChanged+= new DataRowChangeEventHandler(this, &Form1::Row_Changed);
// Add ten rows.
for(int i = 0; i <10;i++){
DataRow* r=t->NewRow();
r->Item[S"Item"]= __box(i);
t->Rows->Add(r);
}
// Accept changes.
ds->AcceptChanges();
PrintValues(ds, S"Original values");
// Create a second DataTable identical to the first, with
// one extra column using the Clone method.
DataTable* t2 = t->Clone();
t2->Columns->Add(S"extra", __typeof(String));
// Add two rows. Note that the id column can't be the
// same as existing rows in the DataSet table.
DataRow* newRow;
newRow=t2->NewRow();
newRow->Item[S"id"]= __box(12);
newRow->Item[S"Item"]=__box(555);
newRow->Item[S"extra"]= S"extra Column 1";
t2->Rows->Add(newRow);
newRow=t2->NewRow();
newRow->Item[S"id"]= __box(13);
newRow->Item[S"Item"]=__box(665);
newRow->Item[S"extra"]= S"extra Column 2";
t2->Rows->Add(newRow);
// Merge the table into the DataSet.
Console::WriteLine(S"Merging");
ds->Merge(t2,false,MissingSchemaAction::Add);
PrintValues(ds, S"Merged With Table, Schema Added");
}
void Row_Changed(Object* /*sender*/, DataRowChangeEventArgs* e){
Console::WriteLine(S"Row Changed {0}\t{1}", __box(e->Action), e->Row->ItemArray[0]);
}
void PrintValues(DataSet* ds, String* label){
Console::WriteLine(S"\n{0}", label);
System::Collections::IEnumerator* myEnum = ds->Tables->GetEnumerator();
while (myEnum->MoveNext())
{
DataTable* t = __try_cast<DataTable*>(myEnum->Current);
Console::WriteLine(S"TableName: {0}", t->TableName);
System::Collections::IEnumerator* myEnum1 = t->Rows->GetEnumerator();
while (myEnum1->MoveNext())
{
DataRow* r = __try_cast<DataRow*>(myEnum1->Current);
System::Collections::IEnumerator* myEnum2 = t->Columns->GetEnumerator();
while (myEnum2->MoveNext())
{
DataColumn* c = __try_cast<DataColumn*>(myEnum2->Current);
Console::Write(S"\t {0}", r->Item[c] );
}
Console::WriteLine();
}
}
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
参照
DataSet クラス | DataSet メンバ | System.Data 名前空間 | DataSet.Merge オーバーロードの一覧