DataTable.Load DataTable.Load DataTable.Load DataTable.Load Method

정의

제공된 DataTable를 사용해서 IDataReader을 데이터 소스의 값으로 채웁니다.Fills a DataTable with values from a data source using the supplied IDataReader. DataTable에 이미 행이 포함되어 있으면 데이터 소스에서 들어오는 데이터가 기존 행과 병합됩니다.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows.

오버로드

Load(IDataReader) Load(IDataReader) Load(IDataReader) Load(IDataReader)

제공된 DataTable를 사용해서 IDataReader을 데이터 소스의 값으로 채웁니다.Fills a DataTable with values from a data source using the supplied IDataReader. DataTable에 이미 행이 포함되어 있으면 데이터 소스에서 들어오는 데이터가 기존 행과 병합됩니다.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows.

Load(IDataReader, LoadOption) Load(IDataReader, LoadOption) Load(IDataReader, LoadOption)

제공된 DataTable를 사용해서 IDataReader을 데이터 소스의 값으로 채웁니다.Fills a DataTable with values from a data source using the supplied IDataReader. DataTable에 이미 행이 포함되어 있으면 데이터 소스에서 들어오는 데이터는 loadOption 매개 변수의 값에 따라 기존 행과 병합됩니다.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the loadOption parameter.

Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler)

오류 처리 대리자를 사용하는 제공된 DataTable를 사용해서 IDataReader을 데이터 소스의 값으로 채웁니다.Fills a DataTable with values from a data source using the supplied IDataReader using an error-handling delegate.

예제

다음 예제에서는 다양 한 호출을 사용 하 여 관련 된 문제는 Load 메서드.The following example demonstrates several of the issues involved with calling the Load method. 예제에서 로드 된 스키마를 유추 등의 스키마 문제에 집중 하는 먼저 IDataReader, 및 다음 호환 되지 않는 스키마 및 열이 누락 되거나 추가 된 스키마를 처리 합니다.First, the example focuses on schema issues, including inferring a schema from the loaded IDataReader, and then handling incompatible schemas, and schemas with missing or additional columns. 이 예제에서는 다음 데이터 문제를 포함 하 여 다양 한 로드 옵션에 중점을 둡니다.The example then focuses on data issues, including handling the various loading options.

참고

이 예제에서는 오버 로드 된 버전 중 하나를 사용 하는 방법을 보여 줍니다 Load합니다.This example shows how to use one of the overloaded versions of Load. 사용할 수 있는 다른 예제를 오버 로드 개별 항목을 참조 하십시오.For other examples that might be available, see the individual overload topics.

static void Main()
{
    // This example examines a number of scenarios involving the 
    // DataTable.Load method.
    Console.WriteLine("Load a DataTable and infer its schema:");

    // The table has no schema. The Load method will infer the 
    // schema from the IDataReader:
    DataTable table = new DataTable();

    // Retrieve a data reader, based on the Customers data. In
    // an application, this data might be coming from a middle-tier
    // business object:
    DataTableReader reader = new DataTableReader(GetCustomers());

    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine("Load a DataTable from an incompatible IDataReader:");

    // Create a table with a single integer column. Attempt
    // to load data from a reader with a schema that is 
    // incompatible. Note the exception, determined
    // by the particular incompatibility:
    table = GetIntegerTable();
    reader = new DataTableReader(GetStringTable());
    try
    {
        table.Load(reader);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.GetType().Name + ":" + ex.Message);
    }

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has extra columns:");

    // Note that loading a reader with extra columns adds
    // the columns to the existing table, if possible:
    table = GetIntegerTable();
    reader = new DataTableReader(GetCustomers());
    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has missing columns:");

    // Note that loading a reader with missing columns causes 
    // the columns to be filled with null data, if possible:
    table = GetCustomers();
    reader = new DataTableReader(GetIntegerTable());
    table.Load(reader);
    PrintColumns(table);

    // Demonstrate the various possibilites when loading data into
    // a DataTable that already contains data.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Demonstrate data considerations:");
    Console.WriteLine("Current value, Original value, (RowState)");
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Original table:");

    table = SetupModifiedRows();
    DisplayRowState(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine("Data in IDataReader to be loaded:");
    DisplayRowState(GetChangedCustomers());

    PerformDemo(LoadOption.OverwriteChanges);
    PerformDemo(LoadOption.PreserveChanges);
    PerformDemo(LoadOption.Upsert);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
}

private static void DisplayRowState(DataTable table)
{
    for (int i = 0; i <= table.Rows.Count - 1; i++)
    {
        object current = "--";
        object original = "--";
        DataRowState rowState = table.Rows[i].RowState;

        // Attempt to retrieve the current value, which doesn't exist
        // for deleted rows:
        if (rowState != DataRowState.Deleted)
        {
            current = table.Rows[i]["Name", DataRowVersion.Current];
        }

        // Attempt to retrieve the original value, which doesn't exist
        // for added rows:
        if (rowState != DataRowState.Added)
        {
            original = table.Rows[i]["Name", DataRowVersion.Original];
        }
        Console.WriteLine("{0}: {1}, {2} ({3})", i, current, 
            original, rowState);
    }
}

private static DataTable GetChangedCustomers()
{
    // Create sample Customers table.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 0, "XXX" });
    table.Rows.Add(new object[] { 1, "XXX" });
    table.Rows.Add(new object[] { 2, "XXX" });
    table.Rows.Add(new object[] { 3, "XXX" });
    table.Rows.Add(new object[] { 4, "XXX" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetCustomers()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 0, "Mary" });
    table.Rows.Add(new object[] { 1, "Andy" });
    table.Rows.Add(new object[] { 2, "Peter" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetIntegerTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 4 });
    table.Rows.Add(new object[] { 5 });
    table.AcceptChanges();
    return table;
}

private static DataTable GetStringTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { "Mary" });
    table.Rows.Add(new object[] { "Andy" });
    table.Rows.Add(new object[] { "Peter" });
    table.AcceptChanges();
    return table;
}

private static void PerformDemo(LoadOption optionForLoad)
{

    // Load data into a DataTable, retrieve a DataTableReader containing
    // different data, and call the Load method. Depending on the
    // LoadOption value passed as a parameter, this procedure displays
    // different results in the DataTable.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("table.Load(reader, {0})", optionForLoad);
    Console.WriteLine(" ============================= ");

    DataTable table = SetupModifiedRows();
    DataTableReader reader = new DataTableReader(GetChangedCustomers());
    table.RowChanging +=new DataRowChangeEventHandler(HandleRowChanging);

    table.Load(reader, optionForLoad);
    Console.WriteLine();
    DisplayRowState(table);
}

private static void PrintColumns(DataTable table)
{
    // Loop through all the rows in the DataTableReader
    foreach (DataRow row in table.Rows)
    {
        for (int i = 0; i < table.Columns.Count; i++)
        {
            Console.Write(row[i] + " ");
        }
        Console.WriteLine();
    }
}

private static DataTable SetupModifiedRows()
{
    // Fill a DataTable with customer info, and 
    // then modify, delete, and add rows.

    DataTable table = GetCustomers();
    // Row 0 is unmodified.
    // Row 1 is modified.
    // Row 2 is deleted.
    // Row 3 is added.
    table.Rows[1]["Name"] = "Sydney";
    table.Rows[2].Delete();
    DataRow row = table.NewRow();
    row["ID"] = 3;
    row["Name"] = "Melony";
    table.Rows.Add(row);

    // Note that the code doesn't call
    // table.AcceptChanges()
    return table;
}

