Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / Data / System / Data / SqlClient / SqlDataReaderSmi.cs / 1 / SqlDataReaderSmi.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.SqlClient {
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics; // for Conditional compilation
#if !WINFS_CLR
using System.Diagnostics.CodeAnalysis;
#endif
using Microsoft.SqlServer.Server;
using System.Data.ProviderBase;
using System.Data.Common;
// SqlServer provider's implementation of ISqlReader.
// Supports ISqlReader and ISqlResultSet objects.
//
// User should never be able to create one of these themselves, nor subclass.
// This is accomplished by having no public override constructors.
internal sealed class SqlDataReaderSmi : SqlDataReader {
//
// IDBRecord properties
//
public override int FieldCount {
get {
ThrowIfClosed( "FieldCount" );
return InternalFieldCount;
}
}
public override int VisibleFieldCount {
get {
ThrowIfClosed("VisibleFieldCount");
if (FNotInResults()) {
return 0;
}
return _visibleColumnCount;
}
}
//
// IDBRecord Metadata Methods
//
public override String GetName(int ordinal) {
EnsureCanGetMetaData( "GetName" );
return _currentMetaData[ordinal].Name;
}
public override String GetDataTypeName(int ordinal) {
EnsureCanGetMetaData( "GetDataTypeName" );
SmiExtendedMetaData md = _currentMetaData[ordinal];
if ( SqlDbType.Udt == md.SqlDbType ) {
return md.TypeSpecificNamePart1 + "." + md.TypeSpecificNamePart2 + "." + md.TypeSpecificNamePart3;
}
else {
return md.TypeName;
}
}
public override Type GetFieldType(int ordinal) {
EnsureCanGetMetaData( "GetFieldType" );
if (SqlDbType.Udt == _currentMetaData[ordinal].SqlDbType) {
return _currentMetaData[ordinal].Type;
}
else {
return MetaType.GetMetaTypeFromSqlDbType(
_currentMetaData[ordinal].SqlDbType, _currentMetaData[ordinal].IsMultiValued).ClassType ;
}
}
override public Type GetProviderSpecificFieldType(int ordinal) {
EnsureCanGetMetaData( "GetProviderSpecificFieldType" );
if (SqlDbType.Udt == _currentMetaData[ordinal].SqlDbType) {
return _currentMetaData[ordinal].Type;
}
else {
return MetaType.GetMetaTypeFromSqlDbType(
_currentMetaData[ordinal].SqlDbType, _currentMetaData[ordinal].IsMultiValued).SqlType ;
}
}
public override int Depth {
get{
ThrowIfClosed( "Depth" );
return 0;
}
} //
public override Object GetValue(int ordinal) {
EnsureCanGetCol( "GetValue", ordinal);
SmiQueryMetaData metaData = _currentMetaData[ordinal];
if (_currentConnection.IsKatmaiOrNewer) {
return ValueUtilsSmi.GetValue200(_readerEventSink, (SmiTypedGetterSetter)_currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext);
}
else {
return ValueUtilsSmi.GetValue(_readerEventSink, _currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext);
}
}
public override int GetValues(object[] values) {
EnsureCanGetCol( "GetValues", 0);
if (null == values) {
throw ADP.ArgumentNull("values");
}
int copyLength = (values.Length < _visibleColumnCount) ? values.Length : _visibleColumnCount;
for(int i=0; i %d#", ObjectID);
bool processFinallyBlock = true;
try {
if( IsClosed ) {
return;
}
// Process the remaining events. This makes sure that environment
// changes are applied and any errors are picked up.
_hasRows = false;
while(_eventStream.HasEvents) {
_eventStream.ProcessEvent( _readerEventSink );
_readerEventSink.ProcessMessagesAndThrow(true);
}
}
catch (Exception e) {
processFinallyBlock = ADP.IsCatchableExceptionType(e);
throw;
}
finally {
if (processFinallyBlock) {
_isOpen = false;
if (closeConnection) {
if (Connection != null) {
Connection.Close();
}
Bid.ScopeLeave(ref hscp);
}
}
}
}
// Move to the next resultset
public override unsafe bool NextResult() {
ThrowIfClosed( "NextResult" );
bool hasAnotherResult = InternalNextResult(false);
return hasAnotherResult;
}
internal unsafe bool InternalNextResult(bool ignoreNonFatalMessages) {
IntPtr hscp = IntPtr.Zero;
if (Bid.AdvancedOn) {
Bid.ScopeEnter(out hscp, " %d#", ObjectID);
}
try {
_hasRows = false;
if( PositionState.AfterResults != _currentPosition )
{
// Consume any remaning rows in the current result.
while( InternalRead(ignoreNonFatalMessages) ) {
// This space intentionally left blank
}
Debug.Assert( null == _currentMetaData, "Read didn't clear metadata at end of results!" );
// Process the events until metadata is found or all of the
// available events have been consumed. If there is another
// result, the metadata for it will be available after the last
// read on the prior result.
while(null == _currentMetaData && _eventStream.HasEvents) {
_eventStream.ProcessEvent( _readerEventSink );
_readerEventSink.ProcessMessagesAndThrow(ignoreNonFatalMessages);
}
}
return PositionState.AfterResults != _currentPosition;
}
finally {
if (Bid.AdvancedOn) {
Bid.ScopeLeave(ref hscp);
}
}
}
public override bool Read() {
ThrowIfClosed( "Read" );
bool hasAnotherRow = InternalRead(false);
return hasAnotherRow;
}
internal unsafe bool InternalRead(bool ignoreNonFatalErrors) {
IntPtr hscp = IntPtr.Zero;
if (Bid.AdvancedOn) {
Bid.ScopeEnter(out hscp, " %d#", ObjectID);
}
try {
// Don't move unless currently in results.
if( FInResults() ) {
// Set current row to null so we can see if we get a new one
_currentColumnValues = null;
_currentColumnValuesV3 = null;
// NOTE: SQLBUDT #386118 -- may indicate that we want to break this loop when we get a MessagePosted callback, but we can't prove that.
while( null == _currentColumnValues && // Did we find a row?
null == _currentColumnValuesV3 && // Did we find a V3 row?
FInResults() && // Was the batch terminated due to a serious error?
PositionState.AfterRows != _currentPosition && // Have we seen a statement completed event?
_eventStream.HasEvents ) { // Have we processed all events?
_eventStream.ProcessEvent( _readerEventSink );
_readerEventSink.ProcessMessagesAndThrow(ignoreNonFatalErrors);
}
}
return PositionState.OnRow == _currentPosition;
}
finally {
if (Bid.AdvancedOn) {
Bid.ScopeLeave(ref hscp);
}
}
}
public override DataTable GetSchemaTable() {
ThrowIfClosed( "GetSchemaTable" );
if ( null == _schemaTable && FInResults() )
{
DataTable schemaTable = new DataTable( "SchemaTable" );
schemaTable.Locale = System.Globalization.CultureInfo.InvariantCulture;
schemaTable.MinimumCapacity = InternalFieldCount;
DataColumn ColumnName = new DataColumn(SchemaTableColumn.ColumnName, typeof(System.String));
DataColumn Ordinal = new DataColumn(SchemaTableColumn.ColumnOrdinal, typeof(System.Int32));
DataColumn Size = new DataColumn(SchemaTableColumn.ColumnSize, typeof(System.Int32));
DataColumn Precision = new DataColumn(SchemaTableColumn.NumericPrecision, typeof(System.Int16));
DataColumn Scale = new DataColumn(SchemaTableColumn.NumericScale, typeof(System.Int16));
DataColumn DataType = new DataColumn(SchemaTableColumn.DataType, typeof(System.Type));
DataColumn ProviderSpecificDataType = new DataColumn(SchemaTableOptionalColumn.ProviderSpecificDataType, typeof(System.Type));
DataColumn ProviderType = new DataColumn(SchemaTableColumn.ProviderType, typeof(System.Int32));
DataColumn NonVersionedProviderType = new DataColumn(SchemaTableColumn.NonVersionedProviderType, typeof(System.Int32));
DataColumn IsLong = new DataColumn(SchemaTableColumn.IsLong, typeof(System.Boolean));
DataColumn AllowDBNull = new DataColumn(SchemaTableColumn.AllowDBNull, typeof(System.Boolean));
DataColumn IsReadOnly = new DataColumn(SchemaTableOptionalColumn.IsReadOnly, typeof(System.Boolean));
DataColumn IsRowVersion = new DataColumn(SchemaTableOptionalColumn.IsRowVersion, typeof(System.Boolean));
DataColumn IsUnique = new DataColumn(SchemaTableColumn.IsUnique, typeof(System.Boolean));
DataColumn IsKey = new DataColumn(SchemaTableColumn.IsKey, typeof(System.Boolean));
DataColumn IsAutoIncrement = new DataColumn(SchemaTableOptionalColumn.IsAutoIncrement, typeof(System.Boolean));
DataColumn IsHidden = new DataColumn(SchemaTableOptionalColumn.IsHidden, typeof(System.Boolean));
DataColumn BaseCatalogName = new DataColumn(SchemaTableOptionalColumn.BaseCatalogName, typeof(System.String));
DataColumn BaseSchemaName = new DataColumn(SchemaTableColumn.BaseSchemaName, typeof(System.String));
DataColumn BaseTableName = new DataColumn(SchemaTableColumn.BaseTableName, typeof(System.String));
DataColumn BaseColumnName = new DataColumn(SchemaTableColumn.BaseColumnName, typeof(System.String));
// unique to SqlClient
DataColumn BaseServerName = new DataColumn(SchemaTableOptionalColumn.BaseServerName, typeof(System.String));
DataColumn IsAliased = new DataColumn(SchemaTableColumn.IsAliased, typeof(System.Boolean));
DataColumn IsExpression = new DataColumn(SchemaTableColumn.IsExpression, typeof(System.Boolean));
DataColumn IsIdentity = new DataColumn("IsIdentity", typeof(System.Boolean));
// UDT specific. Holds UDT typename ONLY if the type of the column is UDT, otherwise the data type
DataColumn DataTypeName = new DataColumn("DataTypeName", typeof(System.String));
DataColumn UdtAssemblyQualifiedName = new DataColumn("UdtAssemblyQualifiedName", typeof(System.String));
// Xml metadata specific
DataColumn XmlSchemaCollectionDatabase = new DataColumn("XmlSchemaCollectionDatabase", typeof(System.String));
DataColumn XmlSchemaCollectionOwningSchema = new DataColumn("XmlSchemaCollectionOwningSchema", typeof(System.String));
DataColumn XmlSchemaCollectionName = new DataColumn("XmlSchemaCollectionName", typeof(System.String));
// SparseColumnSet
DataColumn IsColumnSet = new DataColumn("IsColumnSet", typeof(System.Boolean));
Ordinal.DefaultValue = 0;
IsLong.DefaultValue = false;
DataColumnCollection columns = schemaTable.Columns;
// must maintain order for backward compatibility
columns.Add(ColumnName);
columns.Add(Ordinal);
columns.Add(Size);
columns.Add(Precision);
columns.Add(Scale);
columns.Add(IsUnique);
columns.Add(IsKey);
columns.Add(BaseServerName);
columns.Add(BaseCatalogName);
columns.Add(BaseColumnName);
columns.Add(BaseSchemaName);
columns.Add(BaseTableName);
columns.Add(DataType);
columns.Add(AllowDBNull);
columns.Add(ProviderType);
columns.Add(IsAliased);
columns.Add(IsExpression);
columns.Add(IsIdentity);
columns.Add(IsAutoIncrement);
columns.Add(IsRowVersion);
columns.Add(IsHidden);
columns.Add(IsLong);
columns.Add(IsReadOnly);
columns.Add(ProviderSpecificDataType);
columns.Add(DataTypeName);
columns.Add(XmlSchemaCollectionDatabase);
columns.Add(XmlSchemaCollectionOwningSchema);
columns.Add(XmlSchemaCollectionName);
columns.Add(UdtAssemblyQualifiedName);
columns.Add(NonVersionedProviderType);
columns.Add(IsColumnSet);
for (int i = 0; i < InternalFieldCount; i++) {
SmiQueryMetaData colMetaData = _currentMetaData[i];
long maxLength = colMetaData.MaxLength;
MetaType metaType = MetaType.GetMetaTypeFromSqlDbType(colMetaData.SqlDbType, colMetaData.IsMultiValued);
if ( SmiMetaData.UnlimitedMaxLengthIndicator == maxLength ) {
metaType = MetaType.GetMaxMetaTypeFromMetaType( metaType );
maxLength = (metaType.IsSizeInCharacters && !metaType.IsPlp) ? (0x7fffffff / 2) : 0x7fffffff;
}
DataRow schemaRow = schemaTable.NewRow();
// NOTE: there is an impedence mismatch here - the server always
// treats numeric data as variable length and sends a maxLength
// based upon the precision, whereas TDS always sends 17 for
// the max length; rather than push this logic into the server,
// I've elected to make a fixup here instead.
if (SqlDbType.Decimal == colMetaData.SqlDbType) {
//
maxLength = TdsEnums.MAX_NUMERIC_LEN; // SQLBUDT 339686
}
else if (SqlDbType.Variant == colMetaData.SqlDbType) {
//
maxLength = 8009; // SQLBUDT 340726
}
schemaRow[ColumnName] = colMetaData.Name;
schemaRow[Ordinal] = i;
schemaRow[Size] = maxLength;
schemaRow[ProviderType] = (int) colMetaData.SqlDbType; // SqlDbType
schemaRow[NonVersionedProviderType] = (int) colMetaData.SqlDbType; // SqlDbType
if (colMetaData.SqlDbType != SqlDbType.Udt) {
schemaRow[DataType] = metaType.ClassType; // com+ type
schemaRow[ProviderSpecificDataType] = metaType.SqlType;
}
else {
schemaRow[UdtAssemblyQualifiedName] = colMetaData.Type.AssemblyQualifiedName;
schemaRow[DataType] = colMetaData.Type;
schemaRow[ProviderSpecificDataType] = colMetaData.Type;
}
// NOTE: there is also an impedence mismatch here - the server
// has different ideas about what the precision value should be
// than does the client bits. I tried fixing up the default
// meta data values in SmiMetaData, however, it caused the
// server suites to fall over dead. Rather than attempt to
// bake it into the server, I'm fixing it up in the client.
byte precision = 0xff; // default for everything, except certain numeric types.
//
switch (colMetaData.SqlDbType) {
case SqlDbType.BigInt:
case SqlDbType.DateTime:
case SqlDbType.Decimal:
case SqlDbType.Int:
case SqlDbType.Money:
case SqlDbType.SmallDateTime:
case SqlDbType.SmallInt:
case SqlDbType.SmallMoney:
case SqlDbType.TinyInt:
precision = colMetaData.Precision;
break;
case SqlDbType.Float:
precision = 15;
break;
case SqlDbType.Real:
precision = 7;
break;
default:
precision = 0xff; // everything else is unknown;
break;
}
schemaRow[Precision] = precision;
//
if ( SqlDbType.Decimal == colMetaData.SqlDbType ||
SqlDbType.Time == colMetaData.SqlDbType ||
SqlDbType.DateTime2 == colMetaData.SqlDbType ||
SqlDbType.DateTimeOffset == colMetaData.SqlDbType) {
schemaRow[Scale] = colMetaData.Scale;
}
else {
schemaRow[Scale] = MetaType.GetMetaTypeFromSqlDbType(
colMetaData.SqlDbType, colMetaData.IsMultiValued).Scale;
}
schemaRow[AllowDBNull] = colMetaData.AllowsDBNull;
if ( !( colMetaData.IsAliased.IsNull ) ) {
schemaRow[IsAliased] = colMetaData.IsAliased.Value;
}
if ( !( colMetaData.IsKey.IsNull ) ) {
schemaRow[IsKey] = colMetaData.IsKey.Value;
}
if ( !( colMetaData.IsHidden.IsNull ) ) {
schemaRow[IsHidden] = colMetaData.IsHidden.Value;
}
if ( !( colMetaData.IsExpression.IsNull ) ) {
schemaRow[IsExpression] = colMetaData.IsExpression.Value;
}
schemaRow[IsReadOnly] = colMetaData.IsReadOnly;
schemaRow[IsIdentity] = colMetaData.IsIdentity;
schemaRow[IsColumnSet] = colMetaData.IsColumnSet;
schemaRow[IsAutoIncrement] = colMetaData.IsIdentity;
schemaRow[IsLong] = metaType.IsLong;
// mark unique for timestamp columns
if ( SqlDbType.Timestamp == colMetaData.SqlDbType ) {
schemaRow[IsUnique] = true;
schemaRow[IsRowVersion] = true;
}
else {
schemaRow[IsUnique] = false;
schemaRow[IsRowVersion] = false;
}
if ( !ADP.IsEmpty( colMetaData.ColumnName ) ) {
schemaRow[BaseColumnName] = colMetaData.ColumnName;
}
else if (!ADP.IsEmpty( colMetaData.Name)) {
// Use projection name if base column name is not present
schemaRow[BaseColumnName] = colMetaData.Name;
}
if ( !ADP.IsEmpty(colMetaData.TableName ) ) {
schemaRow[BaseTableName] = colMetaData.TableName;
}
if (!ADP.IsEmpty(colMetaData.SchemaName)) {
schemaRow[BaseSchemaName] = colMetaData.SchemaName;
}
if (!ADP.IsEmpty(colMetaData.CatalogName)) {
schemaRow[BaseCatalogName] = colMetaData.CatalogName;
}
if (!ADP.IsEmpty(colMetaData.ServerName)) {
schemaRow[BaseServerName] = colMetaData.ServerName;
}
if ( SqlDbType.Udt == colMetaData.SqlDbType ) {
schemaRow[DataTypeName] = colMetaData.TypeSpecificNamePart1 + "." + colMetaData.TypeSpecificNamePart2 + "." + colMetaData.TypeSpecificNamePart3;
}
else {
schemaRow[DataTypeName] = metaType.TypeName;
}
// Add Xml metadata
if ( SqlDbType.Xml == colMetaData.SqlDbType ) {
schemaRow[XmlSchemaCollectionDatabase] = colMetaData.TypeSpecificNamePart1;
schemaRow[XmlSchemaCollectionOwningSchema] = colMetaData.TypeSpecificNamePart2;
schemaRow[XmlSchemaCollectionName] = colMetaData.TypeSpecificNamePart3;
}
schemaTable.Rows.Add(schemaRow);
schemaRow.AcceptChanges();
}
// mark all columns as readonly
foreach(DataColumn column in columns) {
column.ReadOnly = true; // MDAC 70943
}
_schemaTable = schemaTable;
}
return _schemaTable;
}
//
// ISqlRecord methods
//
public override SqlBinary GetSqlBinary(int ordinal) {
EnsureCanGetCol( "GetSqlBinary", ordinal);
return ValueUtilsSmi.GetSqlBinary(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlBoolean GetSqlBoolean(int ordinal) {
EnsureCanGetCol( "GetSqlBoolean", ordinal);
return ValueUtilsSmi.GetSqlBoolean(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlByte GetSqlByte(int ordinal) {
EnsureCanGetCol( "GetSqlByte", ordinal);
return ValueUtilsSmi.GetSqlByte(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlInt16 GetSqlInt16(int ordinal) {
EnsureCanGetCol( "GetSqlInt16", ordinal);
return ValueUtilsSmi.GetSqlInt16(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlInt32 GetSqlInt32(int ordinal) {
EnsureCanGetCol( "GetSqlInt32", ordinal);
return ValueUtilsSmi.GetSqlInt32(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlInt64 GetSqlInt64(int ordinal) {
EnsureCanGetCol( "GetSqlInt64", ordinal);
return ValueUtilsSmi.GetSqlInt64(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlSingle GetSqlSingle(int ordinal) {
EnsureCanGetCol( "GetSqlSingle", ordinal);
return ValueUtilsSmi.GetSqlSingle(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlDouble GetSqlDouble(int ordinal) {
EnsureCanGetCol( "GetSqlDouble", ordinal);
return ValueUtilsSmi.GetSqlDouble(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlMoney GetSqlMoney(int ordinal) {
EnsureCanGetCol( "GetSqlMoney", ordinal);
return ValueUtilsSmi.GetSqlMoney(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlDateTime GetSqlDateTime(int ordinal) {
EnsureCanGetCol( "GetSqlDateTime", ordinal);
return ValueUtilsSmi.GetSqlDateTime(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
#if WINFS_UTC
public override virtual SqlUtcDateTime GetSqlUtcDateTime(int ordinal) {
EnsureCanGetCol( "GetSqlUtcDateTime", ordinal);
if ( SmiContextFactory.Instance.NegotiatedSmiVersion >= 3 ) {
return ValueUtilsSmi.GetSqlUtcDateTime( _readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal] );
}
// old V2- code path
return _currentColumnValues.GetSqlUtcDateTime( ordinal );
}
public override virtual SqlDate GetSqlDate(int ordinal) {
EnsureCanGetCol( "GetSqlDate", ordinal);
if ( SmiContextFactory.Instance.NegotiatedSmiVersion >= 3 ) {
return ValueUtilsSmi.GetSqlDate( _readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal] );
}
// old V2- code path
return _currentColumnValues.GetSqlDate( ordinal );
}
public override virtual SqlTime GetSqlTime(int ordinal) {
EnsureCanGetCol( "GetSqlTime", ordinal);
if ( SmiContextFactory.Instance.NegotiatedSmiVersion >= 3 ) {
return ValueUtilsSmi.GetSqlTime( _readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal] );
}
// old V2- code path
return _currentColumnValues.GetSqlTime( ordinal );
}
#endif
public override SqlDecimal GetSqlDecimal(int ordinal) {
EnsureCanGetCol( "GetSqlDecimal", ordinal);
return ValueUtilsSmi.GetSqlDecimal(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlString GetSqlString(int ordinal) {
EnsureCanGetCol( "GetSqlString", ordinal);
return ValueUtilsSmi.GetSqlString(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlGuid GetSqlGuid(int ordinal) {
EnsureCanGetCol( "GetSqlGuid", ordinal);
return ValueUtilsSmi.GetSqlGuid(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlChars GetSqlChars(int ordinal) {
EnsureCanGetCol( "GetSqlChars", ordinal);
return ValueUtilsSmi.GetSqlChars(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.InternalContext);
}
public override SqlBytes GetSqlBytes(int ordinal) {
EnsureCanGetCol( "GetSqlBytes", ordinal);
return ValueUtilsSmi.GetSqlBytes(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.InternalContext);
}
public override SqlXml GetSqlXml(int ordinal) {
EnsureCanGetCol( "GetSqlXml", ordinal);
return ValueUtilsSmi.GetSqlXml(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.InternalContext);
}
public override TimeSpan GetTimeSpan(int ordinal) {
EnsureCanGetCol("GetTimeSpan", ordinal);
return ValueUtilsSmi.GetTimeSpan(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.IsKatmaiOrNewer);
}
public override DateTimeOffset GetDateTimeOffset(int ordinal) {
EnsureCanGetCol("GetDateTimeOffset", ordinal);
return ValueUtilsSmi.GetDateTimeOffset(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.IsKatmaiOrNewer);
}
public override object GetSqlValue(int ordinal) {
EnsureCanGetCol( "GetSqlValue", ordinal);
SmiMetaData metaData = _currentMetaData[ordinal];
if (_currentConnection.IsKatmaiOrNewer) {
return ValueUtilsSmi.GetSqlValue200(_readerEventSink, (SmiTypedGetterSetter)_currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext);
}
return ValueUtilsSmi.GetSqlValue(_readerEventSink, _currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext); ;
}
public override int GetSqlValues(object[] values) {
EnsureCanGetCol( "GetSqlValues", 0);
if (null == values) {
throw ADP.ArgumentNull("values");
}
int copyLength = (values.Length < _visibleColumnCount) ? values.Length : _visibleColumnCount;
for(int i=0; i %d#, md.Length=%d nextEventIsRow=%d.\n", reader.ObjectID, (null != md) ? md.Length : -1, nextEventIsRow);
if (null != md) {
for (int i=0; i < md.Length; i++) {
Bid.Trace(" %d#, metaData[%d] is %s%s\n",
reader.ObjectID, i, md[i].GetType().ToString(), md[i].TraceString());
}
}
}
this.reader.MetaDataAvailable( md, nextEventIsRow );
}
// Obsolete V2- method
internal override void RowAvailable( ITypedGetters row ) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# (v2).\n", reader.ObjectID);
}
this.reader.RowAvailable( row );
}
internal override void RowAvailable( ITypedGettersV3 row ) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# (ITypedGettersV3).\n", reader.ObjectID);
}
this.reader.RowAvailable( row );
}
internal override void RowAvailable(SmiTypedGetterSetter rowData) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# (SmiTypedGetterSetter).\n", reader.ObjectID);
}
this.reader.RowAvailable(rowData);
}
internal override void StatementCompleted( int recordsAffected ) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# recordsAffected=%d.\n", reader.ObjectID, recordsAffected);
}
// devnote: relies on SmiEventSink_Default to pass event to parent
// Both command and reader care about StatementCompleted, but for different reasons.
base.StatementCompleted( recordsAffected );
this.reader.StatementCompleted( );
}
internal override void BatchCompleted() {
if (Bid.AdvancedOn) {
Bid.Trace(" %d#.\n", reader.ObjectID);
}
// devnote: relies on SmiEventSink_Default to pass event to parent
// parent's callback *MUST* come before reader's BatchCompleted, since
// reader will close the event stream during this call, and parent wants
// to extract parameter values before that happens.
base.BatchCompleted();
this.reader.BatchCompleted();
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.SqlClient {
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics; // for Conditional compilation
#if !WINFS_CLR
using System.Diagnostics.CodeAnalysis;
#endif
using Microsoft.SqlServer.Server;
using System.Data.ProviderBase;
using System.Data.Common;
// SqlServer provider's implementation of ISqlReader.
// Supports ISqlReader and ISqlResultSet objects.
//
// User should never be able to create one of these themselves, nor subclass.
// This is accomplished by having no public override constructors.
internal sealed class SqlDataReaderSmi : SqlDataReader {
//
// IDBRecord properties
//
public override int FieldCount {
get {
ThrowIfClosed( "FieldCount" );
return InternalFieldCount;
}
}
public override int VisibleFieldCount {
get {
ThrowIfClosed("VisibleFieldCount");
if (FNotInResults()) {
return 0;
}
return _visibleColumnCount;
}
}
//
// IDBRecord Metadata Methods
//
public override String GetName(int ordinal) {
EnsureCanGetMetaData( "GetName" );
return _currentMetaData[ordinal].Name;
}
public override String GetDataTypeName(int ordinal) {
EnsureCanGetMetaData( "GetDataTypeName" );
SmiExtendedMetaData md = _currentMetaData[ordinal];
if ( SqlDbType.Udt == md.SqlDbType ) {
return md.TypeSpecificNamePart1 + "." + md.TypeSpecificNamePart2 + "." + md.TypeSpecificNamePart3;
}
else {
return md.TypeName;
}
}
public override Type GetFieldType(int ordinal) {
EnsureCanGetMetaData( "GetFieldType" );
if (SqlDbType.Udt == _currentMetaData[ordinal].SqlDbType) {
return _currentMetaData[ordinal].Type;
}
else {
return MetaType.GetMetaTypeFromSqlDbType(
_currentMetaData[ordinal].SqlDbType, _currentMetaData[ordinal].IsMultiValued).ClassType ;
}
}
override public Type GetProviderSpecificFieldType(int ordinal) {
EnsureCanGetMetaData( "GetProviderSpecificFieldType" );
if (SqlDbType.Udt == _currentMetaData[ordinal].SqlDbType) {
return _currentMetaData[ordinal].Type;
}
else {
return MetaType.GetMetaTypeFromSqlDbType(
_currentMetaData[ordinal].SqlDbType, _currentMetaData[ordinal].IsMultiValued).SqlType ;
}
}
public override int Depth {
get{
ThrowIfClosed( "Depth" );
return 0;
}
} //
public override Object GetValue(int ordinal) {
EnsureCanGetCol( "GetValue", ordinal);
SmiQueryMetaData metaData = _currentMetaData[ordinal];
if (_currentConnection.IsKatmaiOrNewer) {
return ValueUtilsSmi.GetValue200(_readerEventSink, (SmiTypedGetterSetter)_currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext);
}
else {
return ValueUtilsSmi.GetValue(_readerEventSink, _currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext);
}
}
public override int GetValues(object[] values) {
EnsureCanGetCol( "GetValues", 0);
if (null == values) {
throw ADP.ArgumentNull("values");
}
int copyLength = (values.Length < _visibleColumnCount) ? values.Length : _visibleColumnCount;
for(int i=0; i %d#", ObjectID);
bool processFinallyBlock = true;
try {
if( IsClosed ) {
return;
}
// Process the remaining events. This makes sure that environment
// changes are applied and any errors are picked up.
_hasRows = false;
while(_eventStream.HasEvents) {
_eventStream.ProcessEvent( _readerEventSink );
_readerEventSink.ProcessMessagesAndThrow(true);
}
}
catch (Exception e) {
processFinallyBlock = ADP.IsCatchableExceptionType(e);
throw;
}
finally {
if (processFinallyBlock) {
_isOpen = false;
if (closeConnection) {
if (Connection != null) {
Connection.Close();
}
Bid.ScopeLeave(ref hscp);
}
}
}
}
// Move to the next resultset
public override unsafe bool NextResult() {
ThrowIfClosed( "NextResult" );
bool hasAnotherResult = InternalNextResult(false);
return hasAnotherResult;
}
internal unsafe bool InternalNextResult(bool ignoreNonFatalMessages) {
IntPtr hscp = IntPtr.Zero;
if (Bid.AdvancedOn) {
Bid.ScopeEnter(out hscp, " %d#", ObjectID);
}
try {
_hasRows = false;
if( PositionState.AfterResults != _currentPosition )
{
// Consume any remaning rows in the current result.
while( InternalRead(ignoreNonFatalMessages) ) {
// This space intentionally left blank
}
Debug.Assert( null == _currentMetaData, "Read didn't clear metadata at end of results!" );
// Process the events until metadata is found or all of the
// available events have been consumed. If there is another
// result, the metadata for it will be available after the last
// read on the prior result.
while(null == _currentMetaData && _eventStream.HasEvents) {
_eventStream.ProcessEvent( _readerEventSink );
_readerEventSink.ProcessMessagesAndThrow(ignoreNonFatalMessages);
}
}
return PositionState.AfterResults != _currentPosition;
}
finally {
if (Bid.AdvancedOn) {
Bid.ScopeLeave(ref hscp);
}
}
}
public override bool Read() {
ThrowIfClosed( "Read" );
bool hasAnotherRow = InternalRead(false);
return hasAnotherRow;
}
internal unsafe bool InternalRead(bool ignoreNonFatalErrors) {
IntPtr hscp = IntPtr.Zero;
if (Bid.AdvancedOn) {
Bid.ScopeEnter(out hscp, " %d#", ObjectID);
}
try {
// Don't move unless currently in results.
if( FInResults() ) {
// Set current row to null so we can see if we get a new one
_currentColumnValues = null;
_currentColumnValuesV3 = null;
// NOTE: SQLBUDT #386118 -- may indicate that we want to break this loop when we get a MessagePosted callback, but we can't prove that.
while( null == _currentColumnValues && // Did we find a row?
null == _currentColumnValuesV3 && // Did we find a V3 row?
FInResults() && // Was the batch terminated due to a serious error?
PositionState.AfterRows != _currentPosition && // Have we seen a statement completed event?
_eventStream.HasEvents ) { // Have we processed all events?
_eventStream.ProcessEvent( _readerEventSink );
_readerEventSink.ProcessMessagesAndThrow(ignoreNonFatalErrors);
}
}
return PositionState.OnRow == _currentPosition;
}
finally {
if (Bid.AdvancedOn) {
Bid.ScopeLeave(ref hscp);
}
}
}
public override DataTable GetSchemaTable() {
ThrowIfClosed( "GetSchemaTable" );
if ( null == _schemaTable && FInResults() )
{
DataTable schemaTable = new DataTable( "SchemaTable" );
schemaTable.Locale = System.Globalization.CultureInfo.InvariantCulture;
schemaTable.MinimumCapacity = InternalFieldCount;
DataColumn ColumnName = new DataColumn(SchemaTableColumn.ColumnName, typeof(System.String));
DataColumn Ordinal = new DataColumn(SchemaTableColumn.ColumnOrdinal, typeof(System.Int32));
DataColumn Size = new DataColumn(SchemaTableColumn.ColumnSize, typeof(System.Int32));
DataColumn Precision = new DataColumn(SchemaTableColumn.NumericPrecision, typeof(System.Int16));
DataColumn Scale = new DataColumn(SchemaTableColumn.NumericScale, typeof(System.Int16));
DataColumn DataType = new DataColumn(SchemaTableColumn.DataType, typeof(System.Type));
DataColumn ProviderSpecificDataType = new DataColumn(SchemaTableOptionalColumn.ProviderSpecificDataType, typeof(System.Type));
DataColumn ProviderType = new DataColumn(SchemaTableColumn.ProviderType, typeof(System.Int32));
DataColumn NonVersionedProviderType = new DataColumn(SchemaTableColumn.NonVersionedProviderType, typeof(System.Int32));
DataColumn IsLong = new DataColumn(SchemaTableColumn.IsLong, typeof(System.Boolean));
DataColumn AllowDBNull = new DataColumn(SchemaTableColumn.AllowDBNull, typeof(System.Boolean));
DataColumn IsReadOnly = new DataColumn(SchemaTableOptionalColumn.IsReadOnly, typeof(System.Boolean));
DataColumn IsRowVersion = new DataColumn(SchemaTableOptionalColumn.IsRowVersion, typeof(System.Boolean));
DataColumn IsUnique = new DataColumn(SchemaTableColumn.IsUnique, typeof(System.Boolean));
DataColumn IsKey = new DataColumn(SchemaTableColumn.IsKey, typeof(System.Boolean));
DataColumn IsAutoIncrement = new DataColumn(SchemaTableOptionalColumn.IsAutoIncrement, typeof(System.Boolean));
DataColumn IsHidden = new DataColumn(SchemaTableOptionalColumn.IsHidden, typeof(System.Boolean));
DataColumn BaseCatalogName = new DataColumn(SchemaTableOptionalColumn.BaseCatalogName, typeof(System.String));
DataColumn BaseSchemaName = new DataColumn(SchemaTableColumn.BaseSchemaName, typeof(System.String));
DataColumn BaseTableName = new DataColumn(SchemaTableColumn.BaseTableName, typeof(System.String));
DataColumn BaseColumnName = new DataColumn(SchemaTableColumn.BaseColumnName, typeof(System.String));
// unique to SqlClient
DataColumn BaseServerName = new DataColumn(SchemaTableOptionalColumn.BaseServerName, typeof(System.String));
DataColumn IsAliased = new DataColumn(SchemaTableColumn.IsAliased, typeof(System.Boolean));
DataColumn IsExpression = new DataColumn(SchemaTableColumn.IsExpression, typeof(System.Boolean));
DataColumn IsIdentity = new DataColumn("IsIdentity", typeof(System.Boolean));
// UDT specific. Holds UDT typename ONLY if the type of the column is UDT, otherwise the data type
DataColumn DataTypeName = new DataColumn("DataTypeName", typeof(System.String));
DataColumn UdtAssemblyQualifiedName = new DataColumn("UdtAssemblyQualifiedName", typeof(System.String));
// Xml metadata specific
DataColumn XmlSchemaCollectionDatabase = new DataColumn("XmlSchemaCollectionDatabase", typeof(System.String));
DataColumn XmlSchemaCollectionOwningSchema = new DataColumn("XmlSchemaCollectionOwningSchema", typeof(System.String));
DataColumn XmlSchemaCollectionName = new DataColumn("XmlSchemaCollectionName", typeof(System.String));
// SparseColumnSet
DataColumn IsColumnSet = new DataColumn("IsColumnSet", typeof(System.Boolean));
Ordinal.DefaultValue = 0;
IsLong.DefaultValue = false;
DataColumnCollection columns = schemaTable.Columns;
// must maintain order for backward compatibility
columns.Add(ColumnName);
columns.Add(Ordinal);
columns.Add(Size);
columns.Add(Precision);
columns.Add(Scale);
columns.Add(IsUnique);
columns.Add(IsKey);
columns.Add(BaseServerName);
columns.Add(BaseCatalogName);
columns.Add(BaseColumnName);
columns.Add(BaseSchemaName);
columns.Add(BaseTableName);
columns.Add(DataType);
columns.Add(AllowDBNull);
columns.Add(ProviderType);
columns.Add(IsAliased);
columns.Add(IsExpression);
columns.Add(IsIdentity);
columns.Add(IsAutoIncrement);
columns.Add(IsRowVersion);
columns.Add(IsHidden);
columns.Add(IsLong);
columns.Add(IsReadOnly);
columns.Add(ProviderSpecificDataType);
columns.Add(DataTypeName);
columns.Add(XmlSchemaCollectionDatabase);
columns.Add(XmlSchemaCollectionOwningSchema);
columns.Add(XmlSchemaCollectionName);
columns.Add(UdtAssemblyQualifiedName);
columns.Add(NonVersionedProviderType);
columns.Add(IsColumnSet);
for (int i = 0; i < InternalFieldCount; i++) {
SmiQueryMetaData colMetaData = _currentMetaData[i];
long maxLength = colMetaData.MaxLength;
MetaType metaType = MetaType.GetMetaTypeFromSqlDbType(colMetaData.SqlDbType, colMetaData.IsMultiValued);
if ( SmiMetaData.UnlimitedMaxLengthIndicator == maxLength ) {
metaType = MetaType.GetMaxMetaTypeFromMetaType( metaType );
maxLength = (metaType.IsSizeInCharacters && !metaType.IsPlp) ? (0x7fffffff / 2) : 0x7fffffff;
}
DataRow schemaRow = schemaTable.NewRow();
// NOTE: there is an impedence mismatch here - the server always
// treats numeric data as variable length and sends a maxLength
// based upon the precision, whereas TDS always sends 17 for
// the max length; rather than push this logic into the server,
// I've elected to make a fixup here instead.
if (SqlDbType.Decimal == colMetaData.SqlDbType) {
//
maxLength = TdsEnums.MAX_NUMERIC_LEN; // SQLBUDT 339686
}
else if (SqlDbType.Variant == colMetaData.SqlDbType) {
//
maxLength = 8009; // SQLBUDT 340726
}
schemaRow[ColumnName] = colMetaData.Name;
schemaRow[Ordinal] = i;
schemaRow[Size] = maxLength;
schemaRow[ProviderType] = (int) colMetaData.SqlDbType; // SqlDbType
schemaRow[NonVersionedProviderType] = (int) colMetaData.SqlDbType; // SqlDbType
if (colMetaData.SqlDbType != SqlDbType.Udt) {
schemaRow[DataType] = metaType.ClassType; // com+ type
schemaRow[ProviderSpecificDataType] = metaType.SqlType;
}
else {
schemaRow[UdtAssemblyQualifiedName] = colMetaData.Type.AssemblyQualifiedName;
schemaRow[DataType] = colMetaData.Type;
schemaRow[ProviderSpecificDataType] = colMetaData.Type;
}
// NOTE: there is also an impedence mismatch here - the server
// has different ideas about what the precision value should be
// than does the client bits. I tried fixing up the default
// meta data values in SmiMetaData, however, it caused the
// server suites to fall over dead. Rather than attempt to
// bake it into the server, I'm fixing it up in the client.
byte precision = 0xff; // default for everything, except certain numeric types.
//
switch (colMetaData.SqlDbType) {
case SqlDbType.BigInt:
case SqlDbType.DateTime:
case SqlDbType.Decimal:
case SqlDbType.Int:
case SqlDbType.Money:
case SqlDbType.SmallDateTime:
case SqlDbType.SmallInt:
case SqlDbType.SmallMoney:
case SqlDbType.TinyInt:
precision = colMetaData.Precision;
break;
case SqlDbType.Float:
precision = 15;
break;
case SqlDbType.Real:
precision = 7;
break;
default:
precision = 0xff; // everything else is unknown;
break;
}
schemaRow[Precision] = precision;
//
if ( SqlDbType.Decimal == colMetaData.SqlDbType ||
SqlDbType.Time == colMetaData.SqlDbType ||
SqlDbType.DateTime2 == colMetaData.SqlDbType ||
SqlDbType.DateTimeOffset == colMetaData.SqlDbType) {
schemaRow[Scale] = colMetaData.Scale;
}
else {
schemaRow[Scale] = MetaType.GetMetaTypeFromSqlDbType(
colMetaData.SqlDbType, colMetaData.IsMultiValued).Scale;
}
schemaRow[AllowDBNull] = colMetaData.AllowsDBNull;
if ( !( colMetaData.IsAliased.IsNull ) ) {
schemaRow[IsAliased] = colMetaData.IsAliased.Value;
}
if ( !( colMetaData.IsKey.IsNull ) ) {
schemaRow[IsKey] = colMetaData.IsKey.Value;
}
if ( !( colMetaData.IsHidden.IsNull ) ) {
schemaRow[IsHidden] = colMetaData.IsHidden.Value;
}
if ( !( colMetaData.IsExpression.IsNull ) ) {
schemaRow[IsExpression] = colMetaData.IsExpression.Value;
}
schemaRow[IsReadOnly] = colMetaData.IsReadOnly;
schemaRow[IsIdentity] = colMetaData.IsIdentity;
schemaRow[IsColumnSet] = colMetaData.IsColumnSet;
schemaRow[IsAutoIncrement] = colMetaData.IsIdentity;
schemaRow[IsLong] = metaType.IsLong;
// mark unique for timestamp columns
if ( SqlDbType.Timestamp == colMetaData.SqlDbType ) {
schemaRow[IsUnique] = true;
schemaRow[IsRowVersion] = true;
}
else {
schemaRow[IsUnique] = false;
schemaRow[IsRowVersion] = false;
}
if ( !ADP.IsEmpty( colMetaData.ColumnName ) ) {
schemaRow[BaseColumnName] = colMetaData.ColumnName;
}
else if (!ADP.IsEmpty( colMetaData.Name)) {
// Use projection name if base column name is not present
schemaRow[BaseColumnName] = colMetaData.Name;
}
if ( !ADP.IsEmpty(colMetaData.TableName ) ) {
schemaRow[BaseTableName] = colMetaData.TableName;
}
if (!ADP.IsEmpty(colMetaData.SchemaName)) {
schemaRow[BaseSchemaName] = colMetaData.SchemaName;
}
if (!ADP.IsEmpty(colMetaData.CatalogName)) {
schemaRow[BaseCatalogName] = colMetaData.CatalogName;
}
if (!ADP.IsEmpty(colMetaData.ServerName)) {
schemaRow[BaseServerName] = colMetaData.ServerName;
}
if ( SqlDbType.Udt == colMetaData.SqlDbType ) {
schemaRow[DataTypeName] = colMetaData.TypeSpecificNamePart1 + "." + colMetaData.TypeSpecificNamePart2 + "." + colMetaData.TypeSpecificNamePart3;
}
else {
schemaRow[DataTypeName] = metaType.TypeName;
}
// Add Xml metadata
if ( SqlDbType.Xml == colMetaData.SqlDbType ) {
schemaRow[XmlSchemaCollectionDatabase] = colMetaData.TypeSpecificNamePart1;
schemaRow[XmlSchemaCollectionOwningSchema] = colMetaData.TypeSpecificNamePart2;
schemaRow[XmlSchemaCollectionName] = colMetaData.TypeSpecificNamePart3;
}
schemaTable.Rows.Add(schemaRow);
schemaRow.AcceptChanges();
}
// mark all columns as readonly
foreach(DataColumn column in columns) {
column.ReadOnly = true; // MDAC 70943
}
_schemaTable = schemaTable;
}
return _schemaTable;
}
//
// ISqlRecord methods
//
public override SqlBinary GetSqlBinary(int ordinal) {
EnsureCanGetCol( "GetSqlBinary", ordinal);
return ValueUtilsSmi.GetSqlBinary(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlBoolean GetSqlBoolean(int ordinal) {
EnsureCanGetCol( "GetSqlBoolean", ordinal);
return ValueUtilsSmi.GetSqlBoolean(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlByte GetSqlByte(int ordinal) {
EnsureCanGetCol( "GetSqlByte", ordinal);
return ValueUtilsSmi.GetSqlByte(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlInt16 GetSqlInt16(int ordinal) {
EnsureCanGetCol( "GetSqlInt16", ordinal);
return ValueUtilsSmi.GetSqlInt16(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlInt32 GetSqlInt32(int ordinal) {
EnsureCanGetCol( "GetSqlInt32", ordinal);
return ValueUtilsSmi.GetSqlInt32(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlInt64 GetSqlInt64(int ordinal) {
EnsureCanGetCol( "GetSqlInt64", ordinal);
return ValueUtilsSmi.GetSqlInt64(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlSingle GetSqlSingle(int ordinal) {
EnsureCanGetCol( "GetSqlSingle", ordinal);
return ValueUtilsSmi.GetSqlSingle(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlDouble GetSqlDouble(int ordinal) {
EnsureCanGetCol( "GetSqlDouble", ordinal);
return ValueUtilsSmi.GetSqlDouble(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlMoney GetSqlMoney(int ordinal) {
EnsureCanGetCol( "GetSqlMoney", ordinal);
return ValueUtilsSmi.GetSqlMoney(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlDateTime GetSqlDateTime(int ordinal) {
EnsureCanGetCol( "GetSqlDateTime", ordinal);
return ValueUtilsSmi.GetSqlDateTime(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
#if WINFS_UTC
public override virtual SqlUtcDateTime GetSqlUtcDateTime(int ordinal) {
EnsureCanGetCol( "GetSqlUtcDateTime", ordinal);
if ( SmiContextFactory.Instance.NegotiatedSmiVersion >= 3 ) {
return ValueUtilsSmi.GetSqlUtcDateTime( _readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal] );
}
// old V2- code path
return _currentColumnValues.GetSqlUtcDateTime( ordinal );
}
public override virtual SqlDate GetSqlDate(int ordinal) {
EnsureCanGetCol( "GetSqlDate", ordinal);
if ( SmiContextFactory.Instance.NegotiatedSmiVersion >= 3 ) {
return ValueUtilsSmi.GetSqlDate( _readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal] );
}
// old V2- code path
return _currentColumnValues.GetSqlDate( ordinal );
}
public override virtual SqlTime GetSqlTime(int ordinal) {
EnsureCanGetCol( "GetSqlTime", ordinal);
if ( SmiContextFactory.Instance.NegotiatedSmiVersion >= 3 ) {
return ValueUtilsSmi.GetSqlTime( _readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal] );
}
// old V2- code path
return _currentColumnValues.GetSqlTime( ordinal );
}
#endif
public override SqlDecimal GetSqlDecimal(int ordinal) {
EnsureCanGetCol( "GetSqlDecimal", ordinal);
return ValueUtilsSmi.GetSqlDecimal(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlString GetSqlString(int ordinal) {
EnsureCanGetCol( "GetSqlString", ordinal);
return ValueUtilsSmi.GetSqlString(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlGuid GetSqlGuid(int ordinal) {
EnsureCanGetCol( "GetSqlGuid", ordinal);
return ValueUtilsSmi.GetSqlGuid(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal]);
}
public override SqlChars GetSqlChars(int ordinal) {
EnsureCanGetCol( "GetSqlChars", ordinal);
return ValueUtilsSmi.GetSqlChars(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.InternalContext);
}
public override SqlBytes GetSqlBytes(int ordinal) {
EnsureCanGetCol( "GetSqlBytes", ordinal);
return ValueUtilsSmi.GetSqlBytes(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.InternalContext);
}
public override SqlXml GetSqlXml(int ordinal) {
EnsureCanGetCol( "GetSqlXml", ordinal);
return ValueUtilsSmi.GetSqlXml(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.InternalContext);
}
public override TimeSpan GetTimeSpan(int ordinal) {
EnsureCanGetCol("GetTimeSpan", ordinal);
return ValueUtilsSmi.GetTimeSpan(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.IsKatmaiOrNewer);
}
public override DateTimeOffset GetDateTimeOffset(int ordinal) {
EnsureCanGetCol("GetDateTimeOffset", ordinal);
return ValueUtilsSmi.GetDateTimeOffset(_readerEventSink, _currentColumnValuesV3, ordinal, _currentMetaData[ordinal], _currentConnection.IsKatmaiOrNewer);
}
public override object GetSqlValue(int ordinal) {
EnsureCanGetCol( "GetSqlValue", ordinal);
SmiMetaData metaData = _currentMetaData[ordinal];
if (_currentConnection.IsKatmaiOrNewer) {
return ValueUtilsSmi.GetSqlValue200(_readerEventSink, (SmiTypedGetterSetter)_currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext);
}
return ValueUtilsSmi.GetSqlValue(_readerEventSink, _currentColumnValuesV3, ordinal, metaData, _currentConnection.InternalContext); ;
}
public override int GetSqlValues(object[] values) {
EnsureCanGetCol( "GetSqlValues", 0);
if (null == values) {
throw ADP.ArgumentNull("values");
}
int copyLength = (values.Length < _visibleColumnCount) ? values.Length : _visibleColumnCount;
for(int i=0; i %d#, md.Length=%d nextEventIsRow=%d.\n", reader.ObjectID, (null != md) ? md.Length : -1, nextEventIsRow);
if (null != md) {
for (int i=0; i < md.Length; i++) {
Bid.Trace(" %d#, metaData[%d] is %s%s\n",
reader.ObjectID, i, md[i].GetType().ToString(), md[i].TraceString());
}
}
}
this.reader.MetaDataAvailable( md, nextEventIsRow );
}
// Obsolete V2- method
internal override void RowAvailable( ITypedGetters row ) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# (v2).\n", reader.ObjectID);
}
this.reader.RowAvailable( row );
}
internal override void RowAvailable( ITypedGettersV3 row ) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# (ITypedGettersV3).\n", reader.ObjectID);
}
this.reader.RowAvailable( row );
}
internal override void RowAvailable(SmiTypedGetterSetter rowData) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# (SmiTypedGetterSetter).\n", reader.ObjectID);
}
this.reader.RowAvailable(rowData);
}
internal override void StatementCompleted( int recordsAffected ) {
if (Bid.AdvancedOn) {
Bid.Trace(" %d# recordsAffected=%d.\n", reader.ObjectID, recordsAffected);
}
// devnote: relies on SmiEventSink_Default to pass event to parent
// Both command and reader care about StatementCompleted, but for different reasons.
base.StatementCompleted( recordsAffected );
this.reader.StatementCompleted( );
}
internal override void BatchCompleted() {
if (Bid.AdvancedOn) {
Bid.Trace(" %d#.\n", reader.ObjectID);
}
// devnote: relies on SmiEventSink_Default to pass event to parent
// parent's callback *MUST* come before reader's BatchCompleted, since
// reader will close the event stream during this call, and parent wants
// to extract parameter values before that happens.
base.BatchCompleted();
this.reader.BatchCompleted();
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SmtpSection.cs
- Stroke2.cs
- DifferencingCollection.cs
- ConfigurationSchemaErrors.cs
- SymmetricCryptoHandle.cs
- RootBrowserWindow.cs
- GridViewRowEventArgs.cs
- ManagementObjectCollection.cs
- XmlNamespaceManager.cs
- SiteMapSection.cs
- SetterBaseCollection.cs
- ColorAnimationUsingKeyFrames.cs
- SelectedDatesCollection.cs
- VariableAction.cs
- ColorContextHelper.cs
- elementinformation.cs
- ContentType.cs
- PopupEventArgs.cs
- ToolStripDropDownButton.cs
- PolyLineSegment.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- QilInvokeEarlyBound.cs
- ProxyFragment.cs
- EventLogger.cs
- ExpressionTable.cs
- Errors.cs
- DataSourceHelper.cs
- WinFormsComponentEditor.cs
- ExpandCollapseProviderWrapper.cs
- ConnectionPoolManager.cs
- SchemaTypeEmitter.cs
- WorkflowView.cs
- DnsPermission.cs
- VariableQuery.cs
- ResourceReferenceKeyNotFoundException.cs
- TextClipboardData.cs
- DynamicMethod.cs
- ReferenceConverter.cs
- BasicKeyConstraint.cs
- HtmlFormParameterReader.cs
- UnsignedPublishLicense.cs
- SqlNodeTypeOperators.cs
- SiteOfOriginContainer.cs
- MenuScrollingVisibilityConverter.cs
- DelegateTypeInfo.cs
- HtmlTextArea.cs
- ResXResourceReader.cs
- FastPropertyAccessor.cs
- WebPartConnectionsCancelEventArgs.cs
- TargetConverter.cs
- RemoteWebConfigurationHost.cs
- TreeSet.cs
- AppDomainShutdownMonitor.cs
- CommandValueSerializer.cs
- TypeDescriptorContext.cs
- ObjectReaderCompiler.cs
- IIS7UserPrincipal.cs
- PrtCap_Reader.cs
- WindowInteropHelper.cs
- StorageMappingItemLoader.cs
- TextParentUndoUnit.cs
- XPathNodeList.cs
- IgnoreDeviceFilterElement.cs
- InvalidComObjectException.cs
- ChannelServices.cs
- DomainConstraint.cs
- GeneralTransform3DGroup.cs
- ZoneButton.cs
- XmlSerializationReader.cs
- StrongNameKeyPair.cs
- GrowingArray.cs
- ServiceEndpointElement.cs
- RegionData.cs
- SoapIgnoreAttribute.cs
- PeerNameRecordCollection.cs
- WindowsSpinner.cs
- FtpRequestCacheValidator.cs
- CommunicationObjectManager.cs
- CssStyleCollection.cs
- SrgsText.cs
- GroupBox.cs
- EntityType.cs
- OpenTypeLayout.cs
- BuildManagerHost.cs
- XmlSchemaComplexContentExtension.cs
- TemplateControl.cs
- DataGridColumnFloatingHeader.cs
- DataGridViewComboBoxColumn.cs
- CacheAxisQuery.cs
- KeyManager.cs
- DataControlCommands.cs
- FixedSOMLineRanges.cs
- SuppressIldasmAttribute.cs
- PermissionSet.cs
- TextTreeRootNode.cs
- ScrollBarAutomationPeer.cs
- DiscreteKeyFrames.cs
- PackagingUtilities.cs
- AmbientProperties.cs
- HtmlElement.cs