private void WriteTvpTypeInfo(MSS.SmiExtendedMetaData metaData, TdsParserStateObject stateObj)
{
Debug.Assert(SqlDbType.Structured == metaData.SqlDbType && metaData.IsMultiValued,
"Invalid metadata for TVPs. Type=" + metaData.SqlDbType);
// Type token
stateObj.WriteByte((byte)TdsEnums.SQLTABLE);
// 3-part name (DB, Schema, TypeName)
WriteIdentifier(metaData.TypeSpecificNamePart1, stateObj);
WriteIdentifier(metaData.TypeSpecificNamePart2, stateObj);
WriteIdentifier(metaData.TypeSpecificNamePart3, stateObj);
// TVP_COLMETADATA
if (0 == metaData.FieldMetaData.Count)
{
WriteUnsignedShort((ushort)TdsEnums.TVP_NOMETADATA_TOKEN, stateObj);
}
else
{
// COUNT of columns
WriteUnsignedShort(checked((ushort)metaData.FieldMetaData.Count), stateObj);
// TvpColumnMetaData for each column (look for defaults in this loop
MSS.SmiDefaultFieldsProperty defaults = (MSS.SmiDefaultFieldsProperty)metaData.ExtendedProperties[MSS.SmiPropertySelector.DefaultFields];
for (int i = 0; i < metaData.FieldMetaData.Count; i++)
{
WriteTvpColumnMetaData(metaData.FieldMetaData[i], defaults[i], stateObj);
}
// optional OrderUnique metadata
WriteTvpOrderUnique(metaData, stateObj);
}
// END of optional metadata
stateObj.WriteByte(TdsEnums.TVP_END_TOKEN);
}