OleDbDataAdapter.Fill 方法

定義

新增或刷新 在 的 DataSet 列數,使其與 ADO RecordsetRecord 物件中的列數相匹配。

多載

名稱 Description
Fill(DataTable, Object)

在 A DataTable 中新增或刷新資料列,使其與指定Recordset且 ADO 物件的RecordDataTable列數相符。

Fill(DataSet, Object, String)

新增或刷新 中 的DataSet列,以符合指定的 RecordsetADO 物件及來源資料表名稱,使 ADO RecordDataSet 或物件中的列與之相符。

Fill(DataTable, Object)

在 A DataTable 中新增或刷新資料列,使其與指定Recordset且 ADO 物件的RecordDataTable列數相符。

public:
 int Fill(System::Data::DataTable ^ dataTable, System::Object ^ ADODBRecordSet);
public int Fill(System.Data.DataTable dataTable, object ADODBRecordSet);
override this.Fill : System.Data.DataTable * obj -> int
Public Function Fill (dataTable As DataTable, ADODBRecordSet As Object) As Integer

參數

dataTable
DataTable

A DataTable 用來填充記錄,若需要,則用 schema。

ADODBRecordSet
Object

一個 ADO RecordsetRecord 物件。

傳回

成功刷新的 DataTable列數。 這不包含那些不回傳列的語句所影響的列。

備註

ActiveX 資料物件(ADO)與 ADO.NET 之間的連結是單向操作,你可以將資料從 ADO 複製到 DataSet,但資料的任何更新必須由 ADO.NET 處理。

此方法的過載Fill不會在操作完成Fill時關閉輸入Recordset

當處理回傳多個結果的批次 SQL 語句時,OLE DB.NET Framework Data Provider FillFillSchema 實作只會取得第一個結果的結構資訊。

Fill 操作會將列加入指定的目標 DataTable 物件 DataSet,若該物件尚未存在,則建立 DataTable 該物件。 當你建立物件 DataTable 時,操作 Fill 通常只會產生欄位名稱的元資料。 然而,若 MissingSchemaAction 屬性設定為 AddWithKey,也會建立適當的主鍵與約束。

你可以在同一台Fill機器上重複使用這個DataTable方法。 若存在主鍵,輸入的列會與已存在的匹配列合併。 若不存在主鍵,則會將輸入的列附加在 DataTable。 若存在主鍵資訊,重複的列會被調和,且只會在對應的 DataSetDataTable出現一次。 主鍵資訊可以透過 ,指定 FillSchema 的屬性PrimaryKey來設定DataTable,或將屬性設MissingSchemaActionAddWithKey

如果 傳SelectCommand回 OUTER JOIN 的結果,則 DataAdapter 不會為產生的 PrimaryKey設定DataTable值。 你必須明確定義主鍵,以確保重複列能正確解析。 如需詳細資訊,請參閱定義主索引鍵

為了正確使用 OLE DB 的 .NET Framework Data Provider,AddWithKey 要求原生 OLE DB 提供者透過設定 DBPROP_UNIQUEROWS 屬性取得所需的主鍵資訊,然後透過檢視 IColumnsRowset 中的DBCOLUMN_KEYCOLUMN來判斷哪些欄位是主鍵欄位。 或者,使用者也可以明確設定每個 DataTable的主鍵約束。 這確保與現有紀錄相符的進來紀錄會被更新,而非被附加。

如果 OleDbDataAdapter 在填充 時 DataTable遇到重複欄位,則會產生後續欄位名稱,使用「欄位名稱1」、「欄位名稱2」、「欄位名稱3」等模式。 空欄位名稱會用空字串加入 DataTable第一欄,接著是「1」、「2」、「3」等空欄。

ADO Recordset 中的值或 Record 物件會轉換為通用的執行時語言類型,以儲存在 DataSet

Caution

