相关文章推荐
独立的草稿本  ·  vtkTexturedSphereSourc ...·  1 月前    · 
果断的面包  ·  HTTP 之 ...·  1 年前    · 

下列範例示範呼叫 方法的幾個相關問題 Load 。 首先,此範例著重于架構問題,包括從載入 IDataReader 的 推斷架構,然後處理不相容的架構,以及遺漏或其他資料行的架構。 然後,此範例著重于資料問題,包括處理各種載入選項。

這個範例示範如何使用 的其中一個多載版本 Load 。 如需其他可能可用的範例,請參閱個別多載主題。

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()); 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()) 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) 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() & " ") Console.WriteLine() 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 ) 。 這些案例描述 的標準用法 DataTable ,描述其更新和合併行為。

DataTable 與單一主要資料來源同步處理或更新。 會 DataTable 追蹤變更,允許與主要資料來源同步處理。 此外, DataTable 也可以接受來自一或多個次要資料來源的累加式資料。 DataTable 不負責追蹤變更,以便允許與次要資料來源同步處理。

假設有這兩個假設資料來源,使用者可能需要下列其中一個行為:

  • 從主要資料來源初始化 DataTable 。 在此案例中,使用者想要使用來自主要資料來源的值初始化空白 DataTable 。 稍後,使用者想要將變更傳播回主要資料來源。

  • 保留變更並從主要資料來源重新同步處理。 在此案例中,使用者想要擷取 DataTable 上一個案例中填入 的 ,並與主要資料來源執行累加同步處理,並保留 中 DataTable 所做的修改。

  • 次要資料來源的累加式資料摘要。 在此案例中,使用者想要合併來自一或多個次要資料來源的變更,並將這些變更傳播回主要資料來源。

    方法 Load 可讓所有這些案例變成可能。 這個方法的其中一個多載都可讓您指定 load 選項參數,指出已 DataTable 如何結合要載入的資料列。 (不允許指定行為的多載會使用預設載入選項。) 下表描述列舉所提供的 LoadOption 三個載入選項。 在每個案例中,描述會指出傳入資料中資料列的主鍵符合現有資料列的主鍵時的行為。

    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)

    下列範例示範呼叫 方法的幾個相關問題 Load 。 首先,此範例著重于架構問題,包括從載入 IDataReader 的 推斷架構,然後處理不相容的架構,以及遺漏或其他資料行的架構。 然後,此範例會呼叫 Load 方法,並在載入作業前後顯示資料。

    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()); 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()) 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) 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() & " ") Console.WriteLine() 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 的 取用第一個結果集,並在成功完成之後,將讀取器的位置設定為下一個結果集。 轉換資料時, Load 方法會使用與 方法相同的轉換規則 DbDataAdapter.Fill

    Load 實例載入資料時,方法必須考慮三個 IDataReader 特定問題:架構、資料和事件作業。 使用架構時, Load 方法可能會遇到如下表中所述的條件。 所有匯入的結果集都會進行架構作業,即使不包含任何資料也一定。

    架構相容,但載入的結果集架構包含中 DataTable 不存在的資料行。 方法 Load 會將額外的資料行新增至 DataTable 的架構。 如果 和 載入的結果集中的對應 DataTable 資料行不相容,方法就會擲回例外狀況。 方法也會從所有新增資料行的結果集中擷取條件約束資訊。 除了主鍵條件約束的情況之外,只有在目前 DataTable 未在載入作業開始時包含任何資料行時,才會使用此條件約束資訊。 架構相容,但載入的結果集架構包含的資料行數目比 的 DataTable 少。 如果遺漏的資料行已定義預設值,或資料行的資料類型為可為 Null, Load 則此方法可允許加入資料列,並取代遺漏資料行的預設值或 null 值。 如果沒有預設值或 null 可以使用,則 Load 方法會擲回例外狀況。 如果未提供特定的預設值,方法會 Load 使用 null 值做為隱含的預設值。

    在考慮方法在資料作業方面的行為 Load 之前,請考慮 中的每個資料列 DataTable 都會維護每個資料行的目前值和原始值。 這些值可能相等,或者,如果資料列中的資料在填滿 DataTable 之後已變更,則這些值可能不同。 如需詳細資訊,請參閱 資料列狀態和資料列版本

    這個版本的 Load 方法會嘗試保留每個資料列中目前的值,讓原始值保持不變。 (如果您想要更精細地控制傳入資料的行為,請參閱 DataTable.Load .) 如果現有的資料列和傳入資料列包含對應的主鍵值,則會使用目前的資料列狀態值來處理資料列,否則它會被視為新資料列。

    就事件作業而言,事件 RowChanging 會在變更每個資料列之前發生,而且事件 RowChanged 會在變更每個資料列之後發生。 在每個案例中 Action ,傳遞至事件處理常式之 DataRowChangeEventArgs 實例的 屬性都包含與事件相關聯的特定動作相關資訊。 此動作值取決於載入作業之前的資料列狀態。 在每個案例中,都會發生這兩個事件,而且每個事件的動作都相同。 動作可能會套用至每個資料列的目前或原始版本,或兩者,視目前的資料列狀態而定。

    下表顯示 方法的行為 Load 。 標示為「 (不存在) 」的最後一個資料列 () 描述不符合任何現有資料列的傳入資料列行為。 此表格中的每個儲存格都會描述資料列內欄位的目前和原始值,以及在 DataRowState 方法完成之後 Load 的值。 在此情況下,方法不允許您指出載入選項,並使用預設值 PreserveChanges

    現有的 DataRowState 方法之後 Load 的值和事件動作

    中的 DataColumn 值可以使用 和 AutoIncrement ReadOnly 屬性來限制。 方法會 Load 以與資料行屬性所定義的行為一致的方式來處理這類資料行。 上的 DataColumn 唯讀條件約束僅適用于記憶體中發生的變更。 Load 方法會視需要覆寫唯讀資料行值。

    若要判斷要用來比較目前資料列與傳入資料列的主鍵欄位版本,如果資料列存在,此方法 Load 會使用資料列內主鍵值的原始版本。 否則, Load 方法會使用目前版本的主鍵欄位。

    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)

    下列範例示範呼叫 方法的幾個相關問題 Load 。 首先,此範例著重于架構問題,包括從載入 IDataReader 的 推斷架構,然後處理不相容的架構,以及遺漏或其他資料行的架構。 然後,此範例著重于資料問題,包括處理各種載入選項。

    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()); 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()) 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) 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() & " ") Console.WriteLine() 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 的第一個結果集,並在成功完成之後,將讀取器的位置設定為下一個結果集。 轉換資料時, Load 方法會使用與 方法相同的轉換規則 Fill

    從實例載入資料時,方法 Load 必須考慮三個 IDataReader 特定問題:架構、資料和事件作業。 使用架構時, Load 方法可能會遇到如下表中所述的條件。 所有匯入的結果集都會進行架構作業,即使是不包含任何資料的集合。

    架構相容,但載入的結果集架構包含 中不存在 DataTable 的資料行。 方法 Load 會將額外的資料行新增至 DataTable 的架構。 如果 中 DataTable 對應的資料行和載入的結果集與值不相容,方法會擲回例外狀況。 方法也會從所有新增資料行的結果集中擷取條件約束資訊。 除了主鍵條件約束的情況之外,只有在目前 DataTable 未在載入作業開始時包含任何資料行時,才會使用此條件約束資訊。 架構相容,但載入的結果集架構包含的資料行少於 DataTable 。 如果遺漏的資料行具有已定義的預設值,或資料行的資料類型可為 Null, Load 則方法允許加入資料列,並取代遺漏資料行的預設或 Null 值。 如果沒有可以使用預設值或 Null,則 Load 方法會擲回例外狀況。 如果未提供任何特定的預設值,此方法會 Load 使用 Null 值做為隱含的預設值。

    在考慮方法在資料作業方面的行為 Load 之前,請考慮 中的每個 DataTable 資料列都會維護每個資料行的目前值和原始值。 這些值可能相等,或者如果資料列中的資料在填滿 DataTable 之後已經變更,則這些值可能會不同。 如需詳細資訊,請參閱 資料列狀態和資料列版本

    在此方法呼叫中,指定的 LoadOption 參數會影響傳入資料的處理。 Load 方法應該如何處理與現有資料列具有相同主鍵的載入資料列? 它應該修改目前的值、原始值或兩者? 這些問題等等是由 參數所 loadOption 控制。

    如果現有的資料列和傳入資料列包含對應的主鍵值,則會使用目前的資料列狀態值來處理資料列,否則會被視為新資料列。

    就事件作業而言,事件 RowChanging 會在變更每個資料列之前發生,而且 RowChanged 事件會在每個資料列變更之後發生。 在每個案例中, Action 傳遞至事件處理常式之 DataRowChangeEventArgs 實例的 屬性都包含與事件相關聯之特定動作的相關資訊。 此動作值會根據載入作業之前的資料列狀態而有所不同。 在每個案例中,都會發生這兩個事件,而且每個事件的動作都相同。 動作可以套用至每個資料列的目前或原始版本,或兩者,視目前的資料列狀態而定。

    下表顯示使用每個 LoadOption 值呼叫時 Load 方法的行為,也會顯示值如何與所載入資料列的資料列狀態互動。 最後一個資料列 (標示為「 (不存在) 」) 描述不符合任何現有資料列的連入資料列行為。 此表格中的每個儲存格都會描述資料列內欄位的目前和原始值,以及 DataRowState 方法完成後的值 Load

    現有的 DataRowState Upsert OverwriteChanges PreserveChanges (預設行為) Current = < Incoming>

    原始 = - < 無法使用>

    狀態 = < 已新增>

    RowAction = 變更 Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal 目前 = < 現有>

    原始 = < 傳入>

    State = < Modified>

    RowAction = ChangeOriginal Current = < Incoming>

    原始 = < 現有>

    State = < Modified>

    RowAction = 變更 Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal 目前 = < 現有>

    原始 = < 傳入>

    State = < Modified>

    RowAction =ChangeOriginal (載入不會影響已刪除的資料列)

    Current = ---

    原始 = < 現有>

    State = < Deleted>

    (新增具有下列特性的新資料列)

    Current = < Incoming>

    原始 = < 無法使用>

    狀態 = < 已新增>

    RowAction = Add 復原刪除和

    Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal 目前 = < 無法使用>

    原始 = < 傳入>

    State = < Deleted>

    RowAction = ChangeOriginal Current = < Incoming>

    原始 = < 現有>

    如果新值與現有值相同,則

    狀態 = < 未變更>

    RowAction = Nothing

    Else

    State = < Modified>

    RowAction = 變更 Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal Current = < Incoming>

    原始 = < 無法使用>

    狀態 = < 已新增>

    RowAction = Add Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal

    中的 DataColumn 值可以透過使用 和 等 ReadOnly AutoIncrement 屬性來限制。 方法 Load 會以與資料行屬性所定義的行為一致的方式來處理這類資料行。 上的 DataColumn 唯讀條件約束僅適用于記憶體中發生的變更。 方法 Load 會視需要覆寫唯讀資料行值。

    如果您在呼叫 Load 方法時指定 OverwriteChanges 或 PreserveChanges 選項,則假設傳入的資料來自 DataTable 的主要資料來源,而 DataTable 會追蹤變更,而且可以將變更傳播回資料來源。 如果您選取 Upsert 選項,假設資料來自其中一個次要資料來源,例如仲介層元件所提供的資料,可能是由使用者改變。 在此情況下,假設意圖是從 中的 DataTable 一或多個資料來源匯總資料,然後或許會將資料傳播回主要資料來源。 參數 LoadOption 用於判斷要用於主鍵比較之資料列的特定版本。 下表提供詳細資料。

    用於主鍵比較的 DataRow 版本
    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)
    // 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() & " ") Console.WriteLine() End Sub

    方法 Load 會取用載入 IDataReader 的第一個結果集,並在成功完成之後,將讀取器的位置設定為下一個結果集。 轉換資料時, Load 方法會使用與 方法相同的轉換規則 DbDataAdapter.Fill

    從實例載入資料時,方法 Load 必須考慮三個 IDataReader 特定問題:架構、資料和事件作業。 使用架構時, Load 方法可能會遇到如下表中所述的條件。 所有匯入的結果集都會進行架構作業,即使是不包含任何資料的集合。

    架構相容,但載入的結果集架構包含 中不存在 DataTable 的資料行。 方法 Load 會將額外的資料行 () 新增至 DataTable 的架構。 如果 中 DataTable 對應的資料行和載入的結果集與值不相容,方法會擲回例外狀況。 方法也會從所有新增資料行的結果集中擷取條件約束資訊。 除了主鍵條件約束的情況之外,只有在目前 DataTable 未在載入作業開始時包含任何資料行時,才會使用此條件約束資訊。 架構相容,但載入的結果集架構包含的資料行少於 DataTable 。 如果遺漏的資料行具有已定義的預設值,或資料行的資料類型可為 Null, Load 則方法允許加入資料列,並取代遺漏資料行的預設或 Null 值。 如果沒有可以使用預設值或 Null,則 Load 方法會擲回例外狀況。 如果未提供任何特定的預設值,此方法會 Load 使用 Null 值做為隱含的預設值。

    在考慮方法在資料作業方面的行為 Load 之前,請考慮 中的每個 DataTable 資料列都會維護每個資料行的目前值和原始值。 這些值可能相等,或者如果資料列中的資料在填滿 DataTable 之後已經變更,則這些值可能會不同。 如需詳細資訊,請參閱 資料列狀態和資料列版本

    在此方法呼叫中,指定的 LoadOption 參數會影響傳入資料的處理。 Load 方法應該如何處理與現有資料列具有相同主鍵的載入資料列? 它應該修改目前的值、原始值或兩者? 這些問題等等是由 參數所 loadOption 控制。

    如果現有的資料列和傳入資料列包含對應的主鍵值,則會使用目前的資料列狀態值來處理資料列,否則會被視為新資料列。

    就事件作業而言,事件 RowChanging 會在變更每個資料列之前發生,而且 RowChanged 事件會在每個資料列變更之後發生。 在每個案例中, Action 傳遞至事件處理常式之 DataRowChangeEventArgs 實例的 屬性都包含與事件相關聯之特定動作的相關資訊。 此動作值會根據載入作業之前的資料列狀態而有所不同。 在每個案例中,都會發生這兩個事件,而且每個事件的動作都相同。 動作可以套用至每個資料列的目前或原始版本,或兩者,視目前的資料列狀態而定。

    下表顯示使用每個 LoadOption 值呼叫時 Load 方法的行為,也會顯示值如何與所載入資料列的資料列狀態互動。 最後一個資料列 (標示為「 (不存在) 」) 描述不符合任何現有資料列的連入資料列行為。 此表格中的每個儲存格都會描述資料列內欄位的目前和原始值,以及 DataRowState 方法完成後的值 Load

    現有的 DataRowState Upsert OverwriteChanges PreserveChanges (預設行為) Current = < Incoming>

    原始 = - < 無法使用>

    狀態 = < 已新增>

    RowAction = 變更 Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal 目前 = < 現有>

    原始 = < 傳入>

    State = < Modified>

    RowAction = ChangeOriginal Current = < Incoming>

    原始 = < 現有>

    State = < Modified>

    RowAction = 變更 Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal 目前 = < 現有>

    原始 = < 傳入>

    State = < Modified>

    RowAction =ChangeOriginal eleted (載入不會影響已刪除的資料列)

    Current = ---

    原始 = < 現有>

    State = < Deleted>

    (新增具有下列特性的新資料列)

    Current = < Incoming>

    原始 = < 無法使用>

    狀態 = < 已新增>

    RowAction = Add 復原刪除和

    Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal 目前 = < 無法使用>

    原始 = < 傳入>

    State = < Deleted>

    RowAction = ChangeOriginal Current = < Incoming>

    原始 = < 現有>

    如果新值與現有值相同,則

    狀態 = < 未變更>

    RowAction = Nothing

    Else

    State = < Modified>

    RowAction = 變更 Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal Current = < Incoming>

    原始 = < 無法使用>

    狀態 = < 已新增>

    RowAction = Add Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal Current = < Incoming>

    原始 = < 傳入>

    狀態 = < 未變更>

    RowAction = ChangeCurrentAndOriginal

    中的 DataColumn 值可以透過使用 和 等 ReadOnly AutoIncrement 屬性來限制。 方法 Load 會以與資料行屬性所定義的行為一致的方式來處理這類資料行。 上的 DataColumn 唯讀條件約束僅適用于記憶體中發生的變更。 方法 Load 會視需要覆寫唯讀資料行值。

    如果您在呼叫 Load 方法時指定 OverwriteChanges 或 PreserveChanges 選項,則假設傳入的資料來自 DataTable 的主要資料來源,而 DataTable 會追蹤變更,而且可以將變更傳播回資料來源。 如果您選取 Upsert 選項,假設資料來自其中一個次要資料來源,例如仲介層元件所提供的資料,可能是由使用者改變。 在此情況下,假設意圖是從 中的 DataTable 一或多個資料來源匯總資料,然後或許會將資料傳播回主要資料來源。 參數 LoadOption 用於判斷要用於主鍵比較之資料列的特定版本。 下表提供詳細資料。

    用於主鍵比較的 DataRow 版本

    參數 errorHandler 是委派 FillErrorEventHandler ,參考載入資料時發生錯誤時所呼叫的程式。 FillErrorEventArgs 傳遞至程式的參數提供屬性,可讓您擷取所發生錯誤的相關資訊、目前的資料列,以及 DataTable 所填入的資訊。 使用此委派機制,而不是更簡單的 try/catch 區塊,可讓您判斷錯誤、處理情況,並視需要繼續處理。 參數 FillErrorEventArgs Continue 提供屬性:將此屬性設定為 true ,表示您已處理錯誤,並想要繼續處理。 將 屬性設定為 false ,表示您想要停止處理。 請注意,將 屬性設定為 false 會導致觸發問題的程式碼擲回例外狀況。

  •