SqlDataAdapter中Fill方法浅析

原创 2004年09月12日 14:57:00

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

使用目录内容建立菜单

目的:根据目录内容,建立一个菜单。菜单项为目录中的文件和子目录(以弹出方式显示)。解决方案:遍历子目录,建立一个文件路径数组。菜单项的ID是数组的索引。当用户单击某个菜单项时,从数组中读取文件路径并执...
  • jiangsheng
  • jiangsheng
  • 2001-08-02 22:58:00
  • 2072

SqlDataAdapter中Fill方法的分析

作者:山东人在成都    今天在测试一个数据库连接时,发现当使用SqlCommand的ExecuteReader方法打开一个DataReader后,如果没有关闭,再使用SqlDataAdapter类的...
  • netlightwind
  • netlightwind
  • 2006-04-07 23:54:00
  • 2483

DataAdapter的Fill方法

使用DataAdapter填充DataSet(1) 在选择了DataAdapter的类型(SqlDataAdapter或OleDbDataAdapter)并配置了DataAdapter来执行所需...
  • lllljz
  • lllljz
  • 2012-04-19 09:15:07
  • 13047

C#中SqlDataAdapter的使用小结

SqlDataAdapter概述 SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据。SqlDataAdapter通过对数据源使用适当的Transa...
  • gatieme
  • gatieme
  • 2014-03-07 11:04:13
  • 36230

关于FillSchema与Fill

FillSchema是用来向DataTable中填入详细的元数据信息的,例如(column names, primary key, constraints等),但不填入数据。 Fill主要是用来...
  • diligentcat
  • diligentcat
  • 2011-11-24 09:43:09
  • 2532

sqlDataAdapter的FillSchema用法

FillSchema是用来向DataTable中填入详细的元数据信息的,例如(column names, primary key, constraints等),但不填入数据。 Fill主要是用来填入...
  • bupt_zoucq
  • bupt_zoucq
  • 2011-08-02 12:44:06
  • 5243

SqlDataAdapter中的Fill方法(2)

上一篇中我们可以看出Fill方法最后都调用FillFromCommand和FillFromReader方法。那我们接着探讨FillFromCommand方法private int FillFromCo...
  • thinkingforever
  • thinkingforever
  • 2004-09-16 22:13:00
  • 3444

在执行Ado.net SqlDataAdapter 查询超时设置

在执行Sqlserver查询时报如下错误:  超时时间已到。在操作完成之前超时时间已过或服务器未响应。  修改方法:   using (SqlConnection connection = new...
  • QDseashore
  • QDseashore
  • 2015-12-21 11:10:24
  • 3975

SqlDataAdapter细节问题的讨论

原文传送门 如果使用SqlDataAdapter来查询数据返回给DataSet或者DataTable时需要注意以下几点: 1、如果SqlDataAdapter的SelectCommand的...
  • darkread
  • darkread
  • 2012-08-27 10:40:10
  • 3054

C# 解决SqlDataAdapter fill 已添加项问题

对已有项目维护时出现了这样一个bug。当执行完到下面的语句时 MySqlDataAdapter da = new MySqlDataAdapter(cmd); Da...
  • xiaoseqingchun
  • xiaoseqingchun
  • 2015-01-14 00:40:23
  • 869
收藏助手
不良信息举报
您举报文章:SqlDataAdapter中Fill方法浅析
举报原因:
原因补充:

(最多只允许输入30个字)