分享
 
 
 

SqlDataAdapter中Fill方法浅析

王朝mssql·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有