private static MetadataBulkCopy ReadMetadata(TdsPackageReader reader) { var col = new MetadataBulkCopy(); // read user type - 4 bytes Yukon, 2 backwards reader.ReadUInt32(); // read the 2 flags and set appropriate flags in structure col.Flag1 = reader.ReadByte(); col.Flag2 = reader.ReadByte(); var tdsType = reader.ReadByte(); col.TdsType = tdsType; var tmp = col.MetaType = TdsMetaType.TdsTypes[tdsType]; col.IsPlp = tmp.IsPlp; col.IsTextOrImage = tmp.IsTextOrImage; var length = col.Length = reader.ReadTdsTypeLen(tmp.LenBytes); if (length == TdsEnums.SQL_USHORTVARMAXLEN && tmp.LenBytes == 2) { col.IsPlp = true; } if (tdsType == TdsEnums.SQLUDT) { reader.ReadUdtMetadata(); } if (tdsType == TdsEnums.SQLXMLTYPE) { reader.ReadXmlSchema(); } if (tmp.HasPrecision) { col.Precision = reader.ReadByte(); } if (tmp.HasScale) { col.Scale = reader.ReadByte(); } if (tmp.HasCollation) { col.Collation = reader.ReadCollation(); col.Encoding = reader.CurrentSession.GetEncodingFromCache(col.Collation.GetCodePage()); } if (col.IsTextOrImage) { col.PartTableName = reader.ReadMultiPartTableName(); } //bulkcopy typeCorrection if (tdsType == TdsEnums.SQLXMLTYPE) { col.TdsType = TdsEnums.SQLNVARCHAR; col.Length = TdsEnums.SQL_USHORTVARMAXLEN; col.Collation = new SqlCollations(); } if (tdsType == TdsEnums.SQLUDT) { col.TdsType = TdsEnums.SQLBIGVARBINARY; col.Length = TdsEnums.SQL_USHORTVARMAXLEN; } col.Column = reader.ReadString(reader.ReadByte()); return(col); }