private static void SetChars_FromRecord( SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDataRecord record, int offset ) { int length = 0; // Deal with large values by sending bufferLength of NoLengthLimit // CheckXetParameters will ignore length checks in this case long bufferLength = record.GetChars(ordinal, 0, null, 0, 0); if ( bufferLength > Int32.MaxValue ) { bufferLength = NoLengthLimit; } length = CheckXetParameters( metaData.SqlDbType, metaData.MaxLength, NoLengthLimit /* actual */, 0, checked( (int) bufferLength ), offset, checked( (int) bufferLength - offset ) ); int chunkSize; if ( length > __maxCharChunkSize || length < 0 ) { if (MetaDataUtilsSmi.IsAnsiType(metaData.SqlDbType)) { chunkSize = __maxByteChunkSize; } else { chunkSize = __maxCharChunkSize; } } else { chunkSize = checked( (int)length ); } char[] buffer = new char[ chunkSize ]; long charsRead; long charsWritten = 1; // prime value to get into write loop long currentOffset = offset; long lengthWritten = 0; while ( (length < 0 || lengthWritten < length) && 0 != ( charsRead = record.GetChars( ordinal, currentOffset, buffer, 0, chunkSize ) ) && 0 != charsWritten ) { charsWritten = setters.SetChars( sink, ordinal, currentOffset, buffer, 0, checked( (int) charsRead ) ); sink.ProcessMessagesAndThrow(); checked{ currentOffset += charsWritten; } checked{ lengthWritten += charsWritten;} } // Make sure to trim any left-over data setters.SetCharsLength( sink, ordinal, currentOffset ); sink.ProcessMessagesAndThrow(); }
private static void SetChars_FromRecord(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDataRecord record, int offset) { int num4; long num7; int num = 0; long num5 = record.GetChars(ordinal, 0L, null, 0, 0); if (num5 > 0x7fffffffL) { num5 = -1L; } num = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, (int) num5, offset, ((int) num5) - offset); if ((num > 0xfa0) || (num < 0)) { if (MetaDataUtilsSmi.IsAnsiType(metaData.SqlDbType)) { num4 = 0x1f40; } else { num4 = 0xfa0; } } else { num4 = num; } char[] buffer = new char[num4]; long num3 = 1L; long fieldOffset = offset; for (long i = 0L; ((num < 0) || (i < num)) && ((0L != (num7 = record.GetChars(ordinal, fieldOffset, buffer, 0, num4))) && (0L != num3)); i += num3) { num3 = setters.SetChars(sink, ordinal, fieldOffset, buffer, 0, (int) num7); sink.ProcessMessagesAndThrow(); fieldOffset += num3; } setters.SetCharsLength(sink, ordinal, fieldOffset); sink.ProcessMessagesAndThrow(); }