static void HandleRowChanging(object sender, DataRowChangeEventArgs e)
{
    Console.WriteLine(
        "RowChanging event: ID = {0}, action = {1}", e.Row["ID"], 
        e.Action);
}
Sub Main()
  Dim table As New DataTable()

  ' This example examines a number of scenarios involving the 
  ' DataTable.Load method.
  Console.WriteLine("Load a DataTable and infer its schema:")

  ' Retrieve a data reader, based on the Customers data. In
  ' an application, this data might be coming from a middle-tier
  ' business object:
  Dim reader As New DataTableReader(GetCustomers())

  ' The table has no schema. The Load method will infer the 
  ' schema from the IDataReader:
  table.Load(reader)
  PrintColumns(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine("Load a DataTable from an incompatible IDataReader:")

  ' Create a table with a single integer column. Attempt
  ' to load data from a reader with a schema that is 
  ' incompatible. Note the exception, determined
  ' by the particular incompatibility:
  table = GetIntegerTable()
  reader = New DataTableReader(GetStringTable())
  Try
    table.Load(reader)
  Catch ex As Exception
    Console.WriteLine(ex.GetType.Name & ":" & ex.Message())
  End Try

  Console.WriteLine(" ============================= ")
  Console.WriteLine( _
      "Load a DataTable with an IDataReader that has extra columns:")

  ' Note that loading a reader with extra columns adds
  ' the columns to the existing table, if possible:
  table = GetIntegerTable()
  reader = New DataTableReader(GetCustomers())
  table.Load(reader)
  PrintColumns(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine( _
      "Load a DataTable with an IDataReader that has missing columns:")

  ' Note that loading a reader with missing columns causes 
  ' the columns to be filled with null data, if possible:
  table = GetCustomers()
  reader = New DataTableReader(GetIntegerTable())
  table.Load(reader)
  PrintColumns(table)

  ' Demonstrate the various possibilites when loading data into
  ' a DataTable that already contains data.
  Console.WriteLine(" ============================= ")
  Console.WriteLine("Demonstrate data considerations:")
  Console.WriteLine("Current value, Original value, (RowState)")
  Console.WriteLine(" ============================= ")
  Console.WriteLine("Original table:")

  table = SetupModifiedRows()
  DisplayRowState(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine("Data in IDataReader to be loaded:")
  DisplayRowState(GetChangedCustomers())

  PerformDemo(LoadOption.OverwriteChanges)
  PerformDemo(LoadOption.PreserveChanges)
  PerformDemo(LoadOption.Upsert)

  Console.WriteLine("Press any key to continue.")
  Console.ReadKey()
End Sub

Private Sub DisplayRowState(ByVal table As DataTable)
  For i As Integer = 0 To table.Rows.Count - 1
    Dim current As Object = "--"
    Dim original As Object = "--"
    Dim rowState As DataRowState = table.Rows(i).RowState

    ' Attempt to retrieve the current value, which doesn't exist
    ' for deleted rows:
    If rowState <> DataRowState.Deleted Then
      current = table.Rows(i)("Name", DataRowVersion.Current)
    End If

    ' Attempt to retrieve the original value, which doesn't exist
    ' for added rows:
    If rowState <> DataRowState.Added Then
      original = table.Rows(i)("Name", DataRowVersion.Original)
    End If
    Console.WriteLine("{0}: {1}, {2} ({3})", i, current, original, rowState)
  Next
End Sub

Private Function GetChangedCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {0, "XXX"})
  table.Rows.Add(New Object() {1, "XXX"})
  table.Rows.Add(New Object() {2, "XXX"})
  table.Rows.Add(New Object() {3, "XXX"})
  table.Rows.Add(New Object() {4, "XXX"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {0, "Mary"})
  table.Rows.Add(New Object() {1, "Andy"})
  table.Rows.Add(New Object() {2, "Peter"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {4})
  table.Rows.Add(New Object() {5})
  table.AcceptChanges()
  Return table
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {"Mary"})
  table.Rows.Add(New Object() {"Andy"})
  table.Rows.Add(New Object() {"Peter"})
  table.AcceptChanges()
  Return table
End Function

Private Sub PerformDemo(ByVal optionForLoad As LoadOption)

  ' Load data into a DataTable, retrieve a DataTableReader containing
  ' different data, and call the Load method. Depending on the
  ' LoadOption value passed as a parameter, this procedure displays
  ' different results in the DataTable.
  Console.WriteLine(" ============================= ")
  Console.WriteLine("table.Load(reader, {0})", optionForLoad)
  Console.WriteLine(" ============================= ")

  Dim table As DataTable = SetupModifiedRows()
  Dim reader As New DataTableReader(GetChangedCustomers())
  AddHandler table.RowChanging, New _
      DataRowChangeEventHandler(AddressOf HandleRowChanging)

  table.Load(reader, optionForLoad)
  Console.WriteLine()
  DisplayRowState(table)
End Sub

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

Private Function SetupModifiedRows() As DataTable
  ' Fill a DataTable with customer info, and 
  ' then modify, delete, and add rows.

  Dim table As DataTable = GetCustomers()
  ' Row 0 is unmodified.
  ' Row 1 is modified.
  ' Row 2 is deleted.
  ' Row 3 is added.
  table.Rows(1)("Name") = "Sydney"
  table.Rows(2).Delete()
  Dim row As DataRow = table.NewRow
  row("ID") = 3
  row("Name") = "Melony"
  table.Rows.Add(row)

  ' Note that the code doesn't call
  ' table.AcceptChanges()
  Return table
End Function

Private Sub HandleRowChanging(ByVal sender As Object, _
  ByVal e As System.Data.DataRowChangeEventArgs)
  Console.WriteLine( _
      "RowChanging event: ID = {0}, action = {1}", e.Row("ID"), _
      e.Action)
End Sub

설명

Load 몇 가지 일반적인 시나리오는 지정 된 데이터 원본에서 데이터 가져오기 및 현재 데이터 컨테이너에 추가에서 메서드를 사용할 수 있습니다 (이 경우에 DataTable).The Load method can be used in several common scenarios, all centered around getting data from a specified data source and adding it to the current data container (in this case, a DataTable). 에 대 한 일반 사용법을 설명 하는 이러한 시나리오는 DataTable, 해당 업데이트를 설명 하 고 병합 동작입니다.These scenarios describe standard usage for a DataTable, describing its update and merge behavior.

DataTable 동기화 하거나 단일 기본 데이터 원본을 업데이트 합니다.A DataTable synchronizes or updates with a single primary data source. DataTable 기본 데이터 소스와 동기화 할 수 있도록 변경 내용을 추적 합니다.The DataTable tracks changes, allowing synchronization with the primary data source. 또한는 DataTable 하나 이상의 보조 데이터 원본의 증분 데이터를 허용할 수 있습니다.In addition, a DataTable can accept incremental data from one or more secondary data sources. DataTable 보조 데이터 원본과 동기화를 허용 하기 위해 변경 내용 추적에 대 한 책임을 지지 않습니다.The DataTable isn't responsible for tracking changes in order to allow synchronization with the secondary data source.

이러한 두 가상 데이터 원본 지정 되 면 사용자가 다음 동작 중 하나 필요로 할:Given these two hypothetical data sources, a user is likely to require one of the following behaviors:

  • 초기화 DataTable 주 데이터 원본에서 합니다.Initialize DataTable from a primary data source. 이 시나리오에서는 사용자가 빈 초기화 DataTable 주 데이터 원본에서 값을 사용 하 여 합니다.In this scenario, the user wants to initialize an empty DataTable with values from the primary data source. 사용자는 나중에 다시 기본 데이터 소스에 변경 내용을 전파 하는입니다.Later the user intends to propagate changes back to the primary data source.

  • 변경 내용을 유지 하 고 기본 데이터 원본에서 다시 동기화 합니다.Preserve changes and re-synchronize from the primary data source. 이 시나리오에서는 사용자가 수행 합니다 DataTable 이전 시나리오에서 입력 하 고 기본 데이터 원본에서 변경 내용을 유지를 사용 하 여 증분 동기화를 수행 합니다 DataTable합니다.In this scenario, the user wants to take the DataTable filled in the previous scenario and perform an incremental synchronization with the primary data source, preserving modifications made in the DataTable.

  • 증분 데이터를 보조 데이터 원본에서 제공 합니다.Incremental data feed from secondary data sources. 이 시나리오에서는 사용자가 하나 이상의 보조 데이터 원본에서 변경 내용을 병합 하 여 이러한 변경 내용을 주 데이터 원본에 다시 전파 합니다.In this scenario, the user wants to merge changes from one or more secondary data sources, and propagate those changes back to the primary data source.

Load 메서드 수 있게 이러한 모든 시나리오입니다.The Load method makes all these scenarios possible. 하나를 제외한 모든 오버 로드 중에이 메서드를 사용 하면 부하 옵션 매개 변수를 지정할 수 있습니다를 나타내는 방법에 있는 행을 DataTable 로드 중인 행과 결합 합니다.All but one of the overloads for this method allows you to specify a load option parameter, indicating how rows already in a DataTable combine with rows being loaded. (오버 로드의 동작을 지정할 수는 기본 로드 옵션을 사용 합니다.) 다음 표에에서 제공 하는 다음 세 가지 로드 옵션은 LoadOption 열거형입니다.(The overload that doesn't allow you to specify the behavior uses the default load option.) The following table describes the three load options provided by the LoadOption enumeration. 각 예에서 설명 들어오는 데이터의 행의 기본 키가 기존 행의 기본 키와 일치 하는 경우 동작을 나타냅니다.In each case, the description indicates the behavior when the primary key of a row in the incoming data matches the primary key of an existing row.

로드 옵션Load Option 설명Description
PreserveChanges(기본값)PreserveChanges (default) 들어오는 행의 값을 사용 하 여 행의 원래 버전을 업데이트합니다.Updates the original version of the row with the value of the incoming row.
OverwriteChanges 들어오는 행의 값을 사용 하 여 행의 현재 버전과 원래 버전을 업데이트합니다.Updates the current and original versions of the row with the value of the incoming row.
Upsert 들어오는 행의 값을 사용 하 여 행의 현재 버전을 업데이트합니다.Updates the current version of the row with the value of the incoming row.

일반적으로 PreserveChanges 하 고 OverwriteChanges 사용자를 동기화 해야 하는 시나리오에 대 한 옵션은는 DataSet 및 기본 데이터 소스를 사용 하 여 해당 변경 합니다.In general, the PreserveChanges and OverwriteChanges options are intended for scenarios in which the user needs to synchronize the DataSet and its changes with the primary data source. Upsert 옵션에 하나 이상의 보조 데이터 원본에서 집계 변경 용이 하 게 합니다.The Upsert option facilitates aggregating changes from one or more secondary data sources.

Load(IDataReader) Load(IDataReader) Load(IDataReader) Load(IDataReader)

제공된 DataTable를 사용해서 IDataReader을 데이터 소스의 값으로 채웁니다.Fills a DataTable with values from a data source using the supplied IDataReader. DataTable에 이미 행이 포함되어 있으면 데이터 소스에서 들어오는 데이터가 기존 행과 병합됩니다.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows.

public:
 void Load(System::Data::IDataReader ^ reader);
public void Load (System.Data.IDataReader reader);
member this.Load : System.Data.IDataReader -> unit
Public Sub Load (reader As IDataReader)

매개 변수

reader
IDataReader IDataReader IDataReader IDataReader

결과 집합을 제공하는 IDataReader입니다.An IDataReader that provides a result set.

예제

다음 예제에서는 다양 한 호출을 사용 하 여 관련 된 문제는 Load 메서드.The following example demonstrates several of the issues involved with calling the Load method. 예제에서 로드 된 스키마를 유추 등의 스키마 문제에 집중 하는 먼저 IDataReader, 및 다음 호환 되지 않는 스키마 및 열이 누락 되거나 추가 된 스키마를 처리 합니다.First, the example focuses on schema issues, including inferring a schema from the loaded IDataReader, and then handling incompatible schemas, and schemas with missing or additional columns. 호출 예제는 Load 메서드를 로드 작업 전후에 데이터를 표시 합니다.The example then calls the Load method, displaying the data both before and after the load operation.

static void Main()
{
    // This example examines a number of scenarios involving the 
    // DataTable.Load method.
    Console.WriteLine("Load a DataTable and infer its schema:");

    // The table has no schema. The Load method will infer the 
    // schema from the IDataReader:
    DataTable table = new DataTable();

    // Retrieve a data reader, based on the Customers data. In
    // an application, this data might be coming from a middle-tier
    // business object:
    DataTableReader reader = new DataTableReader(GetCustomers());

    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable from an incompatible IDataReader:");

    // Create a table with a single integer column. Attempt
    // to load data from a reader with a schema that is 
    // incompatible. Note the exception, determined
    // by the particular incompatibility:
    table = GetIntegerTable();
    reader = new DataTableReader(GetStringTable());
    try 
    {
        table.Load(reader);
    } 
    catch (Exception ex) 
    { 
        Console.WriteLine(ex.GetType().Name + ":" + ex.Message);
    }

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has extra columns:");

    // Note that loading a reader with extra columns adds
    // the columns to the existing table, if possible:
    table = GetIntegerTable();
    reader = new DataTableReader(GetCustomers());
    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has missing columns:");

    // Note that loading a reader with missing columns causes 
    // the columns to be filled with null data, if possible:
    table = GetCustomers();
    reader = new DataTableReader(GetIntegerTable());
    table.Load(reader);
    PrintColumns(table);

    // Demonstrate the various possibilites when loading data 
    // into a DataTable that already contains data.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Demonstrate data considerations:");
    Console.WriteLine("Current value, Original value, (RowState)");
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Original table:");

    table = SetupModifiedRows();
    DisplayRowState(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine("Data in IDataReader to be loaded:");
    DisplayRowState(GetChangedCustomers());

    // Load data into a DataTable, retrieve a DataTableReader 
    // containing different data, and call the Load method. 
    Console.WriteLine(" ============================= ");
    Console.WriteLine("table.Load(reader)");
    Console.WriteLine(" ============================= ");

    table = SetupModifiedRows();
    reader = new DataTableReader(GetChangedCustomers());
    table.Load(reader);
    DisplayRowState(table);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
}

private static void DisplayRowState(DataTable table)
{
    for (int i = 0; i <= table.Rows.Count - 1; i++)
    {
        object current = "--";
        object original = "--";
        DataRowState rowState = table.Rows[i].RowState;

        // Attempt to retrieve the current value, which doesn't exist
        // for deleted rows:
        if (rowState != DataRowState.Deleted)
        {
            current = table.Rows[i]["Name", DataRowVersion.Current];
        }

        // Attempt to retrieve the original value, which doesn't exist
        // for added rows:
        if (rowState != DataRowState.Added)
        {
            original = table.Rows[i]["Name", DataRowVersion.Original];
        }
        Console.WriteLine("{0}: {1}, {2} ({3})", i, 
            current, original, rowState);
    }
}

private static DataTable GetChangedCustomers()
{
    // Create sample Customers table.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", 
        typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 1, "XXX" });
    table.Rows.Add(new object[] { 2, "XXX" });
    table.Rows.Add(new object[] { 3, "XXX" });
    table.Rows.Add(new object[] { 4, "XXX" });
    table.Rows.Add(new object[] { 5, "XXX" });
    table.Rows.Add(new object[] { 6, "XXX" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetCustomers()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", 
        typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 1, "Mary" });
    table.Rows.Add(new object[] { 2, "Andy" });
    table.Rows.Add(new object[] { 3, "Peter" });
    table.Rows.Add(new object[] { 4, "Russ" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetIntegerTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", 
        typeof(int));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 5 });
    table.Rows.Add(new object[] { 6 });
    table.Rows.Add(new object[] { 7 });
    table.Rows.Add(new object[] { 8 });
    table.AcceptChanges();
    return table;
}

private static DataTable GetStringTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", 
        typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { "Mary" });
    table.Rows.Add(new object[] { "Andy" });
    table.Rows.Add(new object[] { "Peter" });
    table.Rows.Add(new object[] { "Russ" });
    table.AcceptChanges();
    return table;
}

