private void SetUpSmiRequest(SqlInternalConnectionSmi innerConnection) { this.DisposeSmiRequest(); if (this.Notification != null) { throw SQL.NotificationsNotAvailableOnContextConnection(); } SmiParameterMetaData[] parameterMetaData = null; ParameterPeekAheadValue[] valueArray = null; int parameterCount = this.GetParameterCount(this.Parameters); if (0 < parameterCount) { parameterMetaData = new SmiParameterMetaData[parameterCount]; valueArray = new ParameterPeekAheadValue[parameterCount]; for (int j = 0; j < parameterCount; j++) { SqlParameter parameter2 = this.Parameters[j]; parameter2.Validate(j, System.Data.CommandType.StoredProcedure == this.CommandType); parameterMetaData[j] = parameter2.MetaDataForSmi(out valueArray[j]); if (!innerConnection.IsKatmaiOrNewer) { MetaType metaTypeFromSqlDbType = MetaType.GetMetaTypeFromSqlDbType(parameterMetaData[j].SqlDbType, parameterMetaData[j].IsMultiValued); if (!metaTypeFromSqlDbType.Is90Supported) { throw ADP.VersionDoesNotSupportDataType(metaTypeFromSqlDbType.TypeName); } } } } System.Data.CommandType commandType = this.CommandType; this._smiRequestContext = innerConnection.InternalContext; this._smiRequest = this._smiRequestContext.CreateRequestExecutor(this.CommandText, commandType, parameterMetaData, this.EventSink); this.EventSink.ProcessMessagesAndThrow(); for (int i = 0; i < parameterCount; i++) { if ((ParameterDirection.Output == parameterMetaData[i].Direction) || (ParameterDirection.ReturnValue == parameterMetaData[i].Direction)) { continue; } SqlParameter parameter = this.Parameters[i]; object coercedValue = parameter.GetCoercedValue(); ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(parameterMetaData[i].SqlDbType, parameterMetaData[i].IsMultiValued, coercedValue, null, SmiContextFactory.Instance.NegotiatedSmiVersion); if ((System.Data.CommandType.StoredProcedure == commandType) && (ExtendedClrTypeCode.Empty == typeCode)) { this._smiRequest.SetDefault(i); continue; } int size = parameter.Size; if (((size != 0) && (size != -1L)) && !parameter.SizeInferred) { switch (parameterMetaData[i].SqlDbType) { case SqlDbType.NText: if (size != 0x3fffffff) { throw SQL.ParameterSizeRestrictionFailure(i); } break; case SqlDbType.NVarChar: if (((size > 0) && (size != 0x3fffffff)) && (parameterMetaData[i].MaxLength == -1L)) { throw SQL.ParameterSizeRestrictionFailure(i); } break; case SqlDbType.Text: case SqlDbType.Image: goto Label_01E8; case SqlDbType.Timestamp: if (size < SmiMetaData.DefaultTimestamp.MaxLength) { throw SQL.ParameterSizeRestrictionFailure(i); } break; case SqlDbType.VarBinary: case SqlDbType.VarChar: goto Label_020C; case SqlDbType.Variant: goto Label_0271; case SqlDbType.Xml: if ((coercedValue != null) && (ExtendedClrTypeCode.SqlXml != typeCode)) { throw SQL.ParameterSizeRestrictionFailure(i); } break; } } goto Label_02CF; Label_01E8: if (size == 0x7fffffff) { goto Label_02CF; } throw SQL.ParameterSizeRestrictionFailure(i); Label_020C: if (((size <= 0) || (size == 0x7fffffff)) || (parameterMetaData[i].MaxLength != -1L)) { goto Label_02CF; } throw SQL.ParameterSizeRestrictionFailure(i); Label_0271: if (coercedValue != null) { MetaType metaTypeFromValue = MetaType.GetMetaTypeFromValue(coercedValue); if (((metaTypeFromValue.IsNCharType && (size < 0xfa0L)) || (metaTypeFromValue.IsBinType && (size < 0x1f40L))) || (metaTypeFromValue.IsAnsiType && (size < 0x1f40L))) { throw SQL.ParameterSizeRestrictionFailure(i); } } Label_02CF: if (innerConnection.IsKatmaiOrNewer) { ValueUtilsSmi.SetCompatibleValueV200(this.EventSink, this._smiRequest, i, parameterMetaData[i], coercedValue, typeCode, parameter.Offset, parameter.Size, valueArray[i]); } else { ValueUtilsSmi.SetCompatibleValue(this.EventSink, this._smiRequest, i, parameterMetaData[i], coercedValue, typeCode, parameter.Offset); } } }
private void DisposeSmiRequest() { if (this._smiRequest != null) { SmiRequestExecutor executor = this._smiRequest; this._smiRequest = null; this._smiRequestContext = null; executor.Close(this.EventSink); this.EventSink.ProcessMessagesAndThrow(); } }