此方法的過載 Fill 不會在填充操作完成時隱含呼叫 Close ADO 物件。 因此,使用完 ADO RecordsetRecord物件後,務必Close致電。 這確保底層與資料來源的連結能及時釋放,並防止因未管理的 ADO 物件在現有參考仍存在時被垃圾回收而可能的存取違規。

當你在 a DataAdapter 上呼叫TableMappings.Add該方法,並明確將來源表參數映射到空字串時,資料集會成功用來源資料表填滿,但資料集會被填入任何資料。 例如,在以下範例中, rDataSet 將被填充為零。

rAdapter.TableMappings.Add("source table", "");
rAdapter.Fill(rDataSet, "source table");

這個例子說明了在處理多個結果時,你可以跳過一個結果。

以下範例使用 來 OleDbDataAdapter 填充 , DataTable 使用一個 ADO Recordset。 此範例假設你已建立一個 ADO Recordset

Dim custDA As OleDbDataAdapter = New OleDbDataAdapter()
     Dim custDS As DataSet = New DataSet
     Dim custTable As DataTable = New DataTable("Customers")
     custTable.Columns.Add("CustomerID", Type.GetType("System.String"))
     custTable.Columns.Add("CompanyName", Type.GetType("System.String"))
     custDS.Tables.Add(custTable)
     'Use ADO objects from ADO library (msado15.dll) imported
     ' as.NET library ADODB.dll using TlbImp.exe
     Dim adoConn As ADODB.Connection = New ADODB.Connection()
     Dim adoRS As ADODB.Recordset = New ADODB.Recordset()
     adoConn.Open("Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;", "", "", -1)
     adoRS.Open("SELECT CustomerID, CompanyName FROM Customers", adoConn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1)
     custDA.Fill(custTable, adoRS)
     adoRS.Close()
     adoConn.Close()
OleDbDataAdapter custDA = new OleDbDataAdapter();
     DataSet custDS = new DataSet();
     DataTable custTable = new DataTable("Customers");
     custTable.Columns.Add("CustomerID", typeof(String));
     custTable.Columns.Add("CompanyName", typeof(String));
     custDS.Tables.Add(custTable);
     //Use ADO objects from ADO library (msado15.dll) imported
     //  as.NET library ADODB.dll using TlbImp.exe
     ADODB.Connection adoConn = new ADODB.Connection();
     ADODB.Recordset adoRS = new ADODB.Recordset();
     adoConn.Open("Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;", "", "", -1);
     adoRS.Open("SELECT CustomerID, CompanyName FROM Customers", adoConn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1);
     custDA.Fill(custTable, adoRS);
     adoRS.Close();
     adoConn.Close();

另請參閱

適用於

Fill(DataSet, Object, String)

新增或刷新 中 的DataSet列,以符合指定的 RecordsetADO 物件及來源資料表名稱,使 ADO RecordDataSet 或物件中的列與之相符。

public:
 int Fill(System::Data::DataSet ^ dataSet, System::Object ^ ADODBRecordSet, System::String ^ srcTable);
public int Fill(System.Data.DataSet dataSet, object ADODBRecordSet, string srcTable);
override this.Fill : System.Data.DataSet * obj * string -> int
Public Function Fill (dataSet As DataSet, ADODBRecordSet As Object, srcTable As String) As Integer

參數

dataSet
DataSet

A DataSet 用來填充記錄,若需要,則用 schema。

ADODBRecordSet
Object

一個 ADO RecordsetRecord 物件。

srcTable
String

用於資料表映射的來源資料表。

傳回

成功新增或刷新的 DataSet列數。 這不包含那些不回傳列的語句所影響的列。

例外狀況

來源資料表無效。

備註

ActiveX 資料物件(ADO)與 ADO.NET 之間的連結是單向操作,你可以將資料從 ADO 複製到 DataSet,但資料的任何更新必須由 ADO.NET 處理。

Fill方法透過在 上呼叫NextRecordset方法Recordset,並在操作完成Fill時閉合輸入Recordset,來遍歷多個結果。

