OleDbDataAdapter.Fill 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
加入或重新整理 DataSet 中的資料列,以符合在 ADO Recordset
或 Record
物件中的資料列。
多載
Fill(DataTable, Object) |
使用指定的 DataTable 和 ADO 物件,加入或重新整理 DataTable 中的資料列,以符合在 ADO |
Fill(DataSet, Object, String) |
使用指定的 DataSet、ADO 物件和來源資料表名稱,加入或重新整理 DataSet 中的資料列,以符合在 ADO |
Fill(DataTable, Object)
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
參數
- ADODBRecordSet
- Object
ADO Recordset
或 Record
物件。
傳回
DataTable 中重新整理成功的資料列數目。 這不包含被不傳回資料列之陳述式所影響的資料列。
備註
ActiveX Data Objects (ADO) 和 ADO.NET 之間的連結是一種單向作業,可讓您將數據從 ADO DataSet複製到 ,但必須 ADO.NET 處理對數據的任何更新。
方法的Fill這個多載不會在作業完成Fill時關閉輸入Recordset
。
處理傳回多個結果的批次 SQL 語句時,OLE DB.NET Framework Data Provider 的這個 FillFillSchema 實作只會擷取第一個結果的架構資訊。
作業會將Fill數據列新增至 中指定的DataSet目的地DataTable物件,如果物件不存在,就會DataTable建立物件。 當您建立 DataTable 物件時, Fill 作業通常會只建立數據行名稱元數據。 不過,如果 MissingSchemaAction 屬性設定 AddWithKey
為 ,也會建立適當的主鍵和條件約束。
您可以在相同的 DataTable上多次使用 Fill 方法。 如果主鍵存在,傳入的數據列會與已經存在的相符數據列合併。 如果沒有主鍵存在,傳入的數據列會附加至 DataTable。 如果主要索引鍵資訊存在,則會協調任何重複的數據列,而且只會在 對應至的 DataSet中DataTable出現一次。 可以透過 FillSchema來設定主鍵資訊,方法是指定 PrimaryKey 的 DataTable屬性,或將 屬性設定 MissingSchemaAction 為 AddWithKey
。
如果 SelectCommand 傳回 OUTER JOIN 的結果,則 DataAdapter
便不會為產生的 PrimaryKey 設定 DataTable值。 您必須明確定義主鍵,以確保已正確解析重複的數據列。 如需詳細資訊,請參閱定義主索引鍵。
若要使用 .NET Framework Data Provider for OLE DB 正常運作,AddWithKey
需要原生 OLE DB 提供者藉由設定 DBPROP_UNIQUEROWS 屬性來取得必要的主鍵資訊,然後檢查 中的IColumnsRowset
DBCOLUMN_KEYCOLUMN來判斷哪些數據行是主鍵數據行。 或者,用戶可以在每個 上 DataTable明確設定主鍵條件約束。 這可確保符合現有記錄的傳入記錄會更新,而不是附加。
如果在填入 DataTable時遇到重複的數據行,則會使用模式 「columnname 1」、“columnname2”、“columnname3” 等,產生後續數據行的名稱。OleDbDataAdapter 空的數據行名稱會新增至 DataTable,針對第一個數據行使用空字串串,後面接著 「1」、“2”、“3”,依此類傳給後續空白數據行。
ADO Recordset
或 Record
物件中的值會轉換成 中記憶體的 DataSetCommon Language Runtime 類型。
警告
當填滿作業完成時,此方法的 Fill 這個多載不會在 ADO 物件上隱含呼叫 Close
。 因此,當您完成使用 ADO Recordset
或 Record
物件時,請一律呼叫 Close
。 這可確保數據源的基礎聯機會及時釋放,而且也會防止因現有參考仍然存在時垃圾收集所回收的 Unmanaged ADO 物件而造成可能的存取違規。
當您在上DataAdapter
呼叫 TableMappings.Add
方法,並明確將源數據表參數對應至空字串時,數據集會使用源數據表成功填入,但數據集不會填入任何內容。 例如,在下列範例中, rDataSet
不會填入任何內容。
rAdapter.TableMappings.Add("source table", "");
rAdapter.Fill(rDataSet, "source table");
此範例示範如何在處理多個結果時略過結果。
下列範例會使用 使用 OleDbDataAdapter ADO Recordset
填滿 DataTable 。 這個範例假設您已建立 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)
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
參數
- ADODBRecordSet
- Object
ADO Recordset
或 Record
物件。
- srcTable
- String
用於資料表對應的來源資料表。
傳回
成功加入至 DataSet 或在其中重新整理的資料列數目。 這不包含被不傳回資料列之陳述式所影響的資料列。
例外狀況
來源資料表無效。
備註
ActiveX Data Objects (ADO) 和 ADO.NET 之間的連結是一種單向作業,可讓您將數據從 ADO DataSet複製到 ,但必須 ADO.NET 處理對數據的任何更新。
方法Fill會藉由在 上Recordset
呼叫 NextRecordset
方法,在完成Fill作業時關閉輸入Recordset
,逐一查看多個結果。
作業會將Fill數據列新增至 中指定的DataSet目的地DataTable物件,如果物件不存在,就會DataTable建立物件。 當您建立 DataTable 物件時, Fill 作業通常會只建立數據行名稱元數據。 不過,如果 MissingSchemaAction 屬性設定 AddWithKey
為 ,也會建立適當的主鍵和條件約束。
如果主要索引鍵資訊存在,則會協調任何重複的數據列,而且只會在 對應至的 DataSet中DataTable出現一次。 可以透過 FillSchema來設定主鍵資訊,方法是指定 PrimaryKey 的 DataTable屬性,或將 屬性設定 MissingSchemaAction 為 AddWithKey
。
若要使用 .NET Framework Data Provider for OLE DB 正常運作,AddWithKey
需要原生 OLE DB 提供者藉由設定 DBPROP_UNIQUEROWS 屬性來取得必要的主鍵資訊,然後藉由檢查 IColumnsRowset 中的DBCOLUMN_KEYCOLUMN來判斷哪些數據行是主鍵數據行。 或者,用戶可以在每個 上 DataTable明確設定主鍵條件約束。 這確保與現有資料錄相符的連入資料錄是更新,而不是附加。
如果 SelectCommand 傳回 OUTER JOIN 的結果,則 DataAdapter
便不會為產生的 PrimaryKey 設定 DataTable值。 您必須明確定義主鍵,以確保已正確解析重複的數據列。 如需詳細資訊,請參閱定義主索引鍵。
Recordset
如果在開始作業之前Fill關閉 ,則不會產生任何錯誤結果。 這是處理多個結果的必要專案,因為不會傳回數據列的查詢是由封閉 Recordset
的 表示。 只會 OleDbDataAdapter 呼叫 NextRecordset
已關閉 Recordset
的 ,並繼續處理。
如果在填入數據集時發生錯誤,在發生錯誤之前加入的數據列會保留在 中 DataSet。 作業的其餘部分已中止。
如果對象在填入 DataTable時遇到重複的數據行,則會使用模式 「columnname 1」、“columnname2”、“columnname3” 等,產生後續數據行的名稱。DbDataAdapter 如果傳入數據包含未命名的數據行,則會根據模式 「Column1」、“Column2” 等,將它們放在 DataSet 中。 將多個結果集加入至每個結果集時, DataSet 會放在個別的數據表中。 其他結果集的命名方式是將整數值附加至指定的數據表名稱 (,例如 “Table”、“Table1”、“Table2” 等等。) 。 使用數據行和數據表名稱的應用程式應該確定不會發生與這些命名模式衝突。
ADO Recordset
或 Record
物件中的值會轉換成 中記憶體的 DataSetCommon Language Runtime 類型。
注意
當填滿作業完成時,此方法的 Fill 這個多載會在 ADO 物件上隱含呼叫 Close
。
下列範例會使用 OleDbDataAdapter ADO Record
物件的 ADO Recordset
填滿 DataSet 。 此範例假設您已建立 ADO RecordSet
和 Record
物件。
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();