internal static Stream GetStream(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool bypassTypeCheck = false) { bool isDbNull = ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal); // If a sql_variant, get the internal type if (!bypassTypeCheck) { if ((!isDbNull) && (metaData.SqlDbType == SqlDbType.Variant)) { metaData = getters.GetVariantType(sink, ordinal); } // If the SqlDbType is still variant, then it must contain null, so don't throw InvalidCast if ((metaData.SqlDbType != SqlDbType.Variant) && (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Stream))) { throw ADP.InvalidCast(); } } byte[] data; if (isDbNull) { // "null" stream data = new byte[0]; } else { // Read all data data = GetByteArray_Unchecked(sink, getters, ordinal); } // Wrap data in pre-built object return(new MemoryStream(data, writable: false)); }
internal static TextReader GetTextReader(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { bool isDbNull = ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal); // If a sql_variant, get the internal type if ((!isDbNull) && (metaData.SqlDbType == SqlDbType.Variant)) { metaData = getters.GetVariantType(sink, ordinal); } // If the SqlDbType is still variant, then it must contain null, so don't throw InvalidCast if ((metaData.SqlDbType != SqlDbType.Variant) && (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.TextReader))) { throw ADP.InvalidCast(); } string data; if (isDbNull) { // "null" textreader data = string.Empty; } else { // Read all data data = GetString_Unchecked(sink, getters, ordinal); } // Wrap in pre-built object return(new StringReader(data)); }
internal static SqlSequentialTextReaderSmi GetSequentialTextReader(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { Debug.Assert(!ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal), "Should not try to get a SqlSequentialTextReaderSmi on a null column"); ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.TextReader)) { throw ADP.InvalidCast(); } // This will advance the column to ordinal long length = GetCharsLength_Unchecked(sink, getters, ordinal); return(new SqlSequentialTextReaderSmi(sink, getters, ordinal, length)); }