先来看看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方法。这两个方法在下篇文章中在讨论。

|