private void WriteSmiTypeInfo(MSS.SmiExtendedMetaData metaData, TdsParserStateObject stateObj)
{
switch (metaData.SqlDbType)
{
case SqlDbType.BigInt:
stateObj.WriteByte(TdsEnums.SQLINTN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.Binary:
stateObj.WriteByte(TdsEnums.SQLBIGBINARY);
WriteUnsignedShort(checked((ushort)metaData.MaxLength), stateObj);
break;
case SqlDbType.Bit:
stateObj.WriteByte(TdsEnums.SQLBITN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.Char:
stateObj.WriteByte(TdsEnums.SQLBIGCHAR);
WriteUnsignedShort(checked((ushort)(metaData.MaxLength)), stateObj);
WriteUnsignedInt(_defaultCollation.info, stateObj);
stateObj.WriteByte(_defaultCollation.sortId);
break;
case SqlDbType.DateTime:
stateObj.WriteByte(TdsEnums.SQLDATETIMN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.Decimal:
stateObj.WriteByte(TdsEnums.SQLNUMERICN);
stateObj.WriteByte(checked((byte)MetaType.MetaDecimal.FixedLength)); // SmiMetaData's length and actual wire format's length are different
stateObj.WriteByte(0 == metaData.Precision ? (byte)1 : metaData.Precision);
stateObj.WriteByte(metaData.Scale);
break;
case SqlDbType.Float:
stateObj.WriteByte(TdsEnums.SQLFLTN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.Image:
stateObj.WriteByte(TdsEnums.SQLBIGVARBINARY);
WriteUnsignedShort(unchecked((ushort)MSS.SmiMetaData.UnlimitedMaxLengthIndicator), stateObj);
break;
case SqlDbType.Int:
stateObj.WriteByte(TdsEnums.SQLINTN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.Money:
stateObj.WriteByte(TdsEnums.SQLMONEYN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.NChar:
stateObj.WriteByte(TdsEnums.SQLNCHAR);
WriteUnsignedShort(checked((ushort)(metaData.MaxLength * 2)), stateObj);
WriteUnsignedInt(_defaultCollation.info, stateObj);
stateObj.WriteByte(_defaultCollation.sortId);
break;
case SqlDbType.NText:
stateObj.WriteByte(TdsEnums.SQLNVARCHAR);
WriteUnsignedShort(unchecked((ushort)MSS.SmiMetaData.UnlimitedMaxLengthIndicator), stateObj);
WriteUnsignedInt(_defaultCollation.info, stateObj);
stateObj.WriteByte(_defaultCollation.sortId);
break;
case SqlDbType.NVarChar:
stateObj.WriteByte(TdsEnums.SQLNVARCHAR);
if (MSS.SmiMetaData.UnlimitedMaxLengthIndicator == metaData.MaxLength)
{
WriteUnsignedShort(unchecked((ushort)MSS.SmiMetaData.UnlimitedMaxLengthIndicator), stateObj);
}
else
{
WriteUnsignedShort(checked((ushort)(metaData.MaxLength * 2)), stateObj);
}
WriteUnsignedInt(_defaultCollation.info, stateObj);
stateObj.WriteByte(_defaultCollation.sortId);
break;
case SqlDbType.Real:
stateObj.WriteByte(TdsEnums.SQLFLTN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.UniqueIdentifier:
stateObj.WriteByte(TdsEnums.SQLUNIQUEID);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.SmallDateTime:
stateObj.WriteByte(TdsEnums.SQLDATETIMN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.SmallInt:
stateObj.WriteByte(TdsEnums.SQLINTN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.SmallMoney:
stateObj.WriteByte(TdsEnums.SQLMONEYN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.Text:
stateObj.WriteByte(TdsEnums.SQLBIGVARCHAR);
WriteUnsignedShort(unchecked((ushort)MSS.SmiMetaData.UnlimitedMaxLengthIndicator), stateObj);
WriteUnsignedInt(_defaultCollation.info, stateObj);
stateObj.WriteByte(_defaultCollation.sortId);
break;
case SqlDbType.Timestamp:
stateObj.WriteByte(TdsEnums.SQLBIGBINARY);
WriteShort(checked((int)metaData.MaxLength), stateObj);
break;
case SqlDbType.TinyInt:
stateObj.WriteByte(TdsEnums.SQLINTN);
stateObj.WriteByte(checked((byte)metaData.MaxLength));
break;
case SqlDbType.VarBinary:
stateObj.WriteByte(TdsEnums.SQLBIGVARBINARY);
WriteUnsignedShort(unchecked((ushort)metaData.MaxLength), stateObj);
break;
case SqlDbType.VarChar:
stateObj.WriteByte(TdsEnums.SQLBIGVARCHAR);
WriteUnsignedShort(unchecked((ushort)metaData.MaxLength), stateObj);
WriteUnsignedInt(_defaultCollation.info, stateObj);
stateObj.WriteByte(_defaultCollation.sortId);
break;
case SqlDbType.Variant:
stateObj.WriteByte(TdsEnums.SQLVARIANT);
WriteInt(checked((int)metaData.MaxLength), stateObj);
break;
case SqlDbType.Xml:
stateObj.WriteByte(TdsEnums.SQLXMLTYPE);
// Is there a schema
if (string.IsNullOrEmpty(metaData.TypeSpecificNamePart1) && string.IsNullOrEmpty(metaData.TypeSpecificNamePart2) &&
string.IsNullOrEmpty(metaData.TypeSpecificNamePart3))
{
stateObj.WriteByte(0); // schema not present
}
else
{
stateObj.WriteByte(1); // schema present
WriteIdentifier(metaData.TypeSpecificNamePart1, stateObj);
WriteIdentifier(metaData.TypeSpecificNamePart2, stateObj);
WriteIdentifierWithShortLength(metaData.TypeSpecificNamePart3, stateObj);
}
break;
case SqlDbType.Udt:
stateObj.WriteByte(TdsEnums.SQLUDT);
WriteIdentifier(metaData.TypeSpecificNamePart1, stateObj);
WriteIdentifier(metaData.TypeSpecificNamePart2, stateObj);
WriteIdentifier(metaData.TypeSpecificNamePart3, stateObj);
break;
case SqlDbType.Structured:
if (metaData.IsMultiValued)
{
WriteTvpTypeInfo(metaData, stateObj);
}
else
{
Debug.Assert(false, "SUDTs not yet supported.");
}
break;
case SqlDbType.Date:
stateObj.WriteByte(TdsEnums.SQLDATE);
break;
case SqlDbType.Time:
stateObj.WriteByte(TdsEnums.SQLTIME);
stateObj.WriteByte(metaData.Scale);
break;
case SqlDbType.DateTime2:
stateObj.WriteByte(TdsEnums.SQLDATETIME2);
stateObj.WriteByte(metaData.Scale);
break;
case SqlDbType.DateTimeOffset:
stateObj.WriteByte(TdsEnums.SQLDATETIMEOFFSET);
stateObj.WriteByte(metaData.Scale);
break;
default:
Debug.Assert(false, "Unknown SqlDbType should have been caught earlier!");
break;
}
}