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); }