private static void PrintColumns(DataTable table)
{
    // Loop through all the rows in the DataTableReader
    foreach (DataRow row in table.Rows)
    {
        for (int i = 0; i < table.Columns.Count; i++)
        {
            Console.Write(row[i] + " ");
        }
        Console.WriteLine();
    }
}

private static DataTable SetupModifiedRows()
{
    // Fill a DataTable with customer info, and 
    // then modify, delete, and add rows.

    DataTable table = GetCustomers();
    // Row 0 is unmodified.
    // Row 1 is modified.
    // Row 2 is deleted.
    // Row 5 is added.
    table.Rows[1]["Name"] = "Sydney";
    table.Rows[2].Delete();
    DataRow row = table.NewRow();
    row["ID"] = 5;
    row["Name"] = "Melony";
    table.Rows.Add(row);

    // Note that the code doesn't call
    // table.AcceptChanges()
    return table;
}
Sub Main()
  ' This example examines a number of scenarios involving the 
  ' DataTable.Load method.
  Console.WriteLine("Load a DataTable and infer its schema:")

  ' The table has no schema. The Load method will infer the 
  ' schema from the IDataReader:
  Dim table As New DataTable()

  ' Retrieve a data reader, based on the Customers data. In
  ' an application, this data might be coming from a middle-tier
  ' business object:
  Dim reader As New DataTableReader(GetCustomers())

  table.Load(reader)
  PrintColumns(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine( _
      "Load a DataTable from an incompatible IDataReader:")

  ' Create a table with a single integer column. Attempt
  ' to load data from a reader with a schema that is 
  ' incompatible. Note the exception, determined
  ' by the particular incompatibility:
  table = GetIntegerTable()
  reader = New DataTableReader(GetStringTable())
  Try
    table.Load(reader)
  Catch ex As Exception
    Console.WriteLine(ex.GetType.Name & ":" & ex.Message())
  End Try

  Console.WriteLine(" ============================= ")
  Console.WriteLine( _
      "Load a DataTable with an IDataReader that has extra columns:")

  ' Note that loading a reader with extra columns adds
  ' the columns to the existing table, if possible:
  table = GetIntegerTable()
  reader = New DataTableReader(GetCustomers())
  table.Load(reader)
  PrintColumns(table)

  Console.WriteLine(" ============================= ")
      Console.WriteLine( _
          "Load a DataTable with an IDataReader that has missing columns:")

  ' Note that loading a reader with missing columns causes 
  ' the columns to be filled with null data, if possible:
  table = GetCustomers()
  reader = New DataTableReader(GetIntegerTable())
  table.Load(reader)
  PrintColumns(table)

  ' Demonstrate the various possibilites when loading data into
  ' a DataTable that already contains data.
  Console.WriteLine(" ============================= ")
  Console.WriteLine("Demonstrate data considerations:")
  Console.WriteLine("Current value, Original value, (RowState)")
  Console.WriteLine(" ============================= ")
  Console.WriteLine("Original table:")

  table = SetupModifiedRows()
  DisplayRowState(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine("Data in IDataReader to be loaded:")
  DisplayRowState(GetChangedCustomers())

  ' Load data into a DataTable, retrieve a DataTableReader 
  ' containing different data, and call the Load method. 
  Console.WriteLine(" ============================= ")
  Console.WriteLine("table.Load(reader)")
  Console.WriteLine(" ============================= ")

  table = SetupModifiedRows()
  reader = New DataTableReader(GetChangedCustomers())
  table.Load(reader)
  DisplayRowState(table)

  Console.WriteLine("Press any key to continue.")
  Console.ReadKey()
End Sub

Private Sub DisplayRowState(ByVal table As DataTable)
  For i As Integer = 0 To table.Rows.Count - 1
    Dim current As Object = "--"
    Dim original As Object = "--"
    Dim rowState As DataRowState = table.Rows(i).RowState

    ' Attempt to retrieve the current value, which doesn't exist
    ' for deleted rows:
    If rowState <> DataRowState.Deleted Then
      current = table.Rows(i)("Name", DataRowVersion.Current)
    End If

    ' Attempt to retrieve the original value, which doesn't exist
    ' for added rows:
    If rowState <> DataRowState.Added Then
      original = table.Rows(i)("Name", DataRowVersion.Original)
    End If
    Console.WriteLine("{0}: {1}, {2} ({3})", i, _
      current, original, rowState)
  Next
End Sub

Private Function GetChangedCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {1, "XXX"})
  table.Rows.Add(New Object() {2, "XXX"})
  table.Rows.Add(New Object() {3, "XXX"})
  table.Rows.Add(New Object() {4, "XXX"})
  table.Rows.Add(New Object() {5, "XXX"})
  table.Rows.Add(New Object() {6, "XXX"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {1, "Mary"})
  table.Rows.Add(New Object() {2, "Andy"})
  table.Rows.Add(New Object() {3, "Peter"})
  table.Rows.Add(New Object() {4, "Russ"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {5})
  table.Rows.Add(New Object() {6})
  table.Rows.Add(New Object() {7})
  table.Rows.Add(New Object() {8})
  table.AcceptChanges()
  Return table
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {"Mary"})
  table.Rows.Add(New Object() {"Andy"})
  table.Rows.Add(New Object() {"Peter"})
  table.Rows.Add(New Object() {"Russ"})
  table.AcceptChanges()
  Return table
End Function

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

Private Function SetupModifiedRows() As DataTable
  ' Fill a DataTable with customer info, and 
  ' then modify, delete, and add rows.

  Dim table As DataTable = GetCustomers()
  ' Row 0 is unmodified.
  ' Row 1 is modified.
  ' Row 2 is deleted.
  ' Row 5 is added.
  table.Rows(1)("Name") = "Sydney"
  table.Rows(2).Delete()
  Dim row As DataRow = table.NewRow
  row("ID") = 5
  row("Name") = "Melony"
  table.Rows.Add(row)

  ' Note that the code doesn't call
  ' table.AcceptChanges()
  Return table
End Function

설명

합니다 Load 첫 번째 결과 집합의 로드를 사용 하는 메서드 IDataReader를 성공적으로 완료 한 후 설정 판독기의 위치를 다음 결과 집합에 있는 경우.The Load method consumes the first result set from the loaded IDataReader, and after successful completion, sets the reader's position to the next result set, if any. 데이터를 변환 하는 경우는 Load 와 같은 변환 규칙을 사용 하는 메서드를 DbDataAdapter.Fill 메서드.When converting data, the Load method uses the same conversion rules as the DbDataAdapter.Fill method.

합니다 Load 메서드를 고려해 야 합니다 세 가지 특정 문제에서 데이터를 로드 하는 경우는 IDataReader 인스턴스: 스키마, 데이터 및 이벤트 작업 합니다.The Load method must take into account three specific issues when loading the data from an IDataReader instance: schema, data, and event operations. 스키마를 사용 하 여 작업 하는 경우는 Load 메서드는 다음 표에 설명 된 대로 조건이 발생할 수 있습니다.When working with the schema, the Load method may encounter conditions as described in the following table. 스키마 작업 수행도 포함 하는 데이터가 없는 모든 가져온된 결과 집합에 대 한 합니다.The schema operations take place for all imported result sets, even those containing no data.

조건Condition 동작Behavior
DataTable 에 스키마가 없는 합니다.The DataTable has no schema. 합니다 Load 메서드는 가져온에서 결과 집합에 따라 스키마를 유추 IDataReader합니다.The Load method infers the schema based on the result set from the imported IDataReader.
DataTable 스키마를 갖지만 로드 된 스키마와 호환 되지 않습니다.The DataTable has a schema, but it is incompatible with the loaded schema. Load 메서드 호환 되지 않는 스키마로 데이터를 로드 하려고 할 때 발생 하는 특정 오류에 해당 하는 예외를 throw 합니다.The Load method throws an exception corresponding to the particular error that occurs when attempting to load data into the incompatible schema.
스키마가 호환 되지만 로드 된 결과 집합 스키마에 존재 하지 않는 열이 포함 된 DataTable합니다.The schemas are compatible, but the loaded result set schema contains columns that do not exist in the DataTable. 합니다 Load 추가 열을 추가 하는 메서드 DataTable의 스키마입니다.The Load method adds the extra columns to DataTable's schema. 메서드는 해당 하는 경우 예외를 throw에서 열을 DataTable 로드 된 결과 집합 값이 서로 호환 되지 합니다.The method throws an exception if corresponding columns in the DataTable and the loaded result set are not value compatible. 또한 메서드는 결과 집합에 추가 된 모든 열에서에서 제약 조건 정보를 검색 합니다.The method also retrieves constraint information from the result set for all added columns. Primary Key 제약 조건의 경우를 제외 하 고이 제약 조건 정보는 경우에 현재 DataTable 로드 작업의 시작 부분에 열이 포함 되지 않습니다.Except for the case of Primary Key constraint, this constraint information is used only if the current DataTable does not contain any columns at the start of the load operation.
스키마가 호환 되지만 보다 적은 개수의 열을 포함 하는 로드 된 결과 집합 스키마에는 DataTable합니다.The schemas are compatible, but the loaded result set schema contains fewer columns than does the DataTable. 누락 된 열에 기본값이 정의 또는 열의 데이터 형식이 null을 허용 하는 경우는 Load 메서드를 사용 하면 행에 추가 하려면 기본 대체 또는 null 는 누락 된 열에 대 한 값입니다.If a missing column has a default value defined or the column's data type is nullable, the Load method allows the rows to be added, substituting the default or null value for the missing column. 경우 기본값은 없습니다 또는 null 사용할 수는 Load 메서드에서 예외가 throw 됩니다.If no default value or null can be used, then the Load method throws an exception. 특정 기본 값을 제공 하는 경우는 Load 메서드는 null 암시 된 기본값으로 값입니다.If no specific default value has been supplied, the Load method uses the null value as the implied default value.

동작을 고려 하기 전에 합니다 Load 데이터 작업을 기준으로 메서드는 것이 좋습니다 각 내에서 행을 DataTable 현재 값과 각 열에 대 한 원래 값을 유지 관리 합니다.Before considering the behavior of the Load method in terms of data operations, consider that each row within a DataTable maintains both the current value and the original value for each column. 이러한 값 같을 수도 있지만, 또는 행의 데이터를 채운 이후에 변경 된 경우에 다를 수 여 DataTable.These values may be equivalent, or may be different if the data in the row has been changed since filling the DataTable. 자세한 내용은 행 상태 및 행 버전합니다.For more information, see Row States and Row Versions.

이 버전의는 Load 메서드는 원래 값을 그대로 두고 각 행의 현재 값을 유지 하려고 합니다.This version of the Load method attempts to preserve the current values in each row, leaving the original value intact. (들어오는 데이터의 동작을 보다 세부적으로 제어를 원한다 면 참조 DataTable.Load.) 기존 행과 들어오는 행에 해당 기본 키 값이 없으면 행의 현재 행 상태 값을 사용 하 여 처리 됩니다, 그리고 그렇지 않으면 새 행으로 처리 됩니다.(If you want finer control over the behavior of incoming data, see DataTable.Load.) If the existing row and the incoming row contain corresponding primary key values, the row is processed using its current row state value, otherwise it's treated as a new row.

이벤트 작업의 경우는 RowChanging 각 행이 변경 되기 전에 이벤트가 발생 하며 RowChanged 이벤트는 각 행이 변경 된 후 발생 합니다.In terms of event operations, the RowChanging event occurs before each row is changed, and the RowChanged event occurs after each row has been changed. 각각의 경우에서는 Action 속성의는 DataRowChangeEventArgs 이벤트 처리기에 전달 된 인스턴스가 이벤트와 연결 된 특정 작업에 대 한 정보를 포함 합니다.In each case, the Action property of the DataRowChangeEventArgs instance passed to the event handler contains information about the particular action associated with the event. 동작 값이 로드 작업 앞에 있는 행의 상태에 따라 달라 집니다.This action value depends on the state of the row before the load operation. 각각의 경우에서 두 이벤트가 발생 하 고 작업을 각각에 대해 동일 합니다.In each case, both events occur, and the action is the same for each. 작업은 각 행의 현재 또는 원래 버전 또는 현재 행 상태에 따라 둘 다에 적용할 수 있습니다.The action may be applied to either the current or original version of each row, or both, depending on the current row state.

다음 표에서 동작을 보여 줍니다는 Load 메서드.The following table displays behavior for the Load method. ("(없음)" 라는) 마지막 행을 기존 행과 일치 하지 않는 들어오는 행에 대 한 동작을 설명 합니다.The final row (labeled "(Not present)") describes the behavior for incoming rows that don't match any existing row. 이 테이블의 각 셀과 함께 행의 필드에 대 한 현재 및 원래 값을 설명 합니다는 DataRowState 후의 값에 대 한는 Load 메서드가 완료 합니다.Each cell in this table describes the current and original value for a field within a row, along with the DataRowState for the value after the Load method has completed. 메서드 로드 옵션을 지정할 수 없습니다 및 기본값을 사용 하 여이 예제의 경우 PreserveChanges합니다.In this case, the method doesn't allow you to indicate the load option, and uses the default, PreserveChanges.

기존 DataRowStateExisting DataRowState Load 메서드 및 이벤트 작업Values after Load method, and event action
추가됨Added 현재 = <기존 >Current = <Existing>

원래 = <들어오는 >Original = <Incoming>

상태 = <수정 >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
수정한 날짜Modified 현재 = <기존 >Current = <Existing>

원래 = <들어오는 >Original = <Incoming>

상태 = <수정 >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
삭제됨Deleted 현재 = <없음 >Current = <Not available>

원래 = <들어오는 >Original = <Incoming>

상태 = <삭제 >State = <Deleted>

RowAction = ChangeOriginalRowAction = ChangeOriginal
UnchangedUnchanged 현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
(없음)(Not present) 현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal

값을 DataColumn 와 같은 속성을 사용 하 여 제한할 수 있습니다 ReadOnlyAutoIncrement입니다.Values in a DataColumn can be constrained through use of properties such as ReadOnly and AutoIncrement. Load 메서드 열의 속성에 의해 정의 된 동작을 사용 하 여 일치 하는 방식으로 해당 열을 처리 합니다.The Load method handles such columns in a manner that is consistent with the behavior defined by the column's properties. 읽기 전용 제약을 DataColumn 메모리에서 발생 하는 변경에만 적용 됩니다.The read only constraint on a DataColumn is applicable only for changes that occur in memory. Load 메서드는 필요한 경우 읽기 전용으로 열 값을 덮어씁니다.The Load method's overwrites the read-only column values, if needed.

현재 행과 들어오는 행을 비교 하는 데 사용 하 여 기본 키 필드의 버전을 확인 하는 Load 메서드 존재 하는 경우 행의 기본 키 값의 원래 버전을 사용 합니다.To determine which version of the primary key field to use for comparing the current row with an incoming row, the Load method uses the original version of the primary key value within a row, if it exists. 이 고, 그렇지는 Load 메서드는 기본 키 필드의 현재 버전을 사용 합니다.Otherwise, the Load method uses the current version of the primary key field.

추가 정보

Load(IDataReader, LoadOption) Load(IDataReader, LoadOption) Load(IDataReader, LoadOption)

제공된 DataTable를 사용해서 IDataReader을 데이터 소스의 값으로 채웁니다.Fills a DataTable with values from a data source using the supplied IDataReader. DataTable에 이미 행이 포함되어 있으면 데이터 소스에서 들어오는 데이터는 loadOption 매개 변수의 값에 따라 기존 행과 병합됩니다.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the loadOption parameter.

public:
 void Load(System::Data::IDataReader ^ reader, System::Data::LoadOption loadOption);
public void Load (System.Data.IDataReader reader, System.Data.LoadOption loadOption);
member this.Load : System.Data.IDataReader * System.Data.LoadOption -> unit

매개 변수

reader
IDataReader IDataReader IDataReader IDataReader

하나 이상의 결과 집합을 제공하는 IDataReader입니다.An IDataReader that provides one or more result sets.

loadOption
LoadOption LoadOption LoadOption LoadOption

LoadOption 열거형의 값으로서, 이미 DataTable에 있는 행이 동일한 기본 키를 공유하는 들어오는 행과 결합되는 방식을 나타냅니다.A value from the LoadOption enumeration that indicates how rows already in the DataTable are combined with incoming rows that share the same primary key.

예제

다음 예제에서는 다양 한 호출을 사용 하 여 관련 된 문제는 Load 메서드.The following example demonstrates several of the issues involved with calling the Load method. 예제에서 로드 된 스키마를 유추 등의 스키마 문제에 집중 하는 먼저 IDataReader, 및 다음 호환 되지 않는 스키마 및 열이 누락 되거나 추가 된 스키마를 처리 합니다.First, the example focuses on schema issues, including inferring a schema from the loaded IDataReader, and then handling incompatible schemas, and schemas with missing or additional columns. 이 예제에서는 다음 데이터 문제를 포함 하 여 다양 한 로드 옵션에 중점을 둡니다.The example then focuses on data issues, including handling the various loading options.

static void Main()
{
    // This example examines a number of scenarios involving the 
    // DataTable.Load method.
    Console.WriteLine("Load a DataTable and infer its schema:");

    // The table has no schema. The Load method will infer the 
    // schema from the IDataReader:
    DataTable table = new DataTable();

    // Retrieve a data reader, based on the Customers data. In
    // an application, this data might be coming from a middle-tier
    // business object:
    DataTableReader reader = new DataTableReader(GetCustomers());

    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable from an incompatible IDataReader:");

    // Create a table with a single integer column. Attempt
    // to load data from a reader with a schema that is 
    // incompatible. Note the exception, determined
    // by the particular incompatibility:
    table = GetIntegerTable();
    reader = new DataTableReader(GetStringTable());
    try
    {
        table.Load(reader);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.GetType().Name + ":" + ex.Message);
    }

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has extra columns:");

    // Note that loading a reader with extra columns adds
    // the columns to the existing table, if possible:
    table = GetIntegerTable();
    reader = new DataTableReader(GetCustomers());
    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has missing columns:");

    // Note that loading a reader with missing columns causes 
    // the columns to be filled with null data, if possible:
    table = GetCustomers();
    reader = new DataTableReader(GetIntegerTable());
    table.Load(reader);
    PrintColumns(table);

    // Demonstrate the various possibilites when loading data into
    // a DataTable that already contains data.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Demonstrate data considerations:");
    Console.WriteLine("Current value, Original value, (RowState)");
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Original table:");

    table = SetupModifiedRows();
    DisplayRowState(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine("Data in IDataReader to be loaded:");
    DisplayRowState(GetChangedCustomers());

    PerformDemo(LoadOption.OverwriteChanges);
    PerformDemo(LoadOption.PreserveChanges);
    PerformDemo(LoadOption.Upsert);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
}

private static void DisplayRowState(DataTable table)
{
    for (int i = 0; i <= table.Rows.Count - 1; i++)
    {
        object current = "--";
        object original = "--";
        DataRowState rowState = table.Rows[i].RowState;

        // Attempt to retrieve the current value, which doesn't exist
        // for deleted rows:
        if (rowState != DataRowState.Deleted)
        {
            current = table.Rows[i]["Name", DataRowVersion.Current];
        }

        // Attempt to retrieve the original value, which doesn't exist
        // for added rows:
        if (rowState != DataRowState.Added)
        {
            original = table.Rows[i]["Name", DataRowVersion.Original];
        }
        Console.WriteLine("{0}: {1}, {2} ({3})", i, 
            current, original, rowState);
    }
}

private static DataTable GetChangedCustomers()
{
    // Create sample Customers table.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 0, "XXX" });
    table.Rows.Add(new object[] { 1, "XXX" });
    table.Rows.Add(new object[] { 2, "XXX" });
    table.Rows.Add(new object[] { 3, "XXX" });
    table.Rows.Add(new object[] { 4, "XXX" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetCustomers()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 0, "Mary" });
    table.Rows.Add(new object[] { 1, "Andy" });
    table.Rows.Add(new object[] { 2, "Peter" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetIntegerTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 4 });
    table.Rows.Add(new object[] { 5 });
    table.AcceptChanges();
    return table;
}

private static DataTable GetStringTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { "Mary" });
    table.Rows.Add(new object[] { "Andy" });
    table.Rows.Add(new object[] { "Peter" });
    table.AcceptChanges();
    return table;
}

