| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780 |
- //------------------------------------------------------------------------------
- // <copyright file="DataAdapter.cs" company="Microsoft">
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // </copyright>
- // <owner current="true" primary="true">Microsoft</owner>
- // <owner current="true" primary="false">Microsoft</owner>
- //------------------------------------------------------------------------------
- namespace System.Data.Common {
- using System;
- using System.ComponentModel;
- using System.Data;
- using System.Data.ProviderBase;
- using System.Diagnostics;
- using System.Globalization;
- using System.Threading;
- public class DataAdapter : Component, IDataAdapter { // V1.0.3300
- static private readonly object EventFillError = new object();
- private bool _acceptChangesDuringUpdate = true;
- private bool _acceptChangesDuringUpdateAfterInsert = true;
- private bool _continueUpdateOnError = false;
- private bool _hasFillErrorHandler = false;
- private bool _returnProviderSpecificTypes = false;
- private bool _acceptChangesDuringFill = true;
- private LoadOption _fillLoadOption;
- private MissingMappingAction _missingMappingAction = System.Data.MissingMappingAction.Passthrough;
- private MissingSchemaAction _missingSchemaAction = System.Data.MissingSchemaAction.Add;
- private DataTableMappingCollection _tableMappings;
- private static int _objectTypeCount; // Bid counter
- internal readonly int _objectID = System.Threading.Interlocked.Increment(ref _objectTypeCount);
- #if DEBUG
- // if true, we are asserting that the caller has provided a select command
- // which should not return an empty result set
- private bool _debugHookNonEmptySelectCommand = false;
- #endif
- [Conditional("DEBUG")]
- void AssertReaderHandleFieldCount(DataReaderContainer readerHandler) {
- #if DEBUG
- Debug.Assert(!_debugHookNonEmptySelectCommand || readerHandler.FieldCount > 0, "Scenario expects non-empty results but no fields reported by reader");
- #endif
- }
- [Conditional("DEBUG")]
- void AssertSchemaMapping(SchemaMapping mapping) {
- #if DEBUG
- if (_debugHookNonEmptySelectCommand) {
- Debug.Assert(mapping != null && mapping.DataValues != null && mapping.DataTable != null, "Debug hook specifies that non-empty results are not expected");
- }
- #endif
- }
- protected DataAdapter() : base() { // V1.0.3300
- GC.SuppressFinalize(this);
- }
- protected DataAdapter(DataAdapter from) : base() { // V1.1.3300
- CloneFrom(from);
- }
- [
- DefaultValue(true),
- ResCategoryAttribute(Res.DataCategory_Fill),
- ResDescriptionAttribute(Res.DataAdapter_AcceptChangesDuringFill),
- ]
- public bool AcceptChangesDuringFill { // V1.0.3300
- get {
- //Bid.Trace("<comm.DataAdapter.get_AcceptChangesDuringFill|API> %d#\n", ObjectID);
- return _acceptChangesDuringFill;
- }
- set {
- _acceptChangesDuringFill = value;
- //Bid.Trace("<comm.DataAdapter.set_AcceptChangesDuringFill|API> %d#, %d\n", ObjectID, value);
- }
- }
- [
- EditorBrowsableAttribute(EditorBrowsableState.Never)
- ]
- virtual public bool ShouldSerializeAcceptChangesDuringFill() {
- return (0 == _fillLoadOption);
- }
- [
- DefaultValue(true),
- ResCategoryAttribute(Res.DataCategory_Update),
- ResDescriptionAttribute(Res.DataAdapter_AcceptChangesDuringUpdate),
- ]
- public bool AcceptChangesDuringUpdate { // V1.2.3300, MDAC 74988
- get {
- //Bid.Trace("<comm.DataAdapter.get_AcceptChangesDuringUpdate|API> %d#\n", ObjectID);
- return _acceptChangesDuringUpdate;
- }
- set {
- _acceptChangesDuringUpdate = value;
- //Bid.Trace("<comm.DataAdapter.set_AcceptChangesDuringUpdate|API> %d#, %d\n", ObjectID, value);
- }
- }
- [
- DefaultValue(false),
- ResCategoryAttribute(Res.DataCategory_Update),
- ResDescriptionAttribute(Res.DataAdapter_ContinueUpdateOnError),
- ]
- public bool ContinueUpdateOnError { // V1.0.3300, MDAC 66900
- get {
- //Bid.Trace("<comm.DataAdapter.get_ContinueUpdateOnError|API> %d#\n", ObjectID);
- return _continueUpdateOnError;
- }
- set {
- _continueUpdateOnError = value;
- //Bid.Trace("<comm.DataAdapter.set_ContinueUpdateOnError|API> %d#, %d\n", ObjectID, value);
- }
- }
- [
- RefreshProperties(RefreshProperties.All),
- ResCategoryAttribute(Res.DataCategory_Fill),
- ResDescriptionAttribute(Res.DataAdapter_FillLoadOption),
- ]
- public LoadOption FillLoadOption { // V1.2.3300
- get {
- //Bid.Trace("<comm.DataAdapter.get_FillLoadOption|API> %d#\n", ObjectID);
- LoadOption fillLoadOption = _fillLoadOption;
- return ((0 != fillLoadOption) ? _fillLoadOption : LoadOption.OverwriteChanges);
- }
- set {
- switch(value) {
- case 0: // to allow simple resetting
- case LoadOption.OverwriteChanges:
- case LoadOption.PreserveChanges:
- case LoadOption.Upsert:
- _fillLoadOption = value;
- //Bid.Trace("<comm.DataAdapter.set_FillLoadOption|API> %d#, %d{ds.LoadOption}\n", ObjectID, (int)value);
- break;
- default:
- throw ADP.InvalidLoadOption(value);
- }
- }
- }
- [
- EditorBrowsableAttribute(EditorBrowsableState.Never)
- ]
- public void ResetFillLoadOption() {
- _fillLoadOption = 0;
- }
- [
- EditorBrowsableAttribute(EditorBrowsableState.Never)
- ]
- virtual public bool ShouldSerializeFillLoadOption() {
- return (0 != _fillLoadOption);
- }
- [
- DefaultValue(System.Data.MissingMappingAction.Passthrough),
- ResCategoryAttribute(Res.DataCategory_Mapping),
- ResDescriptionAttribute(Res.DataAdapter_MissingMappingAction),
- ]
- public MissingMappingAction MissingMappingAction { // V1.0.3300
- get {
- //Bid.Trace("<comm.DataAdapter.get_MissingMappingAction|API> %d#\n", ObjectID);
- return _missingMappingAction;
- }
- set {
- switch(value) { // @perfnote: Enum.IsDefined
- case MissingMappingAction.Passthrough:
- case MissingMappingAction.Ignore:
- case MissingMappingAction.Error:
- _missingMappingAction = value;
- //Bid.Trace("<comm.DataAdapter.set_MissingMappingAction|API> %d#, %d{ds.MissingMappingAction}\n", ObjectID, (int)value);
- break;
- default:
- throw ADP.InvalidMissingMappingAction(value);
- }
- }
- }
- [
- DefaultValue(Data.MissingSchemaAction.Add),
- ResCategoryAttribute(Res.DataCategory_Mapping),
- ResDescriptionAttribute(Res.DataAdapter_MissingSchemaAction),
- ]
- public MissingSchemaAction MissingSchemaAction { // V1.0.3300
- get {
- //Bid.Trace("<comm.DataAdapter.get_MissingSchemaAction|API> %d#\n", ObjectID);
- return _missingSchemaAction;
- }
- set {
- switch(value) { // @perfnote: Enum.IsDefined
- case MissingSchemaAction.Add:
- case MissingSchemaAction.Ignore:
- case MissingSchemaAction.Error:
- case MissingSchemaAction.AddWithKey:
- _missingSchemaAction = value;
- //Bid.Trace("<comm.DataAdapter.set_MissingSchemaAction|API> %d#, %d{MissingSchemaAction}\n", ObjectID, (int)value);
- break;
- default:
- throw ADP.InvalidMissingSchemaAction(value);
- }
- }
- }
- internal int ObjectID {
- get {
- return _objectID;
- }
- }
- [
- DefaultValue(false),
- ResCategoryAttribute(Res.DataCategory_Fill),
- ResDescriptionAttribute(Res.DataAdapter_ReturnProviderSpecificTypes),
- ]
- virtual public bool ReturnProviderSpecificTypes {
- get {
- //Bid.Trace("<comm.DataAdapter.get_ReturnProviderSpecificTypes|API> %d#\n", ObjectID);
- return _returnProviderSpecificTypes;
- }
- set {
- _returnProviderSpecificTypes = value;
- //Bid.Trace("<comm.DataAdapter.set_ReturnProviderSpecificTypes|API> %d#, %d\n", ObjectID, (int)value);
- }
- }
- [
- DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
- ResCategoryAttribute(Res.DataCategory_Mapping),
- ResDescriptionAttribute(Res.DataAdapter_TableMappings),
- ]
- public DataTableMappingCollection TableMappings { // V1.0.3300
- get {
- //Bid.Trace("<comm.DataAdapter.get_TableMappings|API> %d#\n", ObjectID);
- DataTableMappingCollection mappings = _tableMappings;
- if (null == mappings) {
- mappings = CreateTableMappings();
- if (null == mappings) {
- mappings = new DataTableMappingCollection();
- }
- _tableMappings = mappings;
- }
- return mappings; // constructed by base class
- }
- }
- ITableMappingCollection IDataAdapter.TableMappings { // V1.0.3300
- get {
- return TableMappings;
- }
- }
- virtual protected bool ShouldSerializeTableMappings() { // V1.0.3300, MDAC 65548
- return true; /*HasTableMappings();*/ // VS7 300569
- }
- protected bool HasTableMappings() { // V1.2.3300
- return ((null != _tableMappings) && (0 < TableMappings.Count));
- }
- [
- ResCategoryAttribute(Res.DataCategory_Fill),
- ResDescriptionAttribute(Res.DataAdapter_FillError),
- ]
- public event FillErrorEventHandler FillError { // V1.2.3300, DbDataADapter V1.0.3300
- add {
- _hasFillErrorHandler = true;
- Events.AddHandler(EventFillError, value);
- }
- remove {
- Events.RemoveHandler(EventFillError, value);
- }
- }
- [ Obsolete("CloneInternals() has been deprecated. Use the DataAdapter(DataAdapter from) constructor. http://go.microsoft.com/fwlink/?linkid=14202") ] // V1.1.3300, MDAC 81448
- [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")] // MDAC 82936
- virtual protected DataAdapter CloneInternals() { // V1.0.3300
- DataAdapter clone = (DataAdapter)Activator.CreateInstance(GetType(), System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance, null, null, CultureInfo.InvariantCulture, null);
- clone.CloneFrom(this);
- return clone;
- }
- private void CloneFrom(DataAdapter from) {
- _acceptChangesDuringUpdate = from._acceptChangesDuringUpdate;
- _acceptChangesDuringUpdateAfterInsert = from._acceptChangesDuringUpdateAfterInsert;
- _continueUpdateOnError = from._continueUpdateOnError;
- _returnProviderSpecificTypes = from._returnProviderSpecificTypes; // WebData 101795
- _acceptChangesDuringFill = from._acceptChangesDuringFill;
- _fillLoadOption = from._fillLoadOption;
- _missingMappingAction = from._missingMappingAction;
- _missingSchemaAction = from._missingSchemaAction;
- if ((null != from._tableMappings) && (0 < from.TableMappings.Count)) {
- DataTableMappingCollection parameters = this.TableMappings;
- foreach(object parameter in from.TableMappings) {
- parameters.Add((parameter is ICloneable) ? ((ICloneable)parameter).Clone() : parameter);
- }
- }
- }
- virtual protected DataTableMappingCollection CreateTableMappings() { // V1.0.3300
- Bid.Trace("<comm.DataAdapter.CreateTableMappings|API> %d#\n", ObjectID);
- return new DataTableMappingCollection();
- }
- override protected void Dispose(bool disposing) { // V1.0.3300, MDAC 65459
- if (disposing) { // release mananged objects
- _tableMappings = null;
- }
- // release unmanaged objects
- base.Dispose(disposing); // notify base classes
- }
- virtual public DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType) { // V1.0.3300
- throw ADP.NotSupported();
- }
- virtual protected DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType, string srcTable, IDataReader dataReader) { // V1.2.3300
- IntPtr hscp;
- Bid.ScopeEnter(out hscp, "<comm.DataAdapter.FillSchema|API> %d#, dataSet, schemaType=%d{ds.SchemaType}, srcTable, dataReader\n", ObjectID, (int)schemaType);
- try {
- if (null == dataSet) {
- throw ADP.ArgumentNull("dataSet");
- }
- if ((SchemaType.Source != schemaType) && (SchemaType.Mapped != schemaType)) {
- throw ADP.InvalidSchemaType(schemaType);
- }
- if (ADP.IsEmpty(srcTable)) {
- throw ADP.FillSchemaRequiresSourceTableName("srcTable");
- }
- if ((null == dataReader) || dataReader.IsClosed) {
- throw ADP.FillRequires("dataReader");
- }
- // user must Close/Dispose of the dataReader
- object value = FillSchemaFromReader(dataSet, null, schemaType, srcTable, dataReader);
- return (DataTable[]) value;
- }
- finally {
- Bid.ScopeLeave(ref hscp);
- }
- }
- virtual protected DataTable FillSchema(DataTable dataTable, SchemaType schemaType, IDataReader dataReader) { // V1.2.3300
- IntPtr hscp;
- Bid.ScopeEnter(out hscp, "<comm.DataAdapter.FillSchema|API> %d#, dataTable, schemaType, dataReader\n", ObjectID);
- try {
- if (null == dataTable) {
- throw ADP.ArgumentNull("dataTable");
- }
- if ((SchemaType.Source != schemaType) && (SchemaType.Mapped != schemaType)) {
- throw ADP.InvalidSchemaType(schemaType);
- }
- if ((null == dataReader) || dataReader.IsClosed) {
- throw ADP.FillRequires("dataReader");
- }
- // user must Close/Dispose of the dataReader
- // user will have to call NextResult to access remaining results
- object value = FillSchemaFromReader(null, dataTable, schemaType, null, dataReader);
- return (DataTable) value;
- }
- finally {
- Bid.ScopeLeave(ref hscp);
- }
- }
- internal object FillSchemaFromReader(DataSet dataset, DataTable datatable, SchemaType schemaType, string srcTable, IDataReader dataReader) {
- DataTable[] dataTables = null;
- int schemaCount = 0;
- do {
- DataReaderContainer readerHandler = DataReaderContainer.Create(dataReader, ReturnProviderSpecificTypes);
- AssertReaderHandleFieldCount(readerHandler);
- if (0 >= readerHandler.FieldCount) {
- continue;
- }
- string tmp = null;
- if (null != dataset) {
- tmp = DataAdapter.GetSourceTableName(srcTable, schemaCount);
- schemaCount++; // don't increment if no SchemaTable ( a non-row returning result )
- }
-
- SchemaMapping mapping = new SchemaMapping(this, dataset, datatable, readerHandler, true, schemaType, tmp, false, null, null);
- if (null != datatable) {
- // do not read remaining results in single DataTable case
- return mapping.DataTable;
- }
- else if (null != mapping.DataTable) {
- if (null == dataTables) {
- dataTables = new DataTable[1] { mapping.DataTable };
- }
- else {
- dataTables = DataAdapter.AddDataTableToArray(dataTables, mapping.DataTable);
- }
- }
- } while (dataReader.NextResult()); // FillSchema does not capture errors for FillError event
- object value = dataTables;
- if ((null == value) && (null == datatable)) { // WebData 101757
- value = new DataTable[0];
- }
- return value; // null if datatable had no results
- }
- virtual public int Fill(DataSet dataSet) { // V1.0.3300
- throw ADP.NotSupported();
- }
- virtual protected int Fill(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords) { // V1.2.3300, DbDataAdapter V1.0.3300
- IntPtr hscp;
- Bid.ScopeEnter(out hscp, "<comm.DataAdapter.Fill|API> %d#, dataSet, srcTable, dataReader, startRecord, maxRecords\n", ObjectID);
- try {
- if (null == dataSet) {
- throw ADP.FillRequires("dataSet");
- }
- if (ADP.IsEmpty(srcTable)) {
- throw ADP.FillRequiresSourceTableName("srcTable");
- }
- if (null == dataReader) {
- 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;
- }
- // user must Close/Dispose of the dataReader
- DataReaderContainer readerHandler = DataReaderContainer.Create(dataReader, ReturnProviderSpecificTypes);
- return FillFromReader(dataSet, null, srcTable, readerHandler, startRecord, maxRecords, null, null);
- }
- finally {
- Bid.ScopeLeave(ref hscp);
- }
- }
- virtual protected int Fill(DataTable dataTable, IDataReader dataReader) { // V1.2.3300, DbDataADapter V1.0.3300
- DataTable[] dataTables = new DataTable[] { dataTable };
- return Fill(dataTables, dataReader, 0, 0);
- }
- virtual protected int Fill(DataTable[] dataTables, IDataReader dataReader, int startRecord, int maxRecords) { // V1.2.3300
- IntPtr hscp;
- Bid.ScopeEnter(out hscp, "<comm.DataAdapter.Fill|API> %d#, dataTables[], dataReader, startRecord, maxRecords\n", ObjectID);
- try {
- ADP.CheckArgumentLength(dataTables, "tables");
- if ((null == dataTables) || (0 == dataTables.Length) || (null == dataTables[0])) {
- throw ADP.FillRequires("dataTable");
- }
- if (null == dataReader) {
- throw ADP.FillRequires("dataReader");
- }
- if ((1 < dataTables.Length) && ((0 != startRecord) || (0 != maxRecords))) {
- throw ADP.NotSupported(); // FillChildren is not supported with FillPage
- }
- int result = 0;
- bool enforceContraints = false;
- DataSet commonDataSet = dataTables[0].DataSet;
- try {
- if (null != commonDataSet) {
- enforceContraints = commonDataSet.EnforceConstraints;
- commonDataSet.EnforceConstraints = false;
- }
- for(int i = 0; i < dataTables.Length; ++i) {
- Debug.Assert(null != dataTables[i], "null DataTable Fill");
- if (dataReader.IsClosed) {
- #if DEBUG
- Debug.Assert(!_debugHookNonEmptySelectCommand, "Debug hook asserts data reader should be open");
- #endif
- break;
- }
- DataReaderContainer readerHandler = DataReaderContainer.Create(dataReader, ReturnProviderSpecificTypes);
- AssertReaderHandleFieldCount(readerHandler);
- if (readerHandler.FieldCount <= 0) {
- if (i == 0)
- {
- bool lastFillNextResult;
- do {
- lastFillNextResult = FillNextResult(readerHandler);
- }
- while (lastFillNextResult && readerHandler.FieldCount <= 0);
- if (!lastFillNextResult) {
- break;
- }
- }
- else {
- continue;
- }
- }
- if ((0 < i) && !FillNextResult(readerHandler)) {
- break;
- }
- // user must Close/Dispose of the dataReader
- // user will have to call NextResult to access remaining results
- int count = FillFromReader(null, dataTables[i], null, readerHandler, startRecord, maxRecords, null, null);
- if (0 == i) {
- result = count;
- }
- }
- }
- catch(ConstraintException) {
- enforceContraints = false;
- throw;
- }
- finally {
- if (enforceContraints) {
- commonDataSet.EnforceConstraints = true;
- }
- }
- return result;
- }
- finally {
- Bid.ScopeLeave(ref hscp);
- }
- }
- internal int FillFromReader(DataSet dataset, DataTable datatable, string srcTable, DataReaderContainer dataReader, int startRecord, int maxRecords, DataColumn parentChapterColumn, object parentChapterValue) {
- int rowsAddedToDataSet = 0;
- int schemaCount = 0;
- do {
- AssertReaderHandleFieldCount(dataReader);
- if (0 >= dataReader.FieldCount) {
- continue; // loop to next result
- }
- SchemaMapping mapping = FillMapping(dataset, datatable, srcTable, dataReader, schemaCount, parentChapterColumn, parentChapterValue);
- schemaCount++; // don't increment if no SchemaTable ( a non-row returning result )
-
- AssertSchemaMapping(mapping);
- if (null == mapping) {
- continue; // loop to next result
- }
- if (null == mapping.DataValues) {
- continue; // loop to next result
- }
- if (null == mapping.DataTable) {
- continue; // loop to next result
- }
- mapping.DataTable.BeginLoadData();
- try {
- // startRecord and maxRecords only apply to the first resultset
- if ((1 == schemaCount) && ((0 < startRecord) || (0 < maxRecords))) {
- rowsAddedToDataSet = FillLoadDataRowChunk(mapping, startRecord, maxRecords);
- }
- else {
- int count = FillLoadDataRow(mapping);
- if (1 == schemaCount) { // MDAC 71347
- // only return LoadDataRow count for first resultset
- // not secondary or chaptered results
- rowsAddedToDataSet = count;
- }
- }
- }
- finally {
- mapping.DataTable.EndLoadData();
- }
- if (null != datatable) {
- break; // do not read remaining results in single DataTable case
- }
- } while (FillNextResult(dataReader));
- return rowsAddedToDataSet;
- }
- private int FillLoadDataRowChunk(SchemaMapping mapping, int startRecord, int maxRecords) {
- DataReaderContainer dataReader = mapping.DataReader;
- while (0 < startRecord) {
- if (!dataReader.Read()) {
- // there are no more rows on first resultset
- return 0;
- }
- --startRecord;
- }
- int rowsAddedToDataSet = 0;
- if (0 < maxRecords) {
- while ((rowsAddedToDataSet < maxRecords) && dataReader.Read()) {
- if (_hasFillErrorHandler) {
- try {
- mapping.LoadDataRowWithClear();
- rowsAddedToDataSet++;
- }
- catch(Exception e) {
- //
- if (!ADP.IsCatchableExceptionType(e)) {
- throw;
- }
- ADP.TraceExceptionForCapture(e);
- OnFillErrorHandler(e, mapping.DataTable, mapping.DataValues);
- }
- }
- else {
- mapping.LoadDataRow();
- rowsAddedToDataSet++;
- }
- }
- // skip remaining rows of the first resultset
- }
- else {
- rowsAddedToDataSet = FillLoadDataRow(mapping);
- }
- return rowsAddedToDataSet;
- }
- private int FillLoadDataRow(SchemaMapping mapping) {
- int rowsAddedToDataSet = 0;
- DataReaderContainer dataReader = mapping.DataReader;
- if (_hasFillErrorHandler) {
- while (dataReader.Read()) { // read remaining rows of first and subsequent resultsets
- try {
- // only try-catch if a FillErrorEventHandler is registered so that
- // in the default case we get the full callstack from users
- mapping.LoadDataRowWithClear();
- rowsAddedToDataSet++;
- }
- catch(Exception e) {
- //
- if (!ADP.IsCatchableExceptionType(e)) {
- throw;
- }
- ADP.TraceExceptionForCapture(e);
- OnFillErrorHandler(e, mapping.DataTable, mapping.DataValues);
- }
- }
- }
- else {
- while (dataReader.Read()) { // read remaining rows of first and subsequent resultset
- mapping.LoadDataRow();
- rowsAddedToDataSet++;
- }
- }
- return rowsAddedToDataSet;
- }
-
- private SchemaMapping FillMappingInternal(DataSet dataset, DataTable datatable, string srcTable, DataReaderContainer dataReader, int schemaCount, DataColumn parentChapterColumn, object parentChapterValue) {
- bool withKeyInfo = (Data.MissingSchemaAction.AddWithKey == MissingSchemaAction);
- string tmp = null;
- if (null != dataset) {
- tmp = DataAdapter.GetSourceTableName(srcTable, schemaCount);
- }
- return new SchemaMapping(this, dataset, datatable, dataReader, withKeyInfo, SchemaType.Mapped, tmp, true, parentChapterColumn, parentChapterValue);
- }
- private SchemaMapping FillMapping(DataSet dataset, DataTable datatable, string srcTable, DataReaderContainer dataReader, int schemaCount, DataColumn parentChapterColumn, object parentChapterValue) {
- SchemaMapping mapping = null;
- if (_hasFillErrorHandler) {
- try {
- // only try-catch if a FillErrorEventHandler is registered so that
- // in the default case we get the full callstack from users
- mapping = FillMappingInternal(dataset, datatable, srcTable, dataReader, schemaCount, parentChapterColumn, parentChapterValue);
- }
- catch(Exception e) {
- //
- if (!ADP.IsCatchableExceptionType(e)) {
- throw;
- }
- ADP.TraceExceptionForCapture(e);
- OnFillErrorHandler(e, null, null);
- }
- }
- else {
- mapping = FillMappingInternal(dataset, datatable, srcTable, dataReader, schemaCount, parentChapterColumn, parentChapterValue);
- }
- return mapping;
- }
- private bool FillNextResult(DataReaderContainer dataReader) {
- bool result = true;
- if (_hasFillErrorHandler) {
- try {
- // only try-catch if a FillErrorEventHandler is registered so that
- // in the default case we get the full callstack from users
- result = dataReader.NextResult();
- }
- catch(Exception e) {
- //
- if (!ADP.IsCatchableExceptionType(e)) {
- throw;
- }
- ADP.TraceExceptionForCapture(e);
- OnFillErrorHandler(e, null, null);
- }
- }
- else {
- result = dataReader.NextResult();
- }
- return result;
- }
- [ EditorBrowsableAttribute(EditorBrowsableState.Advanced) ] // MDAC 69508
- virtual public IDataParameter[] GetFillParameters() { // V1.0.3300
- return new IDataParameter[0];
- }
- internal DataTableMapping GetTableMappingBySchemaAction(string sourceTableName, string dataSetTableName, MissingMappingAction mappingAction) {
- return DataTableMappingCollection.GetTableMappingBySchemaAction(_tableMappings, sourceTableName, dataSetTableName, mappingAction);
- }
- internal int IndexOfDataSetTable(string dataSetTable) {
- if (null != _tableMappings) {
- return TableMappings.IndexOfDataSetTable(dataSetTable);
- }
- return -1;
- }
- virtual protected void OnFillError(FillErrorEventArgs value) { // V1.2.3300, DbDataAdapter V1.0.3300
- FillErrorEventHandler handler = (FillErrorEventHandler) Events[EventFillError];
- if (null != handler) {
- handler(this, value);
- }
- }
- private void OnFillErrorHandler(Exception e, DataTable dataTable, object[] dataValues) {
- FillErrorEventArgs fillErrorEvent = new FillErrorEventArgs(dataTable, dataValues);
- fillErrorEvent.Errors = e;
- OnFillError(fillErrorEvent);
- if (!fillErrorEvent.Continue) {
- if (null != fillErrorEvent.Errors) {
- throw fillErrorEvent.Errors;
- }
- throw e;
- }
- }
- virtual public int Update(DataSet dataSet) { // V1.0.3300
- throw ADP.NotSupported();
- }
- // used by FillSchema which returns an array of datatables added to the dataset
- static private DataTable[] AddDataTableToArray(DataTable[] tables, DataTable newTable) {
- for (int i = 0; i < tables.Length; ++i) { // search for duplicates
- if (tables[i] == newTable) {
- return tables; // duplicate found
- }
- }
- DataTable[] newTables = new DataTable[tables.Length+1]; // add unique data table
- for (int i = 0; i < tables.Length; ++i) {
- newTables[i] = tables[i];
- }
- newTables[tables.Length] = newTable;
- return newTables;
- }
- // dynamically generate source table names
- static private string GetSourceTableName(string srcTable, int index) {
- //if ((null != srcTable) && (0 <= index) && (index < srcTable.Length)) {
- if (0 == index) {
- return srcTable; //[index];
- }
- return srcTable + index.ToString(System.Globalization.CultureInfo.InvariantCulture);
- }
- }
- internal sealed class LoadAdapter : DataAdapter {
- internal LoadAdapter() {
- }
-
- internal int FillFromReader(DataTable[] dataTables, IDataReader dataReader, int startRecord, int maxRecords) {
- return Fill(dataTables, dataReader, startRecord, maxRecords);
- }
- }
- }
|