本文整理汇总了C#中System.Data.SqlClient.TdsParserStateObject.WriteByte方法的典型用法代码示例。如果您正苦于以下问题:C# TdsParserStateObject.WriteByte方法的具体用法?C# TdsParserStateObject.WriteByte怎么用?C# TdsParserStateObject.WriteByte使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Data.SqlClient.TdsParserStateObject
的用法示例。
在下文中一共展示了TdsParserStateObject.WriteByte方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: WriteCryptoMetadata
/// <summary>
/// Writes the crypto metadata (as part of COLMETADATA token) for encrypted columns.
/// </summary>
/// <returns></returns>
internal void WriteCryptoMetadata(_SqlMetaData md, TdsParserStateObject stateObj) {
if (!_serverSupportsColumnEncryption || // TCE Feature supported
!md.isEncrypted || // Column is not encrypted
!ShouldEncryptValuesForBulkCopy()) { // TCE disabled on connection string
return;
}
// Write the ordinal
WriteShort (md.cipherMD.CekTableOrdinal, stateObj);
// Write UserType and TYPEINFO
WriteTceUserTypeAndTypeInfo(md.baseTI, stateObj);
// Write Encryption Algo
stateObj.WriteByte(md.cipherMD.CipherAlgorithmId);
if (TdsEnums.CustomCipherAlgorithmId == md.cipherMD.CipherAlgorithmId) {
// Write the algorithm name
Debug.Assert (md.cipherMD.CipherAlgorithmName.Length < 256);
stateObj.WriteByte((byte)md.cipherMD.CipherAlgorithmName.Length);
WriteString(md.cipherMD.CipherAlgorithmName, stateObj);
}
// Write Encryption Algo Type
stateObj.WriteByte(md.cipherMD.EncryptionType);
// Write Normalization Version
stateObj.WriteByte(md.cipherMD.NormalizationRuleVersion);
}
示例2: WriteTokenLength
//
// Reverse function of GetTokenLength
//
private void WriteTokenLength(byte token, int length, TdsParserStateObject stateObj)
{
int tokenLength = 0;
Debug.Assert(token != 0, "0 length token!");
// For Plp fields, this should only be used when writing to metadata header.
// For actual data length, WriteDataLength should be used.
// For Xml fields, there is no token length field. For MAX fields it is 0xffff.
{
if (TdsEnums.SQLUDT == token)
{
tokenLength = 8;
}
else if (token == TdsEnums.SQLXMLTYPE)
{
tokenLength = 8;
}
}
if (tokenLength == 0)
{
switch (token & TdsEnums.SQLLenMask)
{
case TdsEnums.SQLFixedLen:
Debug.Assert(length == 0x01 << ((token & 0x0c) >> 2), "length does not match encoded length in token");
tokenLength = 0;
break;
case TdsEnums.SQLZeroLen:
tokenLength = 0;
break;
case TdsEnums.SQLVarLen:
case TdsEnums.SQLVarCnt:
if (0 != (token & 0x80))
tokenLength = 2;
else if (0 == (token & 0x0c))
tokenLength = 4;
else
tokenLength = 1;
break;
default:
Debug.Assert(false, "Unknown token length!");
break;
}
switch (tokenLength)
{
case 1:
stateObj.WriteByte((byte)length);
break;
case 2:
WriteShort(length, stateObj);
break;
case 4:
WriteInt(length, stateObj);
break;
case 8:
// In the metadata case we write 0xffff for partial length prefixed types.
// For actual data length preceding data, WriteDataLength should be used.
WriteShort(TdsEnums.SQL_USHORTVARMAXLEN, stateObj);
break;
} // end switch
}
}
示例3: WriteUnterminatedValue
// For MAX types, this method can only write everything in one big chunk. If multiple
// chunk writes needed, please use WritePlpBytes/WritePlpChars
private Task WriteUnterminatedValue(object value, MetaType type, byte scale, int actualLength, int encodingByteSize, int offset, TdsParserStateObject stateObj, int paramSize, bool isDataFeed)
{
Debug.Assert((null != value) && (DBNull.Value != value), "unexpected missing or empty object");
// parameters are always sent over as BIG or N types
switch (type.NullableType)
{
case TdsEnums.SQLFLTN:
if (type.FixedLength == 4)
WriteFloat((Single)value, stateObj);
else
{
Debug.Assert(type.FixedLength == 8, "Invalid length for SqlDouble type!");
WriteDouble((Double)value, stateObj);
}
break;
case TdsEnums.SQLBIGBINARY:
case TdsEnums.SQLBIGVARBINARY:
case TdsEnums.SQLIMAGE:
case TdsEnums.SQLUDT:
{
// An array should be in the object
Debug.Assert(isDataFeed || value is byte[], "Value should be an array of bytes");
Debug.Assert(!isDataFeed || value is StreamDataFeed, "Value should be a stream");
if (isDataFeed)
{
Debug.Assert(type.IsPlp, "Stream assigned to non-PLP was not converted!");
return NullIfCompletedWriteTask(WriteStreamFeed((StreamDataFeed)value, stateObj, paramSize));
}
else
{
if (type.IsPlp)
{
WriteInt(actualLength, stateObj); // chunk length
}
return stateObj.WriteByteArray((byte[])value, actualLength, offset, canAccumulate: false);
}
}
case TdsEnums.SQLUNIQUEID:
{
System.Guid guid = (System.Guid)value;
byte[] b = guid.ToByteArray();
Debug.Assert((actualLength == b.Length) && (actualLength == 16), "Invalid length for guid type in com+ object");
stateObj.WriteByteArray(b, actualLength, 0);
break;
}
case TdsEnums.SQLBITN:
{
Debug.Assert(type.FixedLength == 1, "Invalid length for SqlBoolean type");
if ((bool)value == true)
stateObj.WriteByte(1);
else
stateObj.WriteByte(0);
break;
}
case TdsEnums.SQLINTN:
if (type.FixedLength == 1)
stateObj.WriteByte((byte)value);
else if (type.FixedLength == 2)
WriteShort((Int16)value, stateObj);
else if (type.FixedLength == 4)
WriteInt((Int32)value, stateObj);
else
{
Debug.Assert(type.FixedLength == 8, "invalid length for SqlIntN type: " + type.FixedLength.ToString(CultureInfo.InvariantCulture));
WriteLong((Int64)value, stateObj);
}
break;
case TdsEnums.SQLBIGCHAR:
case TdsEnums.SQLBIGVARCHAR:
case TdsEnums.SQLTEXT:
{
Debug.Assert(!isDataFeed || (value is TextDataFeed || value is XmlDataFeed), "Value must be a TextReader or XmlReader");
Debug.Assert(isDataFeed || (value is string || value is byte[]), "Value is a byte array or string");
if (isDataFeed)
{
Debug.Assert(type.IsPlp, "Stream assigned to non-PLP was not converted!");
TextDataFeed tdf = value as TextDataFeed;
if (tdf == null)
{
return NullIfCompletedWriteTask(WriteXmlFeed((XmlDataFeed)value, stateObj, needBom: true, encoding: _defaultEncoding, size: paramSize));
}
else
{
return NullIfCompletedWriteTask(WriteTextFeed(tdf, _defaultEncoding, false, stateObj, paramSize));
}
}
//.........这里部分代码省略.........
示例4: WriteTvpOrderUnique
private void WriteTvpOrderUnique(MSS.SmiExtendedMetaData metaData, TdsParserStateObject stateObj)
{
// TVP_ORDER_UNIQUE token (uniqueness and sort order)
// Merge order and unique keys into a single token stream
MSS.SmiOrderProperty orderProperty = (MSS.SmiOrderProperty)metaData.ExtendedProperties[MSS.SmiPropertySelector.SortOrder];
MSS.SmiUniqueKeyProperty uniqueKeyProperty = (MSS.SmiUniqueKeyProperty)metaData.ExtendedProperties[MSS.SmiPropertySelector.UniqueKey];
// Build list from
List<TdsOrderUnique> columnList = new List<TdsOrderUnique>(metaData.FieldMetaData.Count);
for (int i = 0; i < metaData.FieldMetaData.Count; i++)
{
// Add appropriate SortOrder flag
byte flags = 0;
MSS.SmiOrderProperty.SmiColumnOrder columnOrder = orderProperty[i];
if (SortOrder.Ascending == columnOrder.Order)
{
flags = TdsEnums.TVP_ORDERASC_FLAG;
}
else if (SortOrder.Descending == columnOrder.Order)
{
flags = TdsEnums.TVP_ORDERDESC_FLAG;
}
// Add unique key flage if appropriate
if (uniqueKeyProperty[i])
{
flags |= TdsEnums.TVP_UNIQUE_FLAG;
}
// Remember this column if any flags were set
if (0 != flags)
{
columnList.Add(new TdsOrderUnique(checked((short)(i + 1)), flags));
}
}
// Write flagged columns to wire...
if (0 < columnList.Count)
{
stateObj.WriteByte(TdsEnums.TVP_ORDER_UNIQUE_TOKEN);
WriteShort(columnList.Count, stateObj);
foreach (TdsOrderUnique column in columnList)
{
WriteShort(column.ColumnOrdinal, stateObj);
stateObj.WriteByte(column.Flags);
}
}
}
示例5: WriteBulkCopyMetaData
internal void WriteBulkCopyMetaData(_SqlMetaDataSet metadataCollection, int count, TdsParserStateObject stateObj)
{
if (!(State == TdsParserState.OpenNotLoggedIn || State == TdsParserState.OpenLoggedIn))
{
throw ADP.ClosedConnectionError();
}
stateObj.WriteByte(TdsEnums.SQLCOLMETADATA);
WriteShort(count, stateObj);
for (int i = 0; i < metadataCollection.Length; i++)
{
if (metadataCollection[i] != null)
{
_SqlMetaData md = metadataCollection[i];
// read user type - 4 bytes Yukon, 2 backwards
WriteInt(0x0, stateObj);
UInt16 flags;
flags = (UInt16)(md.updatability << 2);
flags |= (UInt16)(md.isNullable ? (UInt16)TdsEnums.Nullable : (UInt16)0);
flags |= (UInt16)(md.isIdentity ? (UInt16)TdsEnums.Identity : (UInt16)0);
WriteShort(flags, stateObj); // write the flags
switch (md.type)
{
case SqlDbType.Decimal:
stateObj.WriteByte(md.tdsType);
WriteTokenLength(md.tdsType, md.length, stateObj);
stateObj.WriteByte(md.precision);
stateObj.WriteByte(md.scale);
break;
case SqlDbType.Xml:
stateObj.WriteByteArray(s_xmlMetadataSubstituteSequence, s_xmlMetadataSubstituteSequence.Length, 0);
break;
case SqlDbType.Udt:
throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString());
case SqlDbType.Date:
stateObj.WriteByte(md.tdsType);
break;
case SqlDbType.Time:
case SqlDbType.DateTime2:
case SqlDbType.DateTimeOffset:
stateObj.WriteByte(md.tdsType);
stateObj.WriteByte(md.scale);
break;
default:
stateObj.WriteByte(md.tdsType);
WriteTokenLength(md.tdsType, md.length, stateObj);
if (md.metaType.IsCharType)
{
WriteUnsignedInt(md.collation.info, stateObj);
stateObj.WriteByte(md.collation.sortId);
}
break;
}
if (md.metaType.IsLong && !md.metaType.IsPlp)
{
WriteShort(md.tableName.Length, stateObj);
WriteString(md.tableName, stateObj);
}
stateObj.WriteByte((byte)md.column.Length);
WriteString(md.column, stateObj);
}
} // end for loop
}
示例6: WriteParameterName
private void WriteParameterName(string parameterName, TdsParserStateObject stateObj)
{
// paramLen
// paramName
if (!ADP.IsEmpty(parameterName))
{
Debug.Assert(parameterName.Length <= 0xff, "parameter name can only be 255 bytes, shouldn't get to TdsParser!");
int tempLen = parameterName.Length & 0xff;
stateObj.WriteByte((byte)tempLen);
WriteString(parameterName, tempLen, 0, stateObj);
}
else
{
stateObj.WriteByte(0);
}
}
示例7: WriteSmiTypeInfo
// Write a TypeInfo stream
// Devnote: we remap the legacy types (text, ntext, and image) to SQLBIGVARCHAR, SQLNVARCHAR, and SQLBIGVARBINARY
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);
//.........这里部分代码省略.........
示例8: WritePartialLong
//
// Takes a long and writes part of it
//
internal void WritePartialLong(long v, int length, TdsParserStateObject stateObj)
{
Debug.Assert(length <= 8, "Length specified is longer than the size of a long");
Debug.Assert(length >= 0, "Length should not be negative");
if ((stateObj._outBytesUsed + length) > stateObj._outBuff.Length)
{
// if all of the long doesn't fit into the buffer
for (int shiftValue = 0; shiftValue < length * 8; shiftValue += 8)
{
stateObj.WriteByte((byte)((v >> shiftValue) & 0xff));
}
}
else
{
// all of the long fits into the buffer
for (int index = 0; index < length; index++)
{
stateObj._outBuff[stateObj._outBytesUsed + index] = (byte)((v >> (index * 8)) & 0xff);
}
stateObj._outBytesUsed += length;
}
}
示例9: WriteSqlVariantValue
//
// Translates a com+ object -> SqlVariant
// when the type is ambiguous, we always convert to the bigger type
// note that we also write out the maxlen and actuallen members (4 bytes each)
// in addition to the SQLVariant structure
//
internal Task WriteSqlVariantValue(object value, int length, int offset, TdsParserStateObject stateObj, bool canAccumulate = true)
{
// handle null values
if (ADP.IsNull(value))
{
WriteInt(TdsEnums.FIXEDNULL, stateObj); //maxlen
WriteInt(TdsEnums.FIXEDNULL, stateObj); //actuallen
return null;
}
MetaType mt = MetaType.GetMetaTypeFromValue(value);
// Special case data type correction for SqlMoney inside a SqlVariant.
if ((TdsEnums.SQLNUMERICN == mt.TDSType) && (8 == length))
{
// The caller will coerce all SqlTypes to native CLR types, which means SqlMoney will
// coerce to decimal/SQLNUMERICN (via SqlMoney.Value call). In the case where the original
// value was SqlMoney the caller will also pass in the metadata length for the SqlMoney type
// which is 8 bytes. To honor the intent of the caller here we coerce this special case
// input back to SqlMoney from decimal/SQLNUMERICN.
mt = MetaType.GetMetaTypeFromValue(new SqlMoney((decimal)value));
}
if (mt.IsAnsiType)
{
length = GetEncodingCharLength((string)value, length, 0, _defaultEncoding);
}
// max and actual len are equal to
// SQLVARIANTSIZE {type (1 byte) + cbPropBytes (1 byte)} + cbPropBytes + length (actual length of data in bytes)
WriteInt(TdsEnums.SQLVARIANT_SIZE + mt.PropBytes + length, stateObj); // maxLen
WriteInt(TdsEnums.SQLVARIANT_SIZE + mt.PropBytes + length, stateObj); // actualLen
// write the SQLVariant header (type and cbPropBytes)
stateObj.WriteByte(mt.TDSType);
stateObj.WriteByte(mt.PropBytes);
// now write the actual PropBytes and data
switch (mt.TDSType)
{
case TdsEnums.SQLFLT4:
WriteFloat((Single)value, stateObj);
break;
case TdsEnums.SQLFLT8:
WriteDouble((Double)value, stateObj);
break;
case TdsEnums.SQLINT8:
WriteLong((Int64)value, stateObj);
break;
case TdsEnums.SQLINT4:
WriteInt((Int32)value, stateObj);
break;
case TdsEnums.SQLINT2:
WriteShort((Int16)value, stateObj);
break;
case TdsEnums.SQLINT1:
stateObj.WriteByte((byte)value);
break;
case TdsEnums.SQLBIT:
if ((bool)value == true)
stateObj.WriteByte(1);
else
stateObj.WriteByte(0);
break;
case TdsEnums.SQLBIGVARBINARY:
{
byte[] b = (byte[])value;
WriteShort(length, stateObj); // propbytes: varlen
return stateObj.WriteByteArray(b, length, offset, canAccumulate);
}
case TdsEnums.SQLBIGVARCHAR:
{
string s = (string)value;
WriteUnsignedInt(_defaultCollation.info, stateObj); // propbytes: collation.Info
stateObj.WriteByte(_defaultCollation.sortId); // propbytes: collation.SortId
WriteShort(length, stateObj); // propbyte: varlen
return WriteEncodingChar(s, _defaultEncoding, stateObj, canAccumulate);
}
case TdsEnums.SQLUNIQUEID:
{
System.Guid guid = (System.Guid)value;
byte[] b = guid.ToByteArray();
//.........这里部分代码省略.........
示例10: WriteInt
//
// Takes an int and writes it as an int.
//
internal void WriteInt(int v, TdsParserStateObject stateObj)
{
if ((stateObj._outBytesUsed + 4) > stateObj._outBuff.Length)
{
// if all of the int doesn't fit into the buffer
for (int shiftValue = 0; shiftValue < sizeof(int) * 8; shiftValue += 8)
{
stateObj.WriteByte((byte)((v >> shiftValue) & 0xff));
}
}
else
{
// all of the int fits into the buffer
// NOTE: We don't use a loop here for performance
stateObj._outBuff[stateObj._outBytesUsed] = (byte)(v & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 1] = (byte)((v >> 8) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 2] = (byte)((v >> 16) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 3] = (byte)((v >> 24) & 0xff);
stateObj._outBytesUsed += 4;
}
}
示例11: WriteLong
//
// Takes a long and writes it as a long.
//
internal void WriteLong(long v, TdsParserStateObject stateObj)
{
if ((stateObj._outBytesUsed + 8) > stateObj._outBuff.Length)
{
// if all of the long doesn't fit into the buffer
for (int shiftValue = 0; shiftValue < sizeof(long) * 8; shiftValue += 8)
{
stateObj.WriteByte((byte)((v >> shiftValue) & 0xff));
}
}
else
{
// all of the long fits into the buffer
// NOTE: We don't use a loop here for performance
stateObj._outBuff[stateObj._outBytesUsed] = (byte)(v & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 1] = (byte)((v >> 8) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 2] = (byte)((v >> 16) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 3] = (byte)((v >> 24) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 4] = (byte)((v >> 32) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 5] = (byte)((v >> 40) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 6] = (byte)((v >> 48) & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 7] = (byte)((v >> 56) & 0xff);
stateObj._outBytesUsed += 8;
}
}
示例12: WriteShort
//
// Takes a 16 bit short and writes it.
//
internal void WriteShort(int v, TdsParserStateObject stateObj)
{
if ((stateObj._outBytesUsed + 2) > stateObj._outBuff.Length)
{
// if all of the short doesn't fit into the buffer
stateObj.WriteByte((byte)(v & 0xff));
stateObj.WriteByte((byte)((v >> 8) & 0xff));
}
else
{
// all of the short fits into the buffer
stateObj._outBuff[stateObj._outBytesUsed] = (byte)(v & 0xff);
stateObj._outBuff[stateObj._outBytesUsed + 1] = (byte)((v >> 8) & 0xff);
stateObj._outBytesUsed += 2;
}
}
示例13: WriteSqlDecimal
internal void WriteSqlDecimal(SqlDecimal d, TdsParserStateObject stateObj)
{
// sign
if (d.IsPositive)
stateObj.WriteByte(1);
else
stateObj.WriteByte(0);
uint data1, data2, data3, data4;
SqlTypeWorkarounds.SqlDecimalExtractData(d, out data1, out data2, out data3, out data4);
WriteUnsignedInt(data1, stateObj);
WriteUnsignedInt(data2, stateObj);
WriteUnsignedInt(data3, stateObj);
WriteUnsignedInt(data4, stateObj);
}
示例14: WriteBulkCopyMetaData
internal void WriteBulkCopyMetaData(_SqlMetaDataSet metadataCollection, int count, TdsParserStateObject stateObj) {
if (!(State == TdsParserState.OpenNotLoggedIn || State == TdsParserState.OpenLoggedIn)) {
throw ADP.ClosedConnectionError();
}
stateObj.WriteByte(TdsEnums.SQLCOLMETADATA);
WriteShort(count, stateObj);
// Write CEK table - 0 count
WriteCekTable(metadataCollection, stateObj);
for (int i = 0; i < metadataCollection.Length; i++) {
if (metadataCollection[i] != null) {
_SqlMetaData md = metadataCollection[i];
// read user type - 4 bytes Yukon, 2 backwards
if (IsYukonOrNewer) {
WriteInt(0x0, stateObj);
}
else {
WriteShort(0x0000, stateObj);
}
// Write the flags
UInt16 flags;
flags = (UInt16)(md.updatability << 2);
flags |= (UInt16)(md.isNullable ? (UInt16)TdsEnums.Nullable : (UInt16)0);
flags |= (UInt16)(md.isIdentity ? (UInt16)TdsEnums.Identity : (UInt16)0);
// Write the next byte of flags
if (_serverSupportsColumnEncryption) { // TCE Supported
if (ShouldEncryptValuesForBulkCopy()) { // TCE enabled on connection options
flags |= (UInt16)(md.isEncrypted ? (UInt16)(TdsEnums.IsEncrypted << 8) : (UInt16)0);
}
}
WriteShort(flags, stateObj);// write the flags
// todo:
// for xml WriteTokenLength results in a no-op
// discuss this with blaine ...
// ([....]) xml datatype does not have token length in its metadata. So it should be a noop.
switch (md.type) {
case SqlDbType.Decimal:
stateObj.WriteByte(md.tdsType);
WriteTokenLength(md.tdsType, md.length, stateObj);
stateObj.WriteByte(md.precision);
stateObj.WriteByte(md.scale);
break;
case SqlDbType.Xml:
//
stateObj.WriteByteArray(s_xmlMetadataSubstituteSequence, s_xmlMetadataSubstituteSequence.Length, 0);
break;
case SqlDbType.Udt:
stateObj.WriteByte(TdsEnums.SQLBIGVARBINARY);
WriteTokenLength(TdsEnums.SQLBIGVARBINARY, md.length, stateObj);
break;
case SqlDbType.Date:
stateObj.WriteByte(md.tdsType);
break;
case SqlDbType.Time:
case SqlDbType.DateTime2:
case SqlDbType.DateTimeOffset:
stateObj.WriteByte(md.tdsType);
stateObj.WriteByte(md.scale);
break;
default:
stateObj.WriteByte(md.tdsType);
WriteTokenLength(md.tdsType, md.length, stateObj);
if (md.metaType.IsCharType && _isShiloh) {
WriteUnsignedInt(md.collation.info, stateObj);
stateObj.WriteByte(md.collation.sortId);
}
break;
}
if (md.metaType.IsLong && !md.metaType.IsPlp) {
WriteShort(md.tableName.Length, stateObj);
WriteString(md.tableName, stateObj);
}
WriteCryptoMetadata(md, stateObj);
stateObj.WriteByte((byte)md.column.Length);
WriteString(md.column, stateObj);
}
} // end for loop
}
示例15: TdsExecuteTransactionManagerRequest
internal SqlDataReader TdsExecuteTransactionManagerRequest(
byte[] buffer,
TdsEnums.TransactionManagerRequestType request,
string transactionName,
TdsEnums.TransactionManagerIsolationLevel isoLevel,
int timeout,
SqlInternalTransaction transaction,
TdsParserStateObject stateObj
)
{
Debug.Assert(this == stateObj.Parser, "different parsers");
if (TdsParserState.Broken == State || TdsParserState.Closed == State)
{
return null;
}
// Promote, Commit and Rollback requests for
// delegated transactions often happen while there is an open result
// set, so we need to handle them by using a different MARS session,
// otherwise we'll write on the physical state objects while someone
// else is using it. When we don't have MARS enabled, we need to
// lock the physical state object to syncronize it's use at least
// until we increment the open results count. Once it's been
// incremented the delegated transaction requests will fail, so they
// won't stomp on anything.
Debug.Assert(!_connHandler.ThreadHasParserLockForClose || _connHandler._parserLock.ThreadMayHaveLock(), "Thread claims to have parser lock, but lock is not taken");
bool callerHasConnectionLock = _connHandler.ThreadHasParserLockForClose; // If the thread already claims to have the parser lock, then we will let the caller handle releasing it
if (!callerHasConnectionLock)
{
_connHandler._parserLock.Wait(canReleaseFromAnyThread: false);
_connHandler.ThreadHasParserLockForClose = true;
}
// Capture _asyncWrite (after taking lock) to restore it afterwards
bool hadAsyncWrites = _asyncWrite;
try
{
// Temprarily disable async writes
_asyncWrite = false;
stateObj._outputMessageType = TdsEnums.MT_TRANS; // set message type
stateObj.SetTimeoutSeconds(timeout);
stateObj.SniContext = SniContext.Snix_Execute;
const int marsHeaderSize = 18; // 4 + 2 + 8 + 4
const int totalHeaderLength = 22; // 4 + 4 + 2 + 8 + 4
Debug.Assert(stateObj._outBytesUsed == stateObj._outputHeaderLen, "Output bytes written before total header length");
// Write total header length
WriteInt(totalHeaderLength, stateObj);
// Write mars header length
WriteInt(marsHeaderSize, stateObj);
WriteMarsHeaderData(stateObj, _currentTransaction);
WriteShort((short)request, stateObj); // write TransactionManager Request type
bool returnReader = false;
switch (request)
{
case TdsEnums.TransactionManagerRequestType.Begin:
Debug.Assert(null != transaction, "Should have specified an internalTransaction when doing a BeginTransaction request!");
// Only assign the passed in transaction if it is not equal to the current transaction.
// And, if it is not equal, the current actually should be null. Anything else
// is a unexpected state. The concern here is mainly for the mixed use of
// T-SQL and API transactions.
// Expected states:
// 1) _pendingTransaction = null, _currentTransaction = null, non null transaction
// passed in on BeginTransaction API call.
// 2) _currentTransaction != null, _pendingTransaction = null, non null transaction
// passed in but equivalent to _currentTransaction.
// #1 will occur on standard BeginTransactionAPI call. #2 should only occur if
// t-sql transaction started followed by a call to SqlConnection.BeginTransaction.
// Any other state is unknown.
if (_currentTransaction != transaction)
{
Debug.Assert(_currentTransaction == null || true == _fResetConnection, "We should not have a current Tx at this point");
PendingTransaction = transaction;
}
stateObj.WriteByte((byte)isoLevel);
stateObj.WriteByte((byte)(transactionName.Length * 2)); // Write number of bytes (unicode string).
WriteString(transactionName, stateObj);
break;
case TdsEnums.TransactionManagerRequestType.Commit:
Debug.Assert(transactionName.Length == 0, "Should not have a transaction name on Commit");
stateObj.WriteByte((byte)0); // No xact name
stateObj.WriteByte(0); // No flags
Debug.Assert(isoLevel == TdsEnums.TransactionManagerIsolationLevel.Unspecified, "Should not have isolation level other than unspecified on Commit!");
// WriteByte((byte) 0, stateObj); // IsolationLevel
//.........这里部分代码省略.........