private static void PerformDemo(LoadOption optionForLoad)
{

    // Load data into a DataTable, retrieve a DataTableReader containing
    // different data, and call the Load method. Depending on the
    // LoadOption value passed as a parameter, this procedure displays
    // different results in the DataTable.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("table.Load(reader, {0})", optionForLoad);
    Console.WriteLine(" ============================= ");

    DataTable table = SetupModifiedRows();
    DataTableReader reader = new DataTableReader(GetChangedCustomers());
    table.RowChanging +=new DataRowChangeEventHandler(HandleRowChanging);

    table.Load(reader, optionForLoad);
    Console.WriteLine();
    DisplayRowState(table);
}

private static void PrintColumns(DataTable table)
{
    // Loop through all the rows in the DataTableReader
    foreach (DataRow row in table.Rows)
    {
        for (int i = 0; i < table.Columns.Count; i++)
        {
            Console.Write(row[i] + " ");
        }
        Console.WriteLine();
    }
}

private static DataTable SetupModifiedRows()
{
    // Fill a DataTable with customer info, and 
    // then modify, delete, and add rows.

    DataTable table = GetCustomers();
    // Row 0 is unmodified.
    // Row 1 is modified.
    // Row 2 is deleted.
    // Row 3 is added.
    table.Rows[1]["Name"] = "Sydney";
    table.Rows[2].Delete();
    DataRow row = table.NewRow();
    row["ID"] = 3;
    row["Name"] = "Melony";
    table.Rows.Add(row);

    // Note that the code doesn't call
    // table.AcceptChanges()
    return table;
}

