OleDbDataAdapter.Fill 方法

定义

DataSet 中添加或刷新行,以便与 ADO RecordsetRecord 对象中的行相匹配。

重载

Fill(DataTable, Object)

使用指定的 DataTable 和 ADO 对象,在 DataTable 中添加或刷新行,以便与 ADO RecordsetRecord 对象中的行相匹配。

Fill(DataSet, Object, String)

使用指定的 DataSet、ADO 对象和源表名称,添加或刷新 DataSet 中的行,使之与 ADO RecordsetRecord 对象中的行相匹配。

Fill(DataTable, Object)

Source:
OleDbDataAdapter.cs
Source:
OleDbDataAdapter.cs
Source:
OleDbDataAdapter.cs

使用指定的 DataTable 和 ADO 对象,在 DataTable 中添加或刷新行,以便与 ADO RecordsetRecord 对象中的行相匹配。

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

要用记录和架构(如果需要)填充的一个 DataTable

ADODBRecordSet
Object

一个 ADO RecordsetRecord 对象。

返回

已对 DataTable 成功刷新的行数。 这不包括受不返回行的语句影响的行。

注解

ActiveX 数据对象 (ADO) 和 ADO.NET 之间的链接是一种单向操作,你可以在其中将数据从 ADO 复制到 DataSet,但对数据的任何更新必须由 ADO.NET 处理。

方法的Fill此重载不会在操作完成Fill时关闭输入Recordset

处理返回多个结果的 Fill 批处理 SQL 语句时,对于 OLE DB.NET Framework 数据提供程序,和 FillSchema 的此实现仅检索第一个结果的架构信息。

操作 Fill 将行添加到 中的指定目标 DataTable 对象, DataSet如果对象尚不存在, DataTable 则创建该对象。 创建 DataTable 对象时, Fill 该操作通常只创建列名元数据。 但是,如果 属性 MissingSchemaAction 设置为 AddWithKey,也会创建适当的主键和约束。

可以在同一FillDataTable个 上多次使用 方法。 如果存在主键,传入的行将与已存在的匹配行合并。 如果不存在主键,传入行将追加到 。DataTable 如果存在主键信息,则会协调任何重复行,并且仅在 对应于 的 DataSetDataTable出现一次。 可以通过 ,通过指定 的 属性DataTable或将 属性设置为 AddWithKeyMissingSchemaAction 来设置FillSchema主键PrimaryKey信息。

如果 SelectCommand 返回 OUTER JOIN 的结果,则 DataAdapter 不会为生成的 PrimaryKey 设置 DataTable值。 必须显式定义主键,以确保正确解析重复行。 有关详细信息,请参阅定义主键

若要使用 OLE DB 的 .NET Framework 数据提供程序正确运行,AddWithKey需要本机 OLE DB 访问接口通过设置 DBPROP_UNIQUEROWS 属性获取所需的主键信息,然后通过检查 中的IColumnsRowsetDBCOLUMN_KEYCOLUMN来确定哪些列是主键列。 或者,用户可以在每个 DataTable上显式设置主键约束。 这可确保更新与现有记录匹配的传入记录,而不是追加。

如果在填充 DataTable时遇到重复列,它将使用模式“columnname1”、“columnname2”、“columnname3”等模式为后续列生成名称。OleDbDataAdapter 空列名称将添加到 , DataTable第一列使用空字符串,后跟后续空列的“1”、“2”、“3”等。

ADO RecordsetRecord 对象中的值将转换为公共语言运行时类型, DataSet以便在 中存储。

注意

填充操作完成后, Fill 方法的此重载不会隐式调用 Close ADO 对象。 因此,在使用完 ADO RecordsetRecord 对象后,始终调用 Close 。 这可确保及时释放与数据源的基础连接,并防止在现有引用仍然存在时垃圾回收回收非托管 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)

Source:
OleDbDataAdapter.cs
Source:
OleDbDataAdapter.cs
Source:
OleDbDataAdapter.cs

使用指定的 DataSet、ADO 对象和源表名称,添加或刷新 DataSet 中的行,使之与 ADO RecordsetRecord 对象中的行相匹配。

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

要用记录和架构(如果需要)填充的一个 DataSet

ADODBRecordSet
Object

一个 ADO RecordsetRecord 对象。

srcTable
String

用于表映射的源表。

返回

已在 DataSet 中成功添加或刷新的行数。 这不包括受不返回行的语句影响的行。

例外

源表无效。

注解

ActiveX 数据对象 (ADO) 和 ADO.NET 之间的链接是一种单向操作,你可以在其中将数据从 ADO 复制到 DataSet,但对数据的任何更新必须由 ADO.NET 处理。

方法Fill通过在 上Recordset调用 NextRecordset 方法循环访问多个结果,在操作完成Fill时关闭输入Recordset

操作 Fill 将行添加到 中的指定目标 DataTable 对象, DataSet如果对象尚不存在, DataTable 则创建该对象。 创建 DataTable 对象时, Fill 该操作通常只创建列名元数据。 但是,如果 属性 MissingSchemaAction 设置为 AddWithKey,也会创建适当的主键和约束。

如果存在主键信息,则会协调任何重复行,并且仅在 对应于 的 DataSetDataTable出现一次。 可以通过 ,通过指定 的 属性DataTable或将 属性设置为 AddWithKeyMissingSchemaAction 来设置FillSchema主键PrimaryKey信息。

若要使用适用于 OLE DB 的 .NET Framework 数据提供程序正常运行,AddWithKey需要本机 OLE DB 访问接口通过设置 DBPROP_UNIQUEROWS 属性来获取所需的主键信息,然后通过检查 IColumnsRowset 中的DBCOLUMN_KEYCOLUMN来确定哪些列是主键列。 或者,用户可以在每个 DataTable上显式设置主键约束。 这将确保对与现有记录匹配的传入记录进行更新,而不是追加。

如果 SelectCommand 返回 OUTER JOIN 的结果,则 DataAdapter 不会为生成的 PrimaryKey 设置 DataTable值。 必须显式定义主键,以确保正确解析重复行。 有关详细信息,请参阅定义主键

Recordset如果在操作开始Fill前关闭 ,则不会产生错误。 这是处理多个结果所必需的,因为不返回行的查询由关闭 Recordset的 指示。 仅 OleDbDataAdapter 调用 NextRecordset 已关闭 Recordset 并继续处理。

如果在填充数据集时遇到错误,则在发生错误之前添加的行将保留在 中 DataSet。 操作的其余部分已中止。

如果 对象在 DbDataAdapter 填充 DataTable时遇到重复的列,它将使用模式“columnname 1”、“columnname2”、“columnname3”等模式为后续生成名称。 如果传入数据包含未命名的列,则根据模式“Column1”、“Column2”等将其放置在 DataSet 中。 将多个结果集添加到时, DataSet 每个结果集都放置在单独的表中。 通过将整型值追加到指定的表名称 (例如“Table”、“Table1”、“Table2”等来命名其他结果集。) 。 使用列和表名称的应用程序应确保不会发生与这些命名模式冲突的情况。

ADO RecordsetRecord 对象中的值将转换为公共语言运行时类型, DataSet以便在 中存储。

注意

填充操作完成时, Fill 方法的此重载隐式调用 Close ADO 对象。

以下示例使用 使用 OleDbDataAdapter ADO 对象的 ADO RecordsetRecord 填充 DataSet 。 此示例假定你已创建 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();  

另请参阅

适用于