先来看看SqlDataAdapter中的所有成员
public sealed class SqlDataAdapter : DbDataAdapter, IDbDataAdapter, IDataAdapter, ICloneable
{
// Events
public event SqlRowUpdatedEventHandler RowUpdated;
public event SqlRowUpdatingEventHandler RowUpdating;
// Methods
public SqlDataAdapter();
public SqlDataAdapter(SqlCommand selectCommand);
private SqlDataAdapter(SqlDataAdapter adapter);
public SqlDataAdapter(string selectCommandText, SqlConnection selectConnection);
public SqlDataAdapter(string selectCommandText, string selectConnectionString);
protected override RowUpdatedEventArgs CreateRowUpdatedEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping);
protected override RowUpdatingEventArgs CreateRowUpdatingEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping);
protected override void Dispose(bool disposing);
protected override void OnRowUpdated(RowUpdatedEventArgs value);
protected override void OnRowUpdating(RowUpdatingEventArgs value);
IDbCommand IDbDataAdapter.get_DeleteCommand();
IDbCommand IDbDataAdapter.get_InsertCommand();
IDbCommand IDbDataAdapter.get_SelectCommand();
IDbCommand IDbDataAdapter.get_UpdateCommand();
void IDbDataAdapter.set_DeleteCommand(IDbCommand value);
void IDbDataAdapter.set_InsertCommand(IDbCommand value);
void IDbDataAdapter.set_SelectCommand(IDbCommand value);
void IDbDataAdapter.set_UpdateCommand(IDbCommand value);
object ICloneable.Clone();
// Properties
public SqlCommand DeleteCommand { get; set; }
public SqlCommand InsertCommand { get; set; }
public SqlCommand SelectCommand { get; set; }
public SqlCommand UpdateCommand { get; set; }
// Fields
private SqlCommand cmdDelete;
private SqlCommand cmdInsert;
private SqlCommand cmdSelect;
private SqlCommand cmdUpdate;
private SqlCommand internalCmdSelect;
}
其中并没有Fill方法,那么它从哪里来呢?想必是从它的父类DbDataAdapter中继承而来的那就
看看DbDataAdapter中的所有成员
public abstract class DbDataAdapter : DataAdapter, ICloneable
{
// Events
public event FillErrorEventHandler FillError;
// Methods
static DbDataAdapter();
protected DbDataAdapter();
protected DbDataAdapter(DbDataAdapter adapter);
private static DataTable[] AddDataTableToArray(DataTable[] tables, DataTable newTable);
private IDbCommand CloneCommand(IDbCommand command);
protected abstract RowUpdatedEventArgs CreateRowUpdatedEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping);
protected abstract RowUpdatingEventArgs CreateRowUpdatingEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping);
protected override void Dispose(bool disposing);
public override int Fill(DataSet dataSet);
public int Fill(DataTable dataTable);
public int Fill(DataSet dataSet, string srcTable);
protected virtual int Fill(DataTable dataTable, IDataReader dataReader);
protected virtual int Fill(DataTable dataTable, IDbCommand command, CommandBehavior behavior);
public int Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable);
protected virtual int Fill(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords);
protected virtual int Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior);
private void FillErrorHandler(Exception e, DataTable dataTable, object[] dataValues);
private int FillFromCommand(object data, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior);
internal int FillFromReader(object data, string srcTable, IDataReader dataReader, int startRecord, int maxRecords, DataColumn parentChapterColumn, object parentChapterValue);
private int FillLoadDataRow(SchemaMapping mapping);
private int FillLoadDataRowChunk(SchemaMapping mapping, int startRecord, int maxRecords);
private bool FillNextResult(IDataReader dataReader);
public override DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType);
public DataTable FillSchema(DataTable dataTable, SchemaType schemaType);
public DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType, string srcTable);
protected virtual DataTable FillSchema(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior);
protected virtual DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior);
private DataTable[] FillSchemaFromCommand(object data, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior);
private SchemaMapping FillSchemaMapping(object data, string srcTable, IDataReader dataReader, int schemaCount, DataColumn parentChapterColumn, object parentChapterValue);
private SchemaMapping FillSchemaMappingTry(object data, string srcTable, IDataReader dataReader, int schemaCount, DataColumn parentChapterColumn, object parentChapterValue);
private static IDbConnection GetConnection(IDbCommand command, string method);
public override IDataParameter[] GetFillParameters();
private static DataRowVersion GetParameterSourceVersion(StatementType typeIndex, IDataParameter parameter);
internal static string GetSourceTableName(string srcTable, int index);
protected virtual void OnFillError(FillErrorEventArgs value);
protected abstract void OnRowUpdated(RowUpdatedEventArgs value);
protected abstract void OnRowUpdating(RowUpdatingEventArgs value);
private void ParameterInput(IDataParameterCollection parameters, StatementType typeIndex, DataRow row, DataTableMapping mappings);
private void ParameterOutput(IDataParameterCollection parameters, StatementType typeIndex, DataRow row, DataTableMapping mappings);
private static void QuietClose(IDbConnection connection, ConnectionState originalState);
private static void QuietOpen(IDbConnection connection, out ConnectionState originalState);
object ICloneable.Clone();
public int Update(DataRow[] dataRows);
public override int Update(DataSet dataSet);
public int Update(DataTable dataTable);
protected virtual int Update(DataRow[] dataRows, DataTableMapping tableMapping);
public int Update(DataSet dataSet, string srcTable);
private void UpdateRow(RowUpdatedEventArgs rowUpdatedEvent, string commandType);
// Properties
private IDbCommand DeleteCommand { get; }
private IDbCommand InsertCommand { get; }
private IDbCommand SelectCommand { get; }
private IDbCommand UpdateCommand { get; }
private MissingMappingAction UpdateMappingAction { get; }
private MissingSchemaAction UpdateSchemaAction { get; }
// Fields
public const string DefaultSourceTableName = "Table";
private static readonly object EventFillError;
private bool hasFillErrorHandler;
}
其中果然有Fill方法,并且还重载好多次
先看看 public override int Fill(DataTable dataTable)方法
public override int Fill(DataSet dataSet)
{
return this.Fill(dataSet, 0, 0, "Table", this.SelectCommand, CommandBehavior.Default);
}
从override可以看出这个方法是重写了基类中的方法,而它的基类就是DataAdapter
那就在看看DataAdapter类中的Fill方法
public abstract class DataAdapter : Component, IDataAdapter
{
// Methods
protected DataAdapter();
protected DataAdapter(DataAdapter adapter);
protected virtual DataAdapter CloneInternals();
protected virtual DataTableMappingCollection CreateTableMappings();
protected override void Dispose(bool disposing);
public abstract int Fill(DataSet dataSet);//就在这里
public abstract DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType);
public abstract IDataParameter[] GetFillParameters();
internal DataTableMapping GetTableMappingBySchemaAction(string sourceTableName, string dataSetTableName, MissingMappingAction mappingAction);
internal int IndexOfDataSetTable(string dataSetTable);
protected virtual bool ShouldSerializeTableMappings();
ITableMappingCollection IDataAdapter.get_TableMappings();
public abstract int Update(DataSet dataSet);
// Properties
public bool AcceptChangesDuringFill { get; set; }
public bool ContinueUpdateOnError { get; set; }
public MissingMappingAction MissingMappingAction { get; set; }
public MissingSchemaAction MissingSchemaAction { get; set; }
public DataTableMappingCollection TableMappings { get; }
// Fields
private bool acceptChangesDuringFill;
private bool continueUpdateOnError;
private MissingMappingAction missingMappingAction;
private MissingSchemaAction missingSchemaAction;
private DataTableMappingCollection tableMappings;
}
在看看DataAdapter中其他Fill方法
public int Fill(DataTable dataTable)
{
if (dataTable == null)
{
throw ADP.FillRequires("dataTable");
}
IDbCommand command1 = this.SelectCommand;
if (command1 == null)
{
throw ADP.MissingSelectCommand("Fill");
}
string text1 = dataTable.TableName;
int num1 = base.IndexOfDataSetTable(text1);
if (-1 != num1)
{
text1 = base.TableMappings[num1].SourceTable;
}
return this.Fill(dataTable, command1, CommandBehavior.SingleResult);
}
public int Fill(DataSet dataSet, string srcTable)
{
return this.Fill(dataSet, 0, 0, srcTable, this.SelectCommand, CommandBehavior.Default);
}
protected virtual int Fill(DataTable dataTable, IDataReader dataReader)
{
if (dataTable == null)
{
throw ADP.FillRequires("dataTable");
}
if (dataReader == null)
{
throw ADP.FillRequires("dataReader");
}
if (!dataReader.IsClosed && (dataReader.FieldCount > 0))
{
return this.FillFromReader(dataTable, null, dataReader, 0, 0, null, null);
}
return 0;
}
protected virtual int Fill(DataTable dataTable, IDbCommand command, CommandBehavior behavior)
{
if (dataTable == null)
{
throw ADP.FillRequires("dataTable");
}
if (command == null)
{
throw ADP.MissingSelectCommand("Fill");
}
return this.FillFromCommand(dataTable, 0, 0, null, command, behavior);
}
public int Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable)
{
return this.Fill(dataSet, startRecord, maxRecords, srcTable, this.SelectCommand, CommandBehavior.Default);
}
protected virtual int Fill(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords)
{
if (dataSet == null)
{
throw ADP.FillRequires("dataSet");
}
if (ADP.IsEmpty(srcTable))
{
throw ADP.FillRequiresSourceTableName("srcTable");
}
if (dataReader == null)
{
throw ADP.FillRequires("dataReader");
}
if (startRecord < 0)
{
throw ADP.InvalidStartRecord("startRecord", startRecord);
}
if (maxRecords < 0)
{
throw ADP.InvalidMaxRecords("maxRecords", maxRecords);
}
if (dataReader.IsClosed)
{
return 0;
}
return this.FillFromReader(dataSet, srcTable, dataReader, startRecord, maxRecords, null, null);
}
protected virtual int Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior)
{
if (dataSet == null)
{
throw ADP.FillRequires("dataSet");
}
if (command == null)
{
throw ADP.MissingSelectCommand("Fill");
}
if (startRecord < 0)
{
throw ADP.InvalidStartRecord("startRecord", startRecord);
}
if (maxRecords < 0)
{
throw ADP.InvalidMaxRecords("maxRecords", maxRecords);
}
if (ADP.IsEmpty(srcTable))
{
throw ADP.FillRequiresSourceTableName("srcTable");
}
return this.FillFromCommand(dataSet, startRecord, maxRecords, srcTable, command, behavior);
}
其实我们可以看到Fill方法调用了FillFromCommand或FillFromReader方法。这两个方法在下篇文章中在讨论。