static void HandleRowChanging(object sender, DataRowChangeEventArgs e)
{
    Console.WriteLine(
        "RowChanging event: ID = {0}, action = {1}", e.Row["ID"], e.Action);
}
Sub Main()
  Dim table As New DataTable()

  ' This example examines a number of scenarios involving the
  '  DataTable.Load method.
  Console.WriteLine("Load a DataTable and infer its schema:")

  ' Retrieve a data reader, based on the Customers data. In
  ' an application, this data might be coming from a middle-tier
  ' business object:
  Dim reader As New DataTableReader(GetCustomers())

  ' The table has no schema. The Load method will infer the 
  ' schema from the IDataReader:
  table.Load(reader)
  PrintColumns(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine( _
      "Load a DataTable from an incompatible IDataReader:")

  ' Create a table with a single integer column. Attempt
  ' to load data from a reader with a schema that is 
  ' incompatible. Note the exception, determined
  ' by the particular incompatibility:
  table = GetIntegerTable()
  reader = New DataTableReader(GetStringTable())
  Try
    table.Load(reader)
  Catch ex As Exception
    Console.WriteLine(ex.GetType.Name & ":" & ex.Message())
  End Try

  Console.WriteLine(" ============================= ")
  Console.WriteLine( _
      "Load a DataTable with an IDataReader that has extra columns:")

  ' Note that loading a reader with extra columns adds
  ' the columns to the existing table, if possible:
  table = GetIntegerTable()
  reader = New DataTableReader(GetCustomers())
  table.Load(reader)
  PrintColumns(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine( _
      "Load a DataTable with an IDataReader that has missing columns:")

  ' Note that loading a reader with missing columns causes 
  ' the columns to be filled with null data, if possible:
  table = GetCustomers()
  reader = New DataTableReader(GetIntegerTable())
  table.Load(reader)
  PrintColumns(table)

  ' Demonstrate the various possibilites when loading data into
  ' a DataTable that already contains data.
  Console.WriteLine(" ============================= ")
  Console.WriteLine("Demonstrate data considerations:")
  Console.WriteLine("Current value, Original value, (RowState)")
  Console.WriteLine(" ============================= ")
  Console.WriteLine("Original table:")

  table = SetupModifiedRows()
  DisplayRowState(table)

  Console.WriteLine(" ============================= ")
  Console.WriteLine("Data in IDataReader to be loaded:")
  DisplayRowState(GetChangedCustomers())

  PerformDemo(LoadOption.OverwriteChanges)
  PerformDemo(LoadOption.PreserveChanges)
  PerformDemo(LoadOption.Upsert)

  Console.WriteLine("Press any key to continue.")
  Console.ReadKey()
End Sub

Private Sub DisplayRowState(ByVal table As DataTable)
  For i As Integer = 0 To table.Rows.Count - 1
    Dim current As Object = "--"
    Dim original As Object = "--"
    Dim rowState As DataRowState = table.Rows(i).RowState

    ' Attempt to retrieve the current value, which doesn't exist
    ' for deleted rows:
    If rowState <> DataRowState.Deleted Then
      current = table.Rows(i)("Name", DataRowVersion.Current)
    End If

    ' Attempt to retrieve the original value, which doesn't exist
    ' for added rows:
    If rowState <> DataRowState.Added Then
      original = table.Rows(i)("Name", DataRowVersion.Original)
    End If
    Console.WriteLine("{0}: {1}, {2} ({3})", i, _
      current, original, rowState)
  Next
End Sub

Private Function GetChangedCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {0, "XXX"})
  table.Rows.Add(New Object() {1, "XXX"})
  table.Rows.Add(New Object() {2, "XXX"})
  table.Rows.Add(New Object() {3, "XXX"})
  table.Rows.Add(New Object() {4, "XXX"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {0, "Mary"})
  table.Rows.Add(New Object() {1, "Andy"})
  table.Rows.Add(New Object() {2, "Peter"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {4})
  table.Rows.Add(New Object() {5})
  table.AcceptChanges()
  Return table
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {"Mary"})
  table.Rows.Add(New Object() {"Andy"})
  table.Rows.Add(New Object() {"Peter"})
  table.AcceptChanges()
  Return table
End Function

Private Sub PerformDemo(ByVal optionForLoad As LoadOption)

  ' Load data into a DataTable, retrieve a DataTableReader containing
  ' different data, and call the Load method. Depending on the
  ' LoadOption value passed as a parameter, this procedure displays
  ' different results in the DataTable.
  Console.WriteLine(" ============================= ")
  Console.WriteLine("table.Load(reader, {0})", optionForLoad)
  Console.WriteLine(" ============================= ")

  Dim table As DataTable = SetupModifiedRows()
  Dim reader As New DataTableReader(GetChangedCustomers())
  AddHandler table.RowChanging, New _
      DataRowChangeEventHandler(AddressOf HandleRowChanging)

  table.Load(reader, optionForLoad)
  Console.WriteLine()
  DisplayRowState(table)
End Sub

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

Private Function SetupModifiedRows() As DataTable
  ' Fill a DataTable with customer info, and 
  ' then modify, delete, and add rows.

  Dim table As DataTable = GetCustomers()
  ' Row 0 is unmodified.
  ' Row 1 is modified.
  ' Row 2 is deleted.
  ' Row 3 is added.
  table.Rows(1)("Name") = "Sydney"
  table.Rows(2).Delete()
  Dim row As DataRow = table.NewRow
  row("ID") = 3
  row("Name") = "Melony"
  table.Rows.Add(row)

  ' Note that the code doesn't call
  ' table.AcceptChanges()
  Return table
End Function

Private Sub HandleRowChanging(ByVal sender As Object, _
      ByVal e As System.Data.DataRowChangeEventArgs)
  Console.WriteLine( _
      "RowChanging event: ID = {0}, action = {1}", e.Row("ID"), e.Action)
End Sub

설명

합니다 Load 첫 번째 결과 집합의 로드를 사용 하는 메서드 IDataReader를 성공적으로 완료 한 후 설정 판독기의 위치를 다음 결과 집합에 있는 경우.The Load method consumes the first result set from the loaded IDataReader, and after successful completion, sets the reader's position to the next result set, if any. 데이터를 변환 하는 경우는 Load 와 같은 변환 규칙을 사용 하는 메서드를 Fill 메서드.When converting data, the Load method uses the same conversion rules as the Fill method.

합니다 Load 메서드를 고려해 야 합니다 세 가지 특정 문제에서 데이터를 로드 하는 경우는 IDataReader 인스턴스: 스키마, 데이터 및 이벤트 작업 합니다.The Load method must take into account three specific issues when loading the data from an IDataReader instance: schema, data, and event operations. 스키마를 사용 하 여 작업 하는 경우는 Load 메서드는 다음 표에 설명 된 대로 조건이 발생할 수 있습니다.When working with the schema, the Load method may encounter conditions as described in the following table. 스키마 작업 수행도 포함 하는 데이터가 없는 모든 가져온된 결과 집합에 대 한 합니다.The schema operations take place for all imported result sets, even those containing no data.

조건Condition 동작Behavior
DataTable 에 스키마가 없는 합니다.The DataTable has no schema. 합니다 Load 메서드는 가져온에서 결과 집합에 따라 스키마를 유추 IDataReader합니다.The Load method infers the schema based on the result set from the imported IDataReader.
DataTable 스키마를 갖지만 로드 된 스키마와 호환 되지 않습니다.The DataTable has a schema, but it is incompatible with the loaded schema. Load 메서드 호환 되지 않는 스키마로 데이터를 로드 하려고 할 때 발생 하는 특정 오류에 해당 하는 예외를 throw 합니다.The Load method throws an exception corresponding to the particular error that occurs when attempting to load data into the incompatible schema.
스키마가 호환 되지만 로드 된 결과 집합 스키마에 존재 하지 않는 열이 포함 된 DataTable합니다.The schemas are compatible, but the loaded result set schema contains columns that don't exist in the DataTable. 합니다 Load 추가 열을 추가 하는 메서드 DataTable의 스키마입니다.The Load method adds the extra columns to DataTable's schema. 메서드는 해당 하는 경우 예외를 throw에서 열을 DataTable 로드 된 결과 집합 값이 서로 호환 되지 합니다.The method throws an exception if corresponding columns in the DataTable and the loaded result set are not value compatible. 또한 메서드는 결과 집합에 추가 된 모든 열에서에서 제약 조건 정보를 검색 합니다.The method also retrieves constraint information from the result set for all added columns. Primary Key 제약 조건의 경우를 제외 하 고이 제약 조건 정보는 경우에 현재 DataTable 로드 작업의 시작 부분에 열이 포함 되지 않습니다.Except for the case of Primary Key constraint, this constraint information is used only if the current DataTable does not contain any columns at the start of the load operation.
스키마가 호환 되지만 보다 적은 개수의 열을 포함 하는 로드 된 결과 집합 스키마에는 DataTable합니다.The schemas are compatible, but the loaded result set schema contains fewer columns than does the DataTable. 누락 된 열에 기본값이 정의 또는 열의 데이터 형식이 null을 허용 하는 경우는 Load 메서드를 사용 하면 행을 추가할 수는 누락 된 열에 대 한 default 또는 null 값을 대체 합니다.If a missing column has a default value defined or the column's data type is nullable, the Load method allows the rows to be added, substituting the default or null value for the missing column. 기본값 또는 null 없습니다 사용할 수 있습니다 하는 경우 해당 Load 메서드에서 예외가 throw 됩니다.If no default value or null can be used, then the Load method throws an exception. 특정 기본 값을 제공 하는 경우는 Load 메서드 묵시적된 기본 값으로 null 값을 사용 합니다.If no specific default value has been supplied, the Load method uses the null value as the implied default value.

동작을 고려 하기 전에 합니다 Load 데이터 작업을 기준으로 메서드는 것이 좋습니다 각 내에서 행을 DataTable 현재 값과 각 열에 대 한 원래 값을 유지 관리 합니다.Before considering the behavior of the Load method in terms of data operations, consider that each row within a DataTable maintains both the current value and the original value for each column. 이러한 값 같을 수도 있지만, 또는 행의 데이터를 채운 이후에 변경 된 경우에 다를 수 여 DataTable.These values may be equivalent, or may be different if the data in the row has been changed since filling the DataTable. 참조 행 상태 및 행 버전 자세한 내용은 합니다.See Row States and Row Versions for more information.

이 메서드 호출에서 지정 된 LoadOption 매개 변수는 들어오는 데이터의 처리에 영향을 줍니다.In this method call, the specified LoadOption parameter influences the processing of the incoming data. Load 메서드는 기존 행으로 동일한 기본 키가 있는 행을 로드할을 처리 하는 방법How should the Load method handle loading rows that have the same primary key as existing rows? 현재 값, 원래 값 또는 둘 다 수정 해야?Should it modify current values, original values, or both? 이러한 문제 및 자세한에 의해 제어 되는 loadOption 매개 변수입니다.These issues, and more, are controlled by the loadOption parameter.

기존 행과 들어오는 행에 해당 기본 키 값이 없으면 행의 현재 행 상태 값을 사용 하 여 처리 됩니다, 그리고 그렇지 않으면 새 행으로 처리 됩니다.If the existing row and the incoming row contain corresponding primary key values, the row is processed using its current row state value, otherwise it's treated as a new row.

이벤트 작업의 경우는 RowChanging 각 행이 변경 되기 전에 이벤트가 발생 하며 RowChanged 이벤트는 각 행이 변경 된 후 발생 합니다.In terms of event operations, the RowChanging event occurs before each row is changed, and the RowChanged event occurs after each row has been changed. 각각의 경우에서는 Action 속성의는 DataRowChangeEventArgs 이벤트 처리기에 전달 된 인스턴스가 이벤트와 연결 된 특정 작업에 대 한 정보를 포함 합니다.In each case, the Action property of the DataRowChangeEventArgs instance passed to the event handler contains information about the particular action associated with the event. 동작 값이 로드 작업 앞에 있는 행의 상태에 따라 달라 집니다.This action value varies, depending on the state of the row before the load operation. 각각의 경우에서 두 이벤트가 발생 하 고 작업을 각각에 대해 동일 합니다.In each case, both events occur, and the action is the same for each. 작업은 각 행의 현재 또는 원래 버전 또는 현재 행 상태에 따라 둘 다에 적용할 수 있습니다.The action may be applied to either the current or original version of each row, or both, depending on the current row state.

다음 표에 각를 사용 하 여 호출 하는 경우 Load 메서드에 대 한 동작을 LoadOption 값 및 값 로드 중인 행에 대 한 행 상태와 상호 작용 하는 방법을 보여 줍니다.The following table displays behavior for the Load method when called with each of the LoadOption values, and also shows how the values interact with the row state for the row being loaded. ("(없음)" 라는) 마지막 행을 기존 행과 일치 하지 않는 들어오는 행에 대 한 동작을 설명 합니다.The final row (labeled "(Not present)") describes the behavior for incoming rows that don't match any existing row. 이 테이블의 각 셀과 함께 행의 필드에 대 한 현재 및 원래 값을 설명 합니다는 DataRowState 후의 값에 대 한는 Load 메서드가 완료 합니다.Each cell in this table describes the current and original value for a field within a row, along with the DataRowState for the value after the Load method has completed.

기존 DataRowStateExisting DataRowState UpsertUpsert OverwriteChangesOverwriteChanges PreserveChanges (기본 동작)PreserveChanges (Default behavior)
추가됨Added 현재 = <들어오는 >Current = <Incoming>

원래 =-<없음 >Original = -<Not available>

상태 = <추가 >State = <Added>

RowAction = 변경RowAction = Change
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <기존 >Current = <Existing>

원래 = <들어오는 >Original = <Incoming>

상태 = <수정 >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
수정한 날짜Modified 현재 = <들어오는 >Current = <Incoming>

원래 = <기존 >Original = <Existing>

상태 = <수정 >State = <Modified>

RowAction = 변경RowAction = Change
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <기존 >Current = <Existing>

원래 = <들어오는 >Original = <Incoming>

상태 = <수정 >State = <Modified>

RowAction =ChangeOriginalRowAction =ChangeOriginal
삭제됨Deleted (부하는 행을 삭제 하는 영향을 하지 않습니다)(Load does not affect deleted rows)

현재 =--Current = ---

원래 = <기존 >Original = <Existing>

상태 = <삭제 >State = <Deleted>

(다음 특징을 가진 새 행이 추가 됨)(New row is added with the following characteristics)

현재 = <들어오는 >Current = <Incoming>

원래 = <없음 >Original = <Not available>

상태 = <추가 >State = <Added>

RowAction = 추가RowAction = Add
삭제 취소 하 고Undo delete and

현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <없음 >Current = <Not available>

원래 = <들어오는 >Original = <Incoming>

상태 = <삭제 >State = <Deleted>

RowAction = ChangeOriginalRowAction = ChangeOriginal
UnchangedUnchanged 현재 = <들어오는 >Current = <Incoming>

원래 = <기존 >Original = <Existing>

새 값 이면 기존 값과 같은 경우If new value is the same as the existing value then

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = NothingRowAction = Nothing

ElseElse

상태 = <수정 >State = <Modified>

RowAction = 변경RowAction = Change
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
없음)Not present) 현재 = <들어오는 >Current = <Incoming>

원래 = <없음 >Original = <Not available>

상태 = <추가 >State = <Added>

RowAction = 추가RowAction = Add
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal

값을 DataColumn 와 같은 속성을 사용 하 여 제한할 수 있습니다 ReadOnlyAutoIncrement입니다.Values in a DataColumn can be constrained through use of properties such as ReadOnly and AutoIncrement. Load 메서드 열의 속성에 의해 정의 된 동작을 사용 하 여 일치 하는 방식으로 해당 열을 처리 합니다.The Load method handles such columns in a manner that is consistent with the behavior defined by the column's properties. 읽기 전용 제약을 DataColumn 메모리에서 발생 하는 변경에만 적용 됩니다.The read only constraint on a DataColumn is applicable only for changes that occur in memory. Load 메서드는 필요한 경우 읽기 전용으로 열 값을 덮어씁니다.The Load method's overwrites the read-only column values, if needed.

호출할 때 OverwriteChanges 또는 PreserveChanges 옵션을 지정 하는 경우는 Load 메서드를 다음 가정에서 들어오는 데이터가 제공 되는 수행 되는 DataTable의 주 데이터 원본 및 데이터 테이블의 변경 내용을 추적 및 전파 될 수 있습니다 변경 내용을 다시 데이터 원본입니다.If you specify the OverwriteChanges or PreserveChanges options when calling the Load method, then the assumption is made that the incoming data is coming from the DataTable's primary data source, and the DataTable tracks changes and can propagate the changes back to the data source. Upsert 옵션을 선택 하면 사용자에 의해 변경 된 중간 계층 구성 요소에서 제공 하는 데이터와 같은 보조 데이터 원본 중 하나에서 데이터가 제공 되는 가정 합니다.If you select the Upsert option, it is assumed that the data is coming from one of a secondary data source, such as data provided by a middle-tier component, perhaps altered by a user. 가정에서 하나 이상의 데이터 원본에서 데이터를 집계 하기 위한 것은 예제의 경우는 DataTable, 다음 아마도 주 데이터 원본에 데이터를 전파 합니다.In this case, the assumption is that the intent is to aggregate data from one or more data sources in the DataTable, and then perhaps propagate the data back to the primary data source. LoadOption 매개 변수는 기본 키 비교에 사용할 행의 특정 버전을 결정 하는 데 사용 됩니다.The LoadOption parameter is used for determining the specific version of the row that is to be used for primary key comparison. 아래 표에서 세부 정보를 제공 합니다.The table below provides the details.

로드 옵션Load option 기본 키 비교에 사용 되는 DataRow 버전DataRow version used for primary key comparison
OverwriteChanges 원래 버전에 있는 경우, 그렇지 않으면 현재 버전Original version, if it exists, otherwise Current version
PreserveChanges 원래 버전에 있는 경우, 그렇지 않으면 현재 버전Original version, if it exists, otherwise Current version
Upsert 현재 버전에 있는 경우, 그렇지 않으면 원래 버전Current version, if it exists, otherwise Original version
추가 정보

Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler)

오류 처리 대리자를 사용하는 제공된 DataTable를 사용해서 IDataReader을 데이터 소스의 값으로 채웁니다.Fills a DataTable with values from a data source using the supplied IDataReader using an error-handling delegate.

public:
 virtual void Load(System::Data::IDataReader ^ reader, System::Data::LoadOption loadOption, System::Data::FillErrorEventHandler ^ errorHandler);
public virtual void Load (System.Data.IDataReader reader, System.Data.LoadOption loadOption, System.Data.FillErrorEventHandler errorHandler);
abstract member Load : System.Data.IDataReader * System.Data.LoadOption * System.Data.FillErrorEventHandler -> unit
override this.Load : System.Data.IDataReader * System.Data.LoadOption * System.Data.FillErrorEventHandler -> unit

매개 변수

reader
IDataReader IDataReader IDataReader IDataReader

결과 집합을 제공하는 IDataReader입니다.A IDataReader that provides a result set.

loadOption
LoadOption LoadOption LoadOption LoadOption

LoadOption 열거형의 값으로서, 이미 DataTable에 있는 행이 동일한 기본 키를 공유하는 들어오는 행과 결합되는 방식을 나타냅니다.A value from the LoadOption enumeration that indicates how rows already in the DataTable are combined with incoming rows that share the same primary key.

errorHandler
FillErrorEventHandler FillErrorEventHandler FillErrorEventHandler FillErrorEventHandler

데이터를 로드하는 동안 오류가 발생하면 호출할 FillErrorEventHandler 대리자입니다.A FillErrorEventHandler delegate to call when an error occurs while loading data.

예제

static void Main()
{
    // Attempt to load data from a data reader in which
    // the schema is incompatible with the current schema.
    // If you use exception handling, you won't get the chance
    // to examine each row, and each individual table,
    // as the Load method progresses.
    // By taking advantage of the FillErrorEventHandler delegate,
    // you can interact with the Load process as an error occurs,
    // attempting to fix the problem, or simply continuing or quitting
    // the Load process:
    DataTable table = GetIntegerTable();
    DataTableReader reader = new DataTableReader(GetStringTable());
    table.Load(reader, LoadOption.OverwriteChanges, FillErrorHandler);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
}

private static DataTable GetIntegerTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 4 });
    table.Rows.Add(new object[] { 5 });
    table.AcceptChanges();
    return table;
}

private static DataTable GetStringTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { "Mary" });
    table.Rows.Add(new object[] { "Andy" });
    table.Rows.Add(new object[] { "Peter" });
    table.AcceptChanges();
    return table;
}

static void FillErrorHandler(object sender, FillErrorEventArgs e)
{
    // You can use the e.Errors value to determine exactly what
    // went wrong.
    if (e.Errors.GetType() == typeof(System.FormatException))
    {
        Console.WriteLine("Error when attempting to update the value: {0}", 
            e.Values[0]);
    }

    // Setting e.Continue to True tells the Load
    // method to continue trying. Setting it to False
    // indicates that an error has occurred, and the 
    // Load method raises the exception that got 
    // you here.
    e.Continue = true;
}
Sub Main()
  Dim table As New DataTable()

  ' Attempt to load data from a data reader in which
  ' the schema is incompatible with the current schema.
  ' If you use exception handling, you won't get the chance
  ' to examine each row, and each individual table,
  ' as the Load method progresses.
  ' By taking advantage of the FillErrorEventHandler delegate,
  ' you can interact with the Load process as an error occurs,
  ' attempting to fix the problem, or simply continuing or quitting
  ' the Load process:
  table = GetIntegerTable()
  Dim reader As New DataTableReader(GetStringTable())
  table.Load(reader, LoadOption.OverwriteChanges, _
      AddressOf FillErrorHandler)

  Console.WriteLine("Press any key to continue.")
  Console.ReadKey()
End Sub

Private Sub FillErrorHandler(ByVal sender As Object, _
  ByVal e As FillErrorEventArgs)
  ' You can use the e.Errors value to determine exactly what
  ' went wrong.
  If e.Errors.GetType Is GetType(System.FormatException) Then
    Console.WriteLine("Error when attempting to update the value: {0}", _
      e.Values(0))
  End If

  ' Setting e.Continue to True tells the Load
  ' method to continue trying. Setting it to False
  ' indicates that an error has occurred, and the 
  ' Load method raises the exception that got 
  ' you here.
  e.Continue = True
End Sub

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {4})
  table.Rows.Add(New Object() {5})
  table.TableName = "IntegerTable"
  table.AcceptChanges()
  Return table
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {"Mary"})
  table.Rows.Add(New Object() {"Andy"})
  table.Rows.Add(New Object() {"Peter"})
  table.AcceptChanges()
  Return table
End Function

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

설명

합니다 Load 첫 번째 결과 집합의 로드를 사용 하는 메서드 IDataReader를 성공적으로 완료 한 후 설정 판독기의 위치를 다음 결과 집합에 있는 경우.The Load method consumes the first result set from the loaded IDataReader, and after successful completion, sets the reader's position to the next result set, if any. 데이터를 변환 하는 경우는 Load 와 같은 변환 규칙을 사용 하는 메서드를 DbDataAdapter.Fill 메서드.When converting data, the Load method uses the same conversion rules as the DbDataAdapter.Fill method.

합니다 Load 메서드를 고려해 야 합니다 세 가지 특정 문제에서 데이터를 로드 하는 경우는 IDataReader 인스턴스: 스키마, 데이터 및 이벤트 작업 합니다.The Load method must take into account three specific issues when loading the data from an IDataReader instance: schema, data, and event operations. 스키마를 사용 하 여 작업 하는 경우는 Load 메서드는 다음 표에 설명 된 대로 조건이 발생할 수 있습니다.When working with the schema, the Load method may encounter conditions as described in the following table. 스키마 작업 수행도 포함 하는 데이터가 없는 모든 가져온된 결과 집합에 대 한 합니다.The schema operations take place for all imported result sets, even those containing no data.

조건Condition 동작Behavior
DataTable 에 스키마가 없는 합니다.The DataTable has no schema. 합니다 Load 메서드는 가져온에서 결과 집합에 따라 스키마를 유추 IDataReader합니다.The Load method infers the schema based on the result set from the imported IDataReader.
DataTable 스키마를 갖지만 로드 된 스키마와 호환 되지 않습니다.The DataTable has a schema, but it is incompatible with the loaded schema. Load 메서드 호환 되지 않는 스키마로 데이터를 로드 하려고 할 때 발생 하는 특정 오류에 해당 하는 예외를 throw 합니다.The Load method throws an exception corresponding to the particular error that occurs when attempting to load data into the incompatible schema.
스키마가 호환 되지만 로드 된 결과 집합 스키마에 존재 하지 않는 열이 포함 된 DataTable합니다.The schemas are compatible, but the loaded result set schema contains columns that don't exist in the DataTable. 합니다 Load 추가 열을 추가 하는 메서드 DataTable의 스키마입니다.The Load method adds the extra column(s) to DataTable's schema. 메서드는 해당 하는 경우 예외를 throw에서 열을 DataTable 로드 된 결과 집합 값이 서로 호환 되지 합니다.The method throws an exception if corresponding columns in the DataTable and the loaded result set are not value compatible. 또한 메서드는 결과 집합에 추가 된 모든 열에서에서 제약 조건 정보를 검색 합니다.The method also retrieves constraint information from the result set for all added columns. Primary Key 제약 조건의 경우를 제외 하 고이 제약 조건 정보는 경우에 현재 DataTable 로드 작업의 시작 부분에 열이 포함 되지 않습니다.Except for the case of Primary Key constraint, this constraint information is used only if the current DataTable does not contain any columns at the start of the load operation.
스키마가 호환 되지만 보다 적은 개수의 열을 포함 하는 로드 된 결과 집합 스키마에는 DataTable합니다.The schemas are compatible, but the loaded result set schema contains fewer columns than does the DataTable. 누락 된 열에 기본값이 정의 또는 열의 데이터 형식이 null을 허용 하는 경우는 Load 메서드를 사용 하면 행을 추가할 수는 누락 된 열에 대 한 default 또는 null 값을 대체 합니다.If a missing column has a default value defined or the column's data type is nullable, the Load method allows the rows to be added, substituting the default or null value for the missing column. 기본값 또는 null 없습니다 사용할 수 있습니다 하는 경우 해당 Load 메서드에서 예외가 throw 됩니다.If no default value or null can be used, then the Load method throws an exception. 특정 기본 값을 제공 하는 경우는 Load 메서드 묵시적된 기본 값으로 null 값을 사용 합니다.If no specific default value has been supplied, the Load method uses the null value as the implied default value.