Fill 操作會將列加入指定的目標 DataTable 物件 DataSet,若該物件尚未存在,則建立 DataTable 該物件。 當你建立物件 DataTable 時,操作 Fill 通常只會產生欄位名稱的元資料。 然而,若 MissingSchemaAction 屬性設定為 AddWithKey,也會建立適當的主鍵與約束。

若存在主鍵資訊,重複的列會被調和,且只會在對應的 DataSetDataTable出現一次。 主鍵資訊可以透過 ,指定 FillSchema 的屬性PrimaryKey來設定DataTable,或將屬性設MissingSchemaActionAddWithKey

為了正確使用 OLE DB 的 .NET Framework Data Provider,AddWithKey 需要原生 OLE DB 提供者透過設定 DBPROP_UNIQUEROWS 屬性取得所需的主鍵資訊,然後透過檢查 IColumnsRowset 中的DBCOLUMN_KEYCOLUMN來判斷哪些欄位是主鍵欄位。 或者,使用者也可以明確設定每個 DataTable的主鍵約束。 這確保與現有紀錄相符的輸入紀錄會被更新,而非附加。

如果 傳SelectCommand回 OUTER JOIN 的結果,則 DataAdapter 不會為產生的 PrimaryKey設定DataTable值。 你必須明確定義主鍵,以確保重複列能正確解析。 如需詳細資訊,請參閱定義主索引鍵

若在操作開始Fill前閉合,Recordset則不會產生錯誤。 這是處理多個結果所必需的,因為不回傳列的查詢會以封閉 Recordset的 表示。 他們 OleDbDataAdapter 只是打電話 NextRecordset 給已關閉 Recordset 的,然後繼續處理。

若在填充資料集時遇到錯誤,錯誤發生前新增的列仍會保留在 DataSet。 其餘行動被中止。

如果 DbDataAdapter 物件在填充 一個 DataTable時遇到重複欄位,會產生後續欄位名稱,使用「欄位名稱1」、「欄位名稱2」、「欄位名稱3」等模式。 若輸入資料包含未命名欄位,則依照「Column1」、「Column2」等模式將它們置於 中 DataSet 。 當多個結果集加入時, DataSet 每個結果集會被放在獨立的表格中。 額外的結果集名稱是透過在指定的資料表名稱後加上整數值來命名(例如「Table」、「Table1」、「Table2」等)。 使用欄位名稱與資料表名稱的應用程式應確保不會與這些命名模式發生衝突。

ADO Recordset 中的值或 Record 物件會轉換為通用的執行時語言類型,以儲存在 DataSet

Note

此方法過載 Fill 會在填充操作完成時隱式呼叫 Close ADO 物件。

以下範例使用 來 OleDbDataAdapter 填充 , DataSet 使用一個 ADO Recordset 物件 Record 。 這個範例假設你已經建立了一個 ADO RecordSetRecord 一個物件。

Dim custDA As OleDbDataAdapter = New OleDbDataAdapter()
     Dim custDS As DataSet = New DataSet
     'Use ADO objects from ADO library (msado15.dll) imported
     ' as.NET library ADODB.dll using TlbImp.exe
     Dim adoConn As ADODB.Connection = New ADODB.Connection()
     Dim adoRS As ADODB.Recordset = New ADODB.Recordset()
     adoConn.Open("Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;", "", "", -1)
     adoRS.Open("SELECT * FROM Customers", adoConn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1)
     custDA.Fill(custDS, adoRS, "Customers")
     adoConn.Close()
OleDbDataAdapter custDA = new OleDbDataAdapter();
     DataSet custDS = new DataSet();
     //Use ADO objects from ADO library (msado15.dll) imported
     // as.NET library ADODB.dll using TlbImp.exe
     ADODB.Connection adoConn = new ADODB.Connection();
     ADODB.Recordset adoRS = new ADODB.Recordset();
     adoConn.Open("Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;", "", "", -1);
     adoRS.Open("SELECT * FROM Customers", adoConn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1);
     custDA.Fill(custDS, adoRS, "Customers");
     adoConn.Close();

另請參閱

適用於