Example #1
0
        private void SetupColMetaData(TdsPackageReader reader, TdsPackageWriter writer, int tdsType, byte precision, byte scale, bool isPlp)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var r         = reader.CurrentResultSet.ColumnsMetadata = new ColumnsMetadata(1);
            var w         = writer.ColumnsMetadata = new MetadataBulkCopy[1];
            var collation = new SqlCollations {
                Info = 0x00d00409, SortId = 0x34
            };
            var encoding = Encoding.GetEncoding(collation.GetCodePage());

            w[0]         = new MetadataBulkCopy();
            r[0].TdsType = (byte)tdsType;
            w[0].TdsType = (byte)tdsType;
            r[0].Scale   = scale;
            w[0].Scale   = scale;
            r[0].IsPlp   = isPlp;
            w[0].IsPlp   = isPlp;
            r[0].IsPlp   = isPlp;
            w[0].Length  = scale;// nullable date testfix

            r[0].Encoding  = encoding;
            w[0].Encoding  = encoding;
            w[0].Collation = collation;

            w[0].Precision = precision;

            w[0].MetaType = TdsMetaType.TdsTypes[tdsType];
            r[0].MetaType = TdsMetaType.TdsTypes[tdsType];

            r[0].IsTextOrImage = r[0].MetaType.IsTextOrImage;
            w[0].IsTextOrImage = r[0].MetaType.IsTextOrImage;
        }
        public static MetadataBulkCopy[] ColMetaDataBulkCopy(this TdsPackageReader reader, int columns)
        {
            reader.InitNbcBitmap(columns);

            var newMetaData = new MetadataBulkCopy[columns];

            for (var i = 0; i < columns; i++)
            {
                newMetaData[i] = ReadMetadata(reader);
            }
            return(newMetaData);
        }
        private static void WriteColumn(TdsPackageWriter writer, MetadataBulkCopy md)
        {
            writer.WriteInt32(0x0);

            writer.WriteByte(md.Flag1);
            writer.WriteByte(md.Flag2);
            writer.WriteByte(md.TdsType);
            var mt = TdsMetaType.TdsTypes[md.TdsType];

            if (mt.LenBytes == 1)
            {
                writer.WriteByte(md.Length);
            }
            if (mt.LenBytes == 2)
            {
                writer.WriteInt16(md.Length);
            }
            if (mt.LenBytes == 4)
            {
                writer.WriteInt32(md.Length);
            }

            if (mt.HasPrecision)
            {
                writer.WriteByte(md.Precision);
            }
            if (mt.HasScale)
            {
                writer.WriteByte(md.Scale);
            }
            if (mt.HasCollation)
            {
                writer.WriteUInt32(md.Collation.Info);
                writer.WriteByte(md.Collation.SortId);
            }

            if (mt.IsTextOrImage)
            {
                writer.WriteInt16(md.PartTableName.TableName.Length);
                writer.WriteUnicodeString(md.PartTableName.TableName);
            }

            writer.WriteByte((byte)md.Column.Length);
            writer.WriteUnicodeString(md.Column);
        }
        private static string CreateParameter(MetadataBulkCopy mt)
        {
            var size = mt.IsPlp ? "max" : mt.Length.ToString();

            switch (mt.TdsType)
            {
            case TdsEnums.SQLBIT: return(" Bit");

            case TdsEnums.SQLBITN: return(" Bit");

            case TdsEnums.SQLINT1: return(" TinyInt");

            case TdsEnums.SQLINT2: return(" SmallInt");

            case TdsEnums.SQLINT4: return(" Int");

            case TdsEnums.SQLINT8: return(" BigInt");

            case TdsEnums.SQLINTN:
                if (mt.Length == 1)
                {
                    goto case TdsEnums.SQLINT1;
                }
                if (mt.Length == 2)
                {
                    goto case TdsEnums.SQLINT2;
                }
                if (mt.Length == 4)
                {
                    goto case TdsEnums.SQLINT4;
                }
                if (mt.Length == 8)
                {
                    goto case TdsEnums.SQLINT8;
                }
                throw new Exception("Unknown length of SQLINTN");

            case TdsEnums.SQLMONEY4: return(" SmallMoney");

            case TdsEnums.SQLMONEY: return(" Money");

            case TdsEnums.SQLMONEYN:
                if (mt.Length == 4)
                {
                    goto case TdsEnums.SQLMONEY4;
                }
                if (mt.Length == 8)
                {
                    goto case TdsEnums.SQLMONEY;
                }
                throw new Exception("Unknown length of SQLMONEYN");

            case TdsEnums.SQLFLT4: return(" Real");

            case TdsEnums.SQLFLT8: return(" Float");

            case TdsEnums.SQLFLTN:
                if (mt.Length == 4)
                {
                    goto case TdsEnums.SQLFLT4;
                }
                if (mt.Length == 8)
                {
                    goto case TdsEnums.SQLFLT8;
                }
                throw new Exception("Unknown length of SQLFLTN");

            case TdsEnums.SQLDATETIME2: return($" DateTime2({mt.Scale})");

            case TdsEnums.SQLDATETIMEOFFSET: return($" DateTimeOffset({mt.Scale})");

            case TdsEnums.SQLDATETIM4: return(" SmallDateTime");

            case TdsEnums.SQLDATETIME: return(" DateTime");

            case TdsEnums.SQLDATETIMN:
                if (mt.Length == 4)
                {
                    goto case TdsEnums.SQLDATETIM4;
                }
                if (mt.Length == 8)
                {
                    goto case TdsEnums.SQLDATETIME;
                }
                throw new Exception("Unknown length of SQLDATETIMN");

            case TdsEnums.SQLDATE: return(" Date");

            case TdsEnums.SQLTIME: return($" Time({mt.Scale})");

            case TdsEnums.SQLDECIMALN: return($" Decimal({mt.Precision},{mt.Scale})");

            case TdsEnums.SQLUNIQUEID: return(" UniqueIdentifier");

            case TdsEnums.SQLBIGBINARY: return($" Binary({mt.Length})");

            case TdsEnums.SQLBIGVARBINARY: return($" VarBinary({size})");

            case TdsEnums.SQLBIGCHAR: return($" Char({mt.Length})");

            case TdsEnums.SQLBIGVARCHAR: return($" VarChar({size})");

            case TdsEnums.SQLNCHAR: return($" NChar({mt.Length})");

            case TdsEnums.SQLNVARCHAR: return($" NVarChar({size})");

            case TdsEnums.SQLVARIANT: return(" Sql_variant");

            case TdsEnums.SQLIMAGE: return(" Image");

            case TdsEnums.SQLTEXT: return(" Text");

            case TdsEnums.SQLNTEXT: return(" NText");
            }

            throw new Exception("TdsType Unknown");
        }
        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);
        }