Adds or refreshes rows in a System.Data.DataTable to match those in an ADO Recordset or Record object using the specified System.Data.DataTable and ADO objects.
- dataTable
- A System.Data.DataTable to fill with records and, if it is required, schema.
- ADODBRecordSet
- An ADO Recordset or Record object.
The number of rows successfully refreshed to the System.Data.DataTable. This does not include rows affected by statements that do not return rows.
The link between ActiveX Data Objects (ADO) and ADO.NET is a one-way operation in that you can copy data from ADO to the System.Data.DataSet, but any updates to the data must be handled by ADO.NET.
This overload of the OleDbDataAdapter.Fill(System.Data.DataTable, object) method does not close the input Recordset on completion of the OleDbDataAdapter.Fill(System.Data.DataTable, object) operation.
When handling batch SQL statements that return multiple results, this implementation of OleDbDataAdapter.Fill(System.Data.DataTable, object) and System.Data.Common.DbDataAdapter.FillSchema(System.Data.DataTable, System.Data.SchemaType) for the OLE DB.NET Framework Data Provider retrieves schema information for only the first result.
The OleDbDataAdapter.Fill(System.Data.DataTable, object) operation adds the rows to the specified destination System.Data.DataTable object in the System.Data.DataSet, creating the System.Data.DataTable object if it does not already exist. When you create a System.Data.DataTable object, the OleDbDataAdapter.Fill(System.Data.DataTable, object) operation ordinarily creates only column name metadata. However, if the System.Data.Common.DataAdapter.MissingSchemaAction property is set to AddWithKey, appropriate primary keys and constraints are also created.
You can use the OleDbDataAdapter.Fill(System.Data.DataTable, object) method multiple times on the same System.Data.DataTable. If a primary key exists, incoming rows are merged with matching rows that already exist. If no primary key exists, incoming rows are appended to the System.Data.DataTable. If primary key information is present, any duplicate rows are reconciled and only appear one time in the System.Data.DataTable that corresponds to the System.Data.DataSet. Primary key information may be set either through System.Data.Common.DbDataAdapter.FillSchema(System.Data.DataTable, System.Data.SchemaType), by specifying the System.Data.DataTable.PrimaryKey property of the System.Data.DataTable, or by setting the System.Data.Common.DataAdapter.MissingSchemaAction property to AddWithKey.
If the OleDbDataAdapter.SelectCommand returns the results of an OUTER JOIN, the DataAdapter does not set a System.Data.DataTable.PrimaryKey value for the resulting System.Data.DataTable. You must explicitly define the primary key to make sure that duplicate rows are resolved correctly. For more information, see Defining a Primary Key for a Table.
To function correctly with the .NET Framework Data Provider for OLE DB, AddWithKey requires that the native OLE DB provider obtains required primary key information by setting the DBPROP_UNIQUEROWS property, and then determines which columns are primary key columns by examining DBCOLUMN_KEYCOLUMN in the IColumnsRowset. Alternatively the user may explicitly set the primary key constraints on each System.Data.DataTable. This makes sure that incoming records that match existing records are updated instead of appended.
If the System.Data.OleDb.OleDbDataAdapter encounters duplicate columns while populating a System.Data.DataTable, it generates names for the subsequent columns, using the pattern "columnname1", "columnname2", "columnname3", and so on. Empty column names are added to the System.Data.DataTable, using an empty string for the first column, followed by "1", "2", "3", and so on for the subsequent empty columns.
Values in ADO Recordset or Record objects are converted to common language runtime types for storage in the System.Data.DataSet.
This overload of the OleDbDataAdapter.Fill(System.Data.DataTable, object) method does not implicitly call Close on the ADO object when the fill operation is complete. Therefore, always call Close when you are finished using ADO Recordset or Record objects. This makes sure that the underlying connection to a data source is released in a timely manner, and also prevents possible access violations because of unmanaged ADO objects being reclaimed by garbage collection when existing references still exist.
When you call the TableMappings.Add method on a DataAdapter and you explicitly map the source table parameter to an empty string, the dataset is successfully filled using the source table, but the dataset will be populated with nothing. For example, in the following example, rDataSet will be populated with nothing.
Example
rAdapter.TableMappings.Add("source table", ""); rAdapter.Fill(rDataSet, "source table");
This example shows how you can skip a result when dealing with multiple results.
The following example uses an System.Data.OleDb.OleDbDataAdapter to fill a System.Data.DataTable using an ADO Recordset. This example assumes that you have created an ADO Recordset.
Example
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()
Example
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();