DataTable.Load Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
DataTable Vyplní hodnotu hodnotami ze zdroje dat pomocí zadaného IDataReader. DataTable
Pokud už objekt obsahuje řádky, sloučí se příchozí data ze zdroje dat s existujícími řádky.
Přetížení
Load(IDataReader) |
DataTable Vyplní hodnotu hodnotami ze zdroje dat pomocí zadané IDataReaderhodnoty . DataTable Pokud již obsahuje řádky, příchozí data ze zdroje dat se sloučí s existujícími řádky. |
Load(IDataReader, LoadOption) |
DataTable Vyplní hodnotu hodnotami ze zdroje dat pomocí zadané IDataReaderhodnoty . |
Load(IDataReader, LoadOption, FillErrorEventHandler) |
DataTable Vyplní hodnoty ze zdroje dat pomocí zadaného IDataReader delegáta zpracování chyb. |
Příklady
Následující příklad ukazuje několik problémů souvisejících s voláním Load metody. Příklad se nejprve zaměřuje na problémy se schématem, včetně odvození schématu z načteného IDataReadera následného zpracování nekompatibilních schémat a schémat s chybějícími nebo dalšími sloupci. Příklad se pak zaměřuje na problémy s daty, včetně zpracování různých možností načítání.
Poznámka
Tento příklad ukazuje, jak použít jednu z přetížených verzí nástroje Load
. Další příklady, které mohou být k dispozici, naleznete v popisu jednotlivých přetížených verzí.
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
Poznámky
Tuto Load
metodu lze použít v několika běžných scénářích, které se soustředí na získání dat ze zadaného zdroje dat a jejich přidání do aktuálního kontejneru dat (v tomto případě DataTable
). Tyto scénáře popisují standardní použití objektu DataTable
, který popisuje jeho chování při aktualizaci a slučování.
Nástroj DataTable
se synchronizuje nebo aktualizuje s jedním primárním zdrojem dat. Sleduje DataTable
změny a umožňuje synchronizaci s primárním zdrojem dat. Kromě toho může přijímat DataTable
přírůstková data z jednoho nebo více sekundárních zdrojů dat. Není DataTable
zodpovědný za sledování změn, aby bylo možné synchronizaci se sekundárním zdrojem dat.
Pokud budou k dispozici tyto dva hypotetické zdroje dat, bude uživatel pravděpodobně vyžadovat jedno z následujících chování:
Inicializuje
DataTable
se z primárního zdroje dat. V tomto scénáři chce uživatel inicializovat prázdnouDataTable
hodnotu s hodnotami z primárního zdroje dat. Později hodlá uživatel přenést tyto změny zpět do primárního zdroje dat.Zachovat změny a znovu provést synchronizaci z primárního zdroje dat. V tomto scénáři chce uživatel převzít
DataTable
vyplněný v předchozím scénáři a provést přírůstkovou synchronizaci s primárním zdrojem dat, přičemž se zachová změny provedené v objektuDataTable
.Načítat data postupně ze sekundárních zdrojů dat. V tomto scénáři chce uživatel sloučit změny z jednoho nebo více sekundárních zdrojů dat a přenést tyto změny zpět do primárního zdroje dat.
Metoda Load
umožňuje všechny tyto scénáře. Všechny přetížení pro tuto metodu kromě jednoho umožňují zadat parametr možnosti načtení, který označuje, jak řádky již v DataTable kombinaci s řádky jsou načteny. (Přetížení, které neumožňuje zadat chování, používá výchozí možnost načtení.) Následující tabulka popisuje tři možnosti načtení, které LoadOption poskytuje výčet. Popis jednotlivých možností poskytuje informace o chování v případě, že se primární klíč řádku v příchozích datech shoduje s primárním klíčem existujícího řádku.
Možnost metody Load | Description |
---|---|
PreserveChanges (výchozí) |
Aktualizuje původní verzi řádku s použitím hodnoty z příchozího řádku. |
OverwriteChanges |
Aktualizuje aktuální a původní verze řádku s použitím hodnoty z příchozího řádku. |
Upsert |
Aktualizuje aktuální verzi řádku s použitím hodnoty z příchozího řádku. |
Obecně platí, že možnosti a OverwriteChanges
jsou určeny pro scénáře, PreserveChanges
ve kterých uživatel potřebuje synchronizovat DataSet
a jeho změny s primárním zdrojem dat. Tato Upsert
možnost usnadňuje agregaci změn z jednoho nebo více sekundárních zdrojů dat.
Load(IDataReader)
- Zdroj:
- DataTable.cs
- Zdroj:
- DataTable.cs
- Zdroj:
- DataTable.cs
DataTable Vyplní hodnotu hodnotami ze zdroje dat pomocí zadané IDataReaderhodnoty . DataTable Pokud již obsahuje řádky, příchozí data ze zdroje dat se sloučí s existujícími řádky.
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)
Parametry
- reader
- IDataReader
Soubor IDataReader , který poskytuje sadu výsledků.
Příklady
Následující příklad ukazuje několik problémů souvisejících s voláním Load metody. Příklad se nejprve zaměřuje na problémy se schématem, včetně odvození schématu z načteného IDataReadera následného zpracování nekompatibilních schémat a schémat s chybějícími nebo dalšími sloupci. Příklad pak zavolá metodu Load
a zobrazí data před i po operaci načtení.
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
Poznámky
Metoda Load využívá první sadu výsledků z načtené IDataReadersady a po úspěšném dokončení nastaví pozici čtenáře na další sadu výsledků, pokud existuje. Při převodu Load
dat metoda používá stejná pravidla převodu DbDataAdapter.Fill jako metoda.
Metoda Load musí brát v úvahu tři konkrétní problémy při načítání dat z IDataReader instance: schéma, data a operace událostí. Při práci se schématem může metoda narazit na Load podmínky popsané v následující tabulce. Operace schématu probíhají pro všechny importované sady výsledků, a to i pro ty, které neobsahují žádná data.
Podmínka | Chování |
---|---|
Nemá DataTable žádné schéma. | Metoda Load odvodí schéma na základě sady výsledků z importovaného IDataReaderobjektu . |
Má DataTable schéma, ale není kompatibilní s načteným schématem. | Metoda Load vyvolá výjimku odpovídající konkrétní chybě, ke které dochází při pokusu o načtení dat do nekompatibilního schématu. |
Schémata jsou kompatibilní, ale načtené schéma sady výsledků obsahuje sloupce, které neexistují v objektu DataTable. | Metoda Load přidá další sloupce do DataTable schématu . Metoda vyvolá výjimku, pokud odpovídající sloupce v DataTable a načtené sadě výsledků nejsou kompatibilní s hodnotou. Metoda také načte informace o omezení ze sady výsledků pro všechny přidané sloupce. S výjimkou případu omezení primárního klíče se tyto informace o omezení použijí pouze v případě, že aktuální DataTable neobsahuje žádné sloupce na začátku operace načítání. |
Schémata jsou kompatibilní, ale načtené schéma sady výsledků obsahuje méně sloupců než DataTable . |
Pokud má chybějící sloupec definovanou výchozí hodnotu nebo datový typ sloupce má hodnotu null, Load metoda umožňuje přidat řádky a nahradit výchozí nebo null hodnotu chybějícího sloupce. Pokud není výchozí hodnota nebo null lze použít, Load vyvolá metoda výjimku. Pokud nebyla zadána žádná konkrétní výchozí hodnota, Load metoda použije null hodnotu jako implicitní výchozí hodnotu. |
Před zvážením Load
chování metody z hlediska operací s daty zvažte, že každý řádek v rámci objektu DataTable zachovává aktuální i původní hodnotu pro každý sloupec. Tyto hodnoty můžou být ekvivalentní nebo se můžou lišit, pokud se data v řádku od vyplnění DataTable
změnila. Další informace najdete v tématu Stavy řádků a Verze řádků.
Tato verze Load
metody se pokusí zachovat aktuální hodnoty v každém řádku a původní hodnotu ponechá nedotčenou. (Pokud chcete mít nad chováním příchozích dat podrobnější kontrolu, přečtěte si téma DataTable.Load.) Pokud existující řádek a příchozí řádek obsahují odpovídající hodnoty primárního klíče, je řádek zpracován pomocí aktuální hodnoty stavu řádku, jinak se považuje za nový řádek.
Pokud jde o operace událostí, RowChanging událost nastane před změnou každého řádku a RowChanged událost nastane po změně každého řádku. V každém případě Action vlastnost DataRowChangeEventArgs instance předaná obslužné rutině události obsahuje informace o konkrétní akci přidružené k události. Tato hodnota akce závisí na stavu řádku před operací načtení. V každém případě dojde k oběma událostem a akce je pro každou z nich stejná. Akce se může v závislosti na aktuálním stavu řádku použít buď na aktuální nebo původní verzi každého řádku, nebo na obě.
V následující tabulce je uvedené chování metody Load
. Poslední řádek (označený "(Není)) popisuje chování příchozích řádků, které neodpovídají žádnému existujícímu řádku. Každá buňka v této tabulce popisuje aktuální a původní hodnotu pole na řádku spolu s DataRowState hodnotou pro hodnotu po Load
dokončení metody. V tomto případě metoda neumožňuje označit možnost načtení a použije výchozí PreserveChanges
hodnotu .
Existující dataRowState | Hodnoty za Load metodou a akcí události |
---|---|
Přidáno | Current = <Existing> Původní = <Příchozí> Stav = <Změněno> AkceŘádku = ZměnitPůvodní |
Upraveno | Current = <Existing> Původní = <Příchozí> Stav = <Změněno> AkceŘádku = ZměnitPůvodní |
Odstraněné | Aktuální = <Není k dispozici> Původní = <Příchozí> Stav = <Odstraněno> AkceŘádku = ZměnitPůvodní |
Nezměněn | Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
(Není k dispozici) | Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Hodnoty v objektu DataColumn lze omezit pomocí vlastností, jako ReadOnly jsou a AutoIncrement. Metoda Load
zpracovává tyto sloupce způsobem, který je konzistentní s chováním definovaným vlastnostmi sloupce. Omezení jen pro čtení se vztahuje pouze na DataColumn změny, ke kterým dojde v paměti. Metoda Load
v případě potřeby přepíše hodnoty sloupců jen pro čtení.
Pokud chcete zjistit, jakou verzi pole primárního klíče použít pro porovnání aktuálního řádku s příchozím řádkem, Load
použije metoda původní verzi hodnoty primárního klíče v řádku, pokud existuje. V opačném Load
případě metoda použije aktuální verzi pole primárního klíče.
Viz také
Platí pro
Load(IDataReader, LoadOption)
- Zdroj:
- DataTable.cs
- Zdroj:
- DataTable.cs
- Zdroj:
- DataTable.cs
DataTable Vyplní hodnotu hodnotami ze zdroje dat pomocí zadané IDataReaderhodnoty . DataTable
Pokud již obsahuje řádky, jsou příchozí data ze zdroje dat sloučena s existujícími řádky podle hodnoty parametruloadOption
.
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
Public Sub Load (reader As IDataReader, loadOption As LoadOption)
Parametry
- reader
- IDataReader
Objekt IDataReader , který poskytuje jednu nebo více sad výsledků.
- loadOption
- LoadOption
Hodnota z výčtu LoadOption , která označuje, jak jsou řádky již v objektu DataTable kombinovány s příchozími řádky, které sdílejí stejný primární klíč.
Příklady
Následující příklad ukazuje několik problémů souvisejících s voláním Load metody. Příklad se nejprve zaměřuje na problémy se schématem, včetně odvození schématu z načteného IDataReadera následného zpracování nekompatibilních schémat a schémat s chybějícími nebo dalšími sloupci. Příklad se pak zaměřuje na problémy s daty, včetně zpracování různých možností načítání.
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
Poznámky
Metoda Load
využívá první sadu výsledků z načtené IDataReadersady a po úspěšném dokončení nastaví pozici čtenáře na další sadu výsledků, pokud existuje. Při převodu Load
dat metoda používá stejná pravidla převodu Fill jako metoda.
Metoda Load
musí brát v úvahu tři konkrétní problémy při načítání dat z IDataReader instance: schéma, data a operace událostí. Při práci se schématem může metoda narazit na Load
podmínky popsané v následující tabulce. Operace schématu probíhají pro všechny importované sady výsledků, a to i pro ty, které neobsahují žádná data.
Podmínka | Chování |
---|---|
Nemá DataTable žádné schéma. | Metoda Load odvodí schéma na základě sady výsledků z importovaného IDataReaderobjektu . |
Má DataTable schéma, ale není kompatibilní s načteným schématem. | Metoda Load vyvolá výjimku odpovídající konkrétní chybě, ke které dochází při pokusu o načtení dat do nekompatibilního schématu. |
Schémata jsou kompatibilní, ale načtené schéma sady výsledků obsahuje sloupce, které v objektu DataTable neexistují. |
Metoda Load přidá další sloupce do DataTable schématu . Metoda vyvolá výjimku, pokud odpovídající sloupce v DataTable a načtené sadě výsledků nejsou kompatibilní s hodnotou. Metoda také načte informace o omezení ze sady výsledků pro všechny přidané sloupce. S výjimkou případu omezení primárního klíče se tyto informace o omezení použijí pouze v případě, že aktuální DataTable neobsahuje žádné sloupce na začátku operace načítání. |
Schémata jsou kompatibilní, ale načtené schéma sady výsledků obsahuje méně sloupců než DataTable . |
Pokud má chybějící sloupec definovanou výchozí hodnotu nebo datový typ sloupce má hodnotu null, Load metoda umožňuje přidat řádky a nahradit chybějícím sloupcem výchozí nebo nulovou hodnotu. Pokud nelze použít žádnou výchozí hodnotu nebo hodnotu null, Load vyvolá metoda výjimku. Pokud nebyla zadána žádná konkrétní výchozí hodnota, Load metoda použije hodnotu null jako implicitní výchozí hodnotu. |
Před zvážením Load
chování metody z hlediska operací s daty zvažte, že každý řádek v rámci objektu DataTable zachovává aktuální i původní hodnotu pro každý sloupec. Tyto hodnoty můžou být ekvivalentní nebo se můžou lišit, pokud se data v řádku od vyplnění DataTable
změnila. Další informace najdete v tématu Stavy řádků a Verze řádků .
V tomto volání metody má zadaný LoadOption parametr vliv na zpracování příchozích dat. Jak by měla metoda Load zpracovávat načítání řádků, které mají stejný primární klíč jako existující řádky? Má se změnit aktuální hodnoty, původní hodnoty nebo obojí? Tyto a další problémy jsou řízeny parametrem loadOption
.
Pokud existující řádek a příchozí řádek obsahují odpovídající hodnoty primárního klíče, je řádek zpracován pomocí aktuální hodnoty stavu řádku, jinak se považuje za nový řádek.
Pokud jde o operace událostí, RowChanging událost nastane před změnou každého řádku a RowChanged událost nastane po změně každého řádku. V každém případě Action vlastnost DataRowChangeEventArgs instance předaná obslužné rutině události obsahuje informace o konkrétní akci přidružené k události. Tato hodnota akce se liší v závislosti na stavu řádku před operací načtení. V každém případě dojde k oběma událostem a akce je pro každou z nich stejná. Akce se může v závislosti na aktuálním stavu řádku použít buď na aktuální nebo původní verzi každého řádku, nebo na obě.
Následující tabulka zobrazuje chování metody Load při zavolání s každou z LoadOption
hodnot a také ukazuje, jak hodnoty interagují se stavem řádku pro řádek, který se načítá. Poslední řádek (označený "(Není)) popisuje chování příchozích řádků, které neodpovídají žádnému existujícímu řádku. Každá buňka v této tabulce popisuje aktuální a původní hodnotu pole na řádku spolu s DataRowState hodnotou pro hodnotu po Load
dokončení metody.
Existující dataRowState | Upsert | OverwriteChanges | PreserveChanges (výchozí chování) |
---|---|---|---|
Přidáno | Current = <Incoming> Původní = -<Není k dispozici> State = <Added> AkceŘádku = Změnit |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Existing> Původní = <Příchozí> Stav = <Změněno> AkceŘádku = ZměnitPůvodní |
Upraveno | Current = <Incoming> Původní = <existující> Stav = <Změněno> AkceŘádku = Změnit |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Existing> Původní = <Příchozí> Stav = <Změněno> RowAction =ChangeOriginal |
Odstraněné | (Načtení nemá vliv na odstraněné řádky.) Current = --- Původní = <existující> Stav = <Odstraněno> (Přidá se nový řádek s následujícími charakteristikami.) Current = <Incoming> Původní = <Není k dispozici> State = <Added> AkceŘádku = Přidat |
Zpět odstranění a Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Aktuální = <Není k dispozici> Původní = <Příchozí> Stav = <Odstraněno> AkceŘádku = ZměnitPůvodní |
Nezměněn | Current = <Incoming> Původní = <existující> Pokud je nová hodnota stejná jako stávající hodnota, pak Stav = <Beze změny> RowAction = Nothing Jiného Stav = <Změněno> AkceŘádku = Změnit |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Není k dispozici) | Current = <Incoming> Původní = <Není k dispozici> State = <Added> AkceŘádku = Přidat |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Hodnoty v objektu DataColumn lze omezit pomocí vlastností, jako ReadOnly jsou a AutoIncrement. Metoda Load
zpracovává tyto sloupce způsobem, který je konzistentní s chováním definovaným vlastnostmi sloupce. Omezení jen pro čtení se vztahuje pouze na DataColumn změny, ke kterým dojde v paměti. Metoda Load
v případě potřeby přepíše hodnoty sloupců jen pro čtení.
Pokud při volání Load
metody zadáte možnosti OverwriteChanges nebo PreserveChanges, předpokládá se, že příchozí data pocházejí z DataTable
primárního zdroje dat a tabulka DataTable sleduje změny a může změny šířit zpět do zdroje dat. Pokud vyberete možnost Upsert, předpokládá se, že data pocházejí ze sekundárního zdroje dat, jako jsou data poskytovaná komponentou střední vrstvy, možná změněná uživatelem. V tomto případě se předpokládá, že záměrem je agregovat data z jednoho nebo více zdrojů dat v DataTable
souboru a pak je třeba rozšířit zpět do primárního zdroje dat. Parametr LoadOption se používá k určení konkrétní verze řádku, který se má použít pro porovnání primárního klíče. Podrobnosti najdete v následující tabulce.
Možnost načtení | Verze DataRow použitá pro porovnání primárního klíče |
---|---|
OverwriteChanges |
Původní verze, pokud existuje, jinak aktuální verze |
PreserveChanges |
Původní verze, pokud existuje, jinak aktuální verze |
Upsert |
Aktuální verze, pokud existuje, jinak původní verze |
Viz také
Platí pro
Load(IDataReader, LoadOption, FillErrorEventHandler)
- Zdroj:
- DataTable.cs
- Zdroj:
- DataTable.cs
- Zdroj:
- DataTable.cs
DataTable Vyplní hodnoty ze zdroje dat pomocí zadaného IDataReader delegáta zpracování chyb.
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);
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
Public Overridable Sub Load (reader As IDataReader, loadOption As LoadOption, errorHandler As FillErrorEventHandler)
Parametry
- reader
- IDataReader
A IDataReader , který poskytuje sadu výsledků.
- loadOption
- LoadOption
Hodnota z výčtu LoadOption , která označuje, jak jsou řádky již v objektu DataTable kombinovány s příchozími řádky, které sdílejí stejný primární klíč.
- errorHandler
- FillErrorEventHandler
Delegát, FillErrorEventHandler který se má volat, když při načítání dat dojde k chybě.
Příklady
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
Poznámky
Metoda Load
využívá první sadu výsledků z načtené IDataReadersady a po úspěšném dokončení nastaví pozici čtenáře na další sadu výsledků, pokud existuje. Při převodu Load
dat metoda používá stejná pravidla převodu DbDataAdapter.Fill jako metoda.
Metoda Load
musí brát v úvahu tři konkrétní problémy při načítání dat z IDataReader instance: schéma, data a operace událostí. Při práci se schématem může metoda narazit na Load
podmínky popsané v následující tabulce. Operace schématu probíhají pro všechny importované sady výsledků, a to i pro ty, které neobsahují žádná data.
Podmínka | Chování |
---|---|
Nemá DataTable žádné schéma. | Metoda Load odvodí schéma na základě sady výsledků z importovaného IDataReaderobjektu . |
Má DataTable schéma, ale není kompatibilní s načteným schématem. | Metoda Load vyvolá výjimku odpovídající konkrétní chybě, ke které dochází při pokusu o načtení dat do nekompatibilního schématu. |
Schémata jsou kompatibilní, ale načtené schéma sady výsledků obsahuje sloupce, které v objektu DataTable neexistují. |
Metoda Load přidá další sloupce do DataTable schématu . Metoda vyvolá výjimku, pokud odpovídající sloupce v DataTable a načtené sadě výsledků nejsou kompatibilní s hodnotou. Metoda také načte informace o omezení ze sady výsledků pro všechny přidané sloupce. S výjimkou případu omezení primárního klíče se tyto informace o omezení použijí pouze v případě, že aktuální DataTable neobsahuje žádné sloupce na začátku operace načítání. |
Schémata jsou kompatibilní, ale načtené schéma sady výsledků obsahuje méně sloupců než DataTable . |
Pokud má chybějící sloupec definovanou výchozí hodnotu nebo datový typ sloupce má hodnotu null, Load metoda umožňuje přidat řádky a nahradit chybějícím sloupcem výchozí nebo nulovou hodnotu. Pokud nelze použít žádnou výchozí hodnotu nebo hodnotu null, Load vyvolá metoda výjimku. Pokud nebyla zadána žádná konkrétní výchozí hodnota, Load metoda použije hodnotu null jako implicitní výchozí hodnotu. |
Před zvážením Load
chování metody z hlediska operací s daty zvažte, že každý řádek v rámci objektu DataTable zachovává aktuální i původní hodnotu pro každý sloupec. Tyto hodnoty můžou být ekvivalentní nebo se můžou lišit, pokud se data v řádku od vyplnění DataTable
změnila. Další informace najdete v tématu Stavy řádků a Verze řádků .
V tomto volání metody má zadaný LoadOption parametr vliv na zpracování příchozích dat. Jak by měla metoda Load zpracovávat načítání řádků, které mají stejný primární klíč jako existující řádky? Má se změnit aktuální hodnoty, původní hodnoty nebo obojí? Tyto a další problémy jsou řízeny parametrem loadOption
.
Pokud existující řádek a příchozí řádek obsahují odpovídající hodnoty primárního klíče, je řádek zpracován pomocí aktuální hodnoty stavu řádku, jinak se považuje za nový řádek.
Pokud jde o operace událostí, RowChanging událost nastane před změnou každého řádku a RowChanged událost nastane po změně každého řádku. V každém případě Action vlastnost DataRowChangeEventArgs instance předaná obslužné rutině události obsahuje informace o konkrétní akci přidružené k události. Tato hodnota akce se liší v závislosti na stavu řádku před operací načtení. V každém případě dojde k oběma událostem a akce je pro každou z nich stejná. Akce se může v závislosti na aktuálním stavu řádku použít buď na aktuální nebo původní verzi každého řádku, nebo na obě.
Následující tabulka zobrazuje chování metody Load při zavolání s každou z LoadOption
hodnot a také ukazuje, jak hodnoty interagují se stavem řádku pro řádek, který se načítá. Poslední řádek (označený "(Není)) popisuje chování příchozích řádků, které neodpovídají žádnému existujícímu řádku. Každá buňka v této tabulce popisuje aktuální a původní hodnotu pole na řádku spolu s DataRowState hodnotou pro hodnotu po Load
dokončení metody.
Existující dataRowState | Upsert | OverwriteChanges | PreserveChanges (výchozí chování) |
---|---|---|---|
Přidáno | Current = <Incoming> Původní = -<Není k dispozici> State = <Added> AkceŘádku = Změnit |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Existing> Původní = <Příchozí> Stav = <Změněno> AkceŘádku = ZměnitPůvodní |
Upraveno | Current = <Incoming> Původní = <existující> Stav = <Změněno> AkceŘádku = Změnit |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Existing> Původní = <Příchozí> Stav = <Změněno> RowAction =ChangeOriginal |
Eleted | (Načtení nemá vliv na odstraněné řádky.) Current = --- Původní = <existující> Stav = <Odstraněno> (Přidá se nový řádek s následujícími charakteristikami.) Current = <Incoming> Původní = <Není k dispozici> State = <Added> AkceŘádku = Přidat |
Zpět odstranění a Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Aktuální = <Není k dispozici> Původní = <Příchozí> Stav = <Odstraněno> AkceŘádku = ZměnitPůvodní |
Nezměněn | Current = <Incoming> Původní = <existující> Pokud je nová hodnota stejná jako stávající hodnota, pak Stav = <Beze změny> RowAction = Nothing Jiného Stav = <Změněno> AkceŘádku = Změnit |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Není k dispozici) | Current = <Incoming> Původní = <Není k dispozici> State = <Added> AkceŘádku = Přidat |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Current = <Incoming> Původní = <Příchozí> Stav = <Beze změny> AkceŘádku = ZměnitAktuálníAPůvodní |
Hodnoty v objektu DataColumn lze omezit pomocí vlastností, jako ReadOnly jsou a AutoIncrement. Metoda Load
zpracovává tyto sloupce způsobem, který je konzistentní s chováním definovaným vlastnostmi sloupce. Omezení jen pro čtení se vztahuje pouze na DataColumn změny, ke kterým dojde v paměti. Metoda Load
v případě potřeby přepíše hodnoty sloupců jen pro čtení.
Pokud při volání Load
metody zadáte možnosti OverwriteChanges nebo PreserveChanges, předpokládá se, že příchozí data pocházejí z DataTable
primárního zdroje dat a tabulka DataTable sleduje změny a může změny šířit zpět do zdroje dat. Pokud vyberete možnost Upsert, předpokládá se, že data pocházejí ze sekundárního zdroje dat, jako jsou data poskytovaná komponentou střední vrstvy, možná změněná uživatelem. V tomto případě se předpokládá, že záměrem je agregovat data z jednoho nebo více zdrojů dat v DataTable
souboru a pak je třeba rozšířit zpět do primárního zdroje dat. Parametr LoadOption se používá k určení konkrétní verze řádku, který se má použít pro porovnání primárního klíče. Podrobnosti najdete v následující tabulce.
Možnost načtení | Verze DataRow použitá pro porovnání primárního klíče |
---|---|
OverwriteChanges |
Původní verze, pokud existuje, jinak aktuální verze |
PreserveChanges |
Původní verze, pokud existuje, jinak aktuální verze |
Upsert |
Aktuální verze, pokud existuje, jinak původní verze |
Parametr errorHandler
je FillErrorEventHandler delegát, který odkazuje na proceduru, která se volá, když při načítání dat dojde k chybě. Parametr FillErrorEventArgs předaný do procedury poskytuje vlastnosti, které umožňují načíst informace o chybě, ke které došlo, aktuálním řádku dat a DataTable vyplňování. Použití tohoto mechanismu delegáta místo jednoduššího bloku try/catch umožňuje určit chybu, zpracovat situaci a pokračovat ve zpracování, pokud chcete. Parametr FillErrorEventArgs poskytuje Continue vlastnost: Nastavte tuto vlastnost na hodnotu true
, která označuje, že jste chybu zvládli a chcete pokračovat ve zpracování. Nastavte vlastnost na hodnotu false
, která označuje, že chcete zastavit zpracování. Mějte na paměti, že nastavení vlastnosti na false
způsobí, že kód, který problém aktivoval, vyvolá výjimku.