동작을 고려 하기 전에 합니다 Load 데이터 작업을 기준으로 메서드는 것이 좋습니다 각 내에서 행을 DataTable 현재 값과 각 열에 대 한 원래 값을 유지 관리 합니다.Before considering the behavior of the Load method in terms of data operations, consider that each row within a DataTable maintains both the current value and the original value for each column. 이러한 값 같을 수도 있지만, 또는 행의 데이터를 채운 이후에 변경 된 경우에 다를 수 여 DataTable.These values may be equivalent, or may be different if the data in the row has been changed since filling the DataTable. 참조 행 상태 및 행 버전 자세한 내용은 합니다.See Row States and Row Versions for more information.

이 메서드 호출에서 지정 된 LoadOption 매개 변수는 들어오는 데이터의 처리에 영향을 줍니다.In this method call, the specified LoadOption parameter influences the processing of the incoming data. Load 메서드는 기존 행으로 동일한 기본 키가 있는 행을 로드할을 처리 하는 방법How should the Load method handle loading rows that have the same primary key as existing rows? 현재 값, 원래 값 또는 둘 다 수정 해야?Should it modify current values, original values, or both? 이러한 문제 및 자세한에 의해 제어 되는 loadOption 매개 변수입니다.These issues, and more, are controlled by the loadOption parameter.

기존 행과 들어오는 행에 해당 기본 키 값이 없으면 행의 현재 행 상태 값을 사용 하 여 처리 됩니다, 그리고 그렇지 않으면 새 행으로 처리 됩니다.If the existing row and the incoming row contain corresponding primary key values, the row is processed using its current row state value, otherwise it's treated as a new row.

이벤트 작업의 경우는 RowChanging 각 행이 변경 되기 전에 이벤트가 발생 하며 RowChanged 이벤트는 각 행이 변경 된 후 발생 합니다.In terms of event operations, the RowChanging event occurs before each row is changed, and the RowChanged event occurs after each row has been changed. 각각의 경우에서는 Action 속성의는 DataRowChangeEventArgs 이벤트 처리기에 전달 된 인스턴스가 이벤트와 연결 된 특정 작업에 대 한 정보를 포함 합니다.In each case, the Action property of the DataRowChangeEventArgs instance passed to the event handler contains information about the particular action associated with the event. 동작 값이 로드 작업 앞에 있는 행의 상태에 따라 달라 집니다.This action value varies, depending on the state of the row before the load operation. 각각의 경우에서 두 이벤트가 발생 하 고 작업을 각각에 대해 동일 합니다.In each case, both events occur, and the action is the same for each. 작업은 각 행의 현재 또는 원래 버전 또는 현재 행 상태에 따라 둘 다에 적용할 수 있습니다.The action may be applied to either the current or original version of each row, or both, depending on the current row state.

다음 표에 각를 사용 하 여 호출 하는 경우 Load 메서드에 대 한 동작을 LoadOption 값 및 값 로드 중인 행에 대 한 행 상태와 상호 작용 하는 방법을 보여 줍니다.The following table displays behavior for the Load method when called with each of the LoadOption values, and also shows how the values interact with the row state for the row being loaded. ("(없음)" 라는) 마지막 행을 기존 행과 일치 하지 않는 들어오는 행에 대 한 동작을 설명 합니다.The final row (labeled "(Not present)") describes the behavior for incoming rows that don't match any existing row. 이 테이블의 각 셀과 함께 행의 필드에 대 한 현재 및 원래 값을 설명 합니다는 DataRowState 후의 값에 대 한는 Load 메서드가 완료 합니다.Each cell in this table describes the current and original value for a field within a row, along with the DataRowState for the value after the Load method has completed.

기존 DataRowStateExisting DataRowState UpsertUpsert OverwriteChangesOverwriteChanges PreserveChanges (기본 동작)PreserveChanges (Default behavior)
추가됨Added 현재 = <들어오는 >Current = <Incoming>

원래 =-<없음 >Original = -<Not available>

상태 = <추가 >State = <Added>

RowAction = 변경RowAction = Change
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <기존 >Current = <Existing>

원래 = <들어오는 >Original = <Incoming>

상태 = <수정 >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
수정한 날짜Modified 현재 = <들어오는 >Current = <Incoming>

원래 = <기존 >Original = <Existing>

상태 = <수정 >State = <Modified>

RowAction = 변경RowAction = Change
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <기존 >Current = <Existing>

원래 = <들어오는 >Original = <Incoming>

상태 = <수정 >State = <Modified>

RowAction =ChangeOriginalRowAction =ChangeOriginal
파일과eleted (부하는 행을 삭제 하는 영향을 하지 않습니다)(Load does not affect deleted rows)

현재 =--Current = ---

원래 = <기존 >Original = <Existing>

상태 = <삭제 >State = <Deleted>

(다음 특징을 가진 새 행이 추가 됨)(New row is added with the following characteristics)

현재 = <들어오는 >Current = <Incoming>

원래 = <없음 >Original = <Not available>

상태 = <추가 >State = <Added>

RowAction = 추가RowAction = Add
삭제 취소 하 고Undo delete and

현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <없음 >Current = <Not available>

원래 = <들어오는 >Original = <Incoming>

상태 = <삭제 >State = <Deleted>

RowAction = ChangeOriginalRowAction = ChangeOriginal
UnchangedUnchanged 현재 = <들어오는 >Current = <Incoming>

원래 = <기존 >Original = <Existing>

새 값 이면 기존 값과 같은 경우If new value is the same as the existing value then

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = NothingRowAction = Nothing

ElseElse

상태 = <수정 >State = <Modified>

RowAction = 변경RowAction = Change
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
없음)Not present) 현재 = <들어오는 >Current = <Incoming>

원래 = <없음 >Original = <Not available>

상태 = <추가 >State = <Added>

RowAction = 추가RowAction = Add
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
현재 = <들어오는 >Current = <Incoming>

원래 = <들어오는 >Original = <Incoming>

상태 = <변경 되지 않은 >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal

값을 DataColumn 와 같은 속성을 사용 하 여 제한할 수 있습니다 ReadOnlyAutoIncrement입니다.Values in a DataColumn can be constrained through use of properties such as ReadOnly and AutoIncrement. Load 메서드 열의 속성에 의해 정의 된 동작을 사용 하 여 일치 하는 방식으로 해당 열을 처리 합니다.The Load method handles such columns in a manner that is consistent with the behavior defined by the column's properties. 읽기 전용 제약을 DataColumn 메모리에서 발생 하는 변경에만 적용 됩니다.The read only constraint on a DataColumn is applicable only for changes that occur in memory. Load 메서드는 필요한 경우 읽기 전용으로 열 값을 덮어씁니다.The Load method's overwrites the read-only column values, if needed.

호출할 때 OverwriteChanges 또는 PreserveChanges 옵션을 지정 하는 경우는 Load 메서드를 다음 가정에서 들어오는 데이터가 제공 되는 수행 되는 DataTable의 주 데이터 원본 및 데이터 테이블의 변경 내용을 추적 및 전파 될 수 있습니다 변경 내용을 다시 데이터 원본입니다.If you specify the OverwriteChanges or PreserveChanges options when calling the Load method, then the assumption is made that the incoming data is coming from the DataTable's primary data source, and the DataTable tracks changes and can propagate the changes back to the data source. Upsert 옵션을 선택 하면 사용자에 의해 변경 된 중간 계층 구성 요소에서 제공 하는 데이터와 같은 보조 데이터 원본 중 하나에서 데이터가 제공 되는 가정 합니다.If you select the Upsert option, it is assumed that the data is coming from one of a secondary data source, such as data provided by a middle-tier component, perhaps altered by a user. 가정에서 하나 이상의 데이터 원본에서 데이터를 집계 하기 위한 것은 예제의 경우는 DataTable, 다음 아마도 주 데이터 원본에 데이터를 전파 합니다.In this case, the assumption is that the intent is to aggregate data from one or more data sources in the DataTable, and then perhaps propagate the data back to the primary data source. LoadOption 매개 변수는 기본 키 비교에 사용할 행의 특정 버전을 결정 하는 데 사용 됩니다.The LoadOption parameter is used for determining the specific version of the row that is to be used for primary key comparison. 아래 표에서 세부 정보를 제공 합니다.The table below provides the details.

로드 옵션Load option 기본 키 비교에 사용 되는 DataRow 버전DataRow version used for primary key comparison
OverwriteChanges 원래 버전에 있는 경우, 그렇지 않으면 현재 버전Original version, if it exists, otherwise Current version
PreserveChanges 원래 버전에 있는 경우, 그렇지 않으면 현재 버전Original version, if it exists, otherwise Current version
Upsert 현재 버전에 있는 경우, 그렇지 않으면 원래 버전Current version, if it exists, otherwise Original version

합니다 errorHandler 매개 변수는 한 FillErrorEventHandler 데이터를 로드 하는 동안 오류가 발생 하면 호출 되는 프로시저를 참조 하는 대리자입니다.The errorHandler parameter is a FillErrorEventHandler delegate that refers to a procedure that is called when an error occurs while loading data. 합니다 FillErrorEventArgs 발생 한 오류, 데이터의 현재 행에 대 한 정보를 검색할 수 있는 속성을 제공 하는 프로시저에 전달 된 매개 변수 및 DataTable 채워지고 있습니다.The FillErrorEventArgs parameter passed to the procedure provides properties that allow you to retrieve information about the error that occurred, the current row of data, and the DataTable being filled. 이 대리자 메커니즘을 사용 하 여, 대신 간단한 try/catch 블록을 오류를 확인할 수 있습니다 상황을 처리 한 원하는 경우 처리를 계속 합니다.Using this delegate mechanism, rather than a simpler try/catch block, allows you to determine the error, handle the situation, and continue processing if you like. 합니다 FillErrorEventArgs 매개 변수를 제공을 Continue 속성:이 속성을 설정 true 오류를 처리 하 고 처리를 계속 하려면.The FillErrorEventArgs parameter supplies a Continue property: set this property to true to indicate that you have handled the error and wish to continue processing. 속성을 설정 false 처리를 중단 하려는 나타냅니다.Set the property to false to indicate that you wish to halt processing. 주의 해당 속성을 설정 false 예외를 throw 하려면 문제를 트리거한 코드를 사용 하면 됩니다.Be aware that setting the property to false causes the code that triggered the problem to throw an exception.

추가 정보

적용 대상