diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
index 1bd80ed583..b3d906dd49 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
@@ -322,6 +322,9 @@
Microsoft\Data\SqlClient\Server\SqlRecordBuffer.cs
+
+ Microsoft\Data\SqlClient\Server\ValueUtilsSmi.cs
+
Microsoft\Data\SqlClient\SignatureVerificationCache.cs
@@ -484,7 +487,6 @@
-
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj
index c88a172035..129a571e2f 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj
@@ -234,6 +234,12 @@
Microsoft\Data\SqlClient\Server\SmiMetaData.cs
+
+ Microsoft\Data\SqlClient\Server\ValueUtilsSmi.cs
+
+
+ Microsoft\Data\SqlClient\Server\ValueUtilsSmi.netfx.cs
+
Microsoft\Data\SqlClient\ColumnEncryptionKeyInfo.cs
@@ -590,7 +596,6 @@
-
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/Server/ValueUtilsSmi.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/Server/ValueUtilsSmi.cs
deleted file mode 100644
index 28bc1ae376..0000000000
--- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/Server/ValueUtilsSmi.cs
+++ /dev/null
@@ -1,4420 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Data.Common;
-using System.Data.SqlTypes;
-using System.Diagnostics;
-using System.Globalization;
-using System.IO;
-using System.Reflection;
-using System.Xml;
-using Microsoft.Data.Common;
-using Microsoft.Data.SqlTypes;
-
-namespace Microsoft.Data.SqlClient.Server
-{
- // Utilities for manipulating values with the Smi interface.
- //
- // THIS CLASS IS BUILT ON TOP OF THE SMI INTERFACE -- SMI SHOULD NOT DEPEND ON IT!
- //
- // These are all based off of knowing the clr type of the value
- // as an ExtendedClrTypeCode enum for rapid access (lookup in static array is best, if possible).
- internal static class ValueUtilsSmi
- {
- private const int __maxByteChunkSize = TdsEnums.MAXSIZE;
- private const int __maxCharChunkSize = TdsEnums.MAXSIZE / sizeof(char);
- private const int NoLengthLimit = (int)SmiMetaData.UnlimitedMaxLengthIndicator; // make sure we use the same constant
-
- // Constants
- private const int constBinBufferSize = 4096; // Size of the buffer used to read input parameter of type Stream
- private const int constTextBufferSize = 4096; // Size of the buffer (in chars) user to read input parameter of type TextReader
-
- //
- // User-visible semantics-laden Getter/Setter support methods
- // These methods implement common semantics for getters & setters
- // All access to underlying Smi getters/setters must validate parameters
- // in these methods
- //
-
- // The idea for the getters is that there are two types associated with the field/column,
- // the one the user asks for (implicitly via a strongly-typed getter) and the one the data
- // is stored in (SmiMetaData).
- // When a strong getter is invoked, we try one of two ways to get the value
- // 1) go directly to the source for the requested type if possible
- // 2) instantiate the value based on the stored type (GetValue), then ask the Clr
- // to convert.
- internal static bool IsDBNull(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal)
- {
- return IsDBNull_Unchecked(sink, getters, ordinal);
- }
-
- internal static bool GetBoolean(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Boolean))
- {
- return GetBoolean_Unchecked(sink, getters, ordinal);
- }
-
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (bool)result;
- }
-
- internal static byte GetByte(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Byte))
- {
- return GetByte_Unchecked(sink, getters, ordinal);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (byte)result;
- }
-
- private static long GetBytesConversion(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length, bool throwOnNull)
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- SqlBinary value = (SqlBinary)obj;
-
- if (value.IsNull)
- {
- if (throwOnNull)
- {
- throw SQL.SqlNullValue();
- }
- else
- {
- // return zero length in any case
- return 0;
- }
- }
-
- if (null == buffer)
- {
- return value.Length;
- }
-
- length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength * sizeof(char), value.Length,
- fieldOffset, buffer.Length, bufferOffset, length);
- Array.Copy(value.Value, checked((int)fieldOffset), buffer, bufferOffset, length);
- return length;
- }
-
- internal static long GetBytes(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiExtendedMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length, bool throwOnNull)
- {
- // Additional exclusions not caught by GetBytesInternal
- if ((SmiMetaData.UnlimitedMaxLengthIndicator != metaData.MaxLength &&
- (SqlDbType.VarChar == metaData.SqlDbType ||
- SqlDbType.NVarChar == metaData.SqlDbType ||
- SqlDbType.Char == metaData.SqlDbType ||
- SqlDbType.NChar == metaData.SqlDbType)) ||
- SqlDbType.Xml == metaData.SqlDbType)
- {
- throw SQL.NonBlobColumn(metaData.Name);
- }
- else
- {
- return GetBytesInternal(sink, getters, ordinal, metaData, fieldOffset, buffer, bufferOffset, length, throwOnNull);
- }
- }
-
- internal static long GetBytesInternal(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length, bool throwOnNull)
- {
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.ByteArray))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- if (throwOnNull)
- {
- throw SQL.SqlNullValue();
- }
- else
- {
- // check user's parameters for validity against a zero-length value
- CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, 0, fieldOffset, buffer.Length, bufferOffset, length);
-
- // return zero length in any case
- return 0;
- }
- }
- long actualLength = GetBytesLength_Unchecked(sink, getters, ordinal);
- if (null == buffer)
- {
- return actualLength;
- }
- if (MetaDataUtilsSmi.IsCharOrXmlType(metaData.SqlDbType))
- {
- length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength * sizeof(char), actualLength,
- fieldOffset, buffer.Length, bufferOffset, length);
- }
- else
- {
- length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, actualLength, fieldOffset, buffer.Length, bufferOffset, length);
- }
- Debug.Assert(length >= 0, "Invalid CheckXetParameters return length!");
- if (length > 0)
- {
- length = GetBytes_Unchecked(sink, getters, ordinal, fieldOffset, buffer, bufferOffset, length);
- }
- return length;
- }
-
- return GetBytesConversion(sink, getters, ordinal, metaData, fieldOffset, buffer, bufferOffset, length, throwOnNull);
- }
-
- internal static long GetChars(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, long fieldOffset, char[] buffer, int bufferOffset, int length)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.CharArray))
- {
- long actualLength = GetCharsLength_Unchecked(sink, getters, ordinal);
- if (null == buffer)
- {
- return actualLength;
- }
- length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, actualLength, fieldOffset, buffer.Length, bufferOffset, length);
- Debug.Assert(length >= 0, "Buffer.Length was invalid!");
- if (length > 0)
- {
- length = GetChars_Unchecked(sink, getters, ordinal, fieldOffset, buffer, bufferOffset, length);
- }
- return length;
- }
-
- string value = ((string)GetValue(sink, getters, ordinal, metaData, null));
- if (null == value)
- {
- throw ADP.InvalidCast();
- }
- if (null == buffer)
- {
- return value.Length;
- }
- length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength * sizeof(char), value.Length,
- fieldOffset, buffer.Length, bufferOffset, length);
- value.CopyTo(checked((int)fieldOffset), buffer, bufferOffset, length);
- return length;
- }
-
- internal static DateTime GetDateTime(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.DateTime))
- {
- return GetDateTime_Unchecked(sink, getters, ordinal);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (DateTime)result;
- }
-
- // calling GetDateTimeOffset on possibly v100 SMI
- internal static DateTimeOffset GetDateTimeOffset(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool gettersSupportKatmaiDateTime)
- {
- if (gettersSupportKatmaiDateTime)
- {
- return GetDateTimeOffset(sink, (SmiTypedGetterSetter)getters, ordinal, metaData);
- }
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (DateTimeOffset)result;
- }
-
- // dealing with v200 SMI
- internal static DateTimeOffset GetDateTimeOffset(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.DateTimeOffset))
- {
- return GetDateTimeOffset_Unchecked(sink, getters, ordinal);
- }
- return (DateTimeOffset)GetValue200(sink, getters, ordinal, metaData, null);
- }
-
- internal static decimal GetDecimal(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Decimal))
- {
- return GetDecimal_PossiblyMoney(sink, getters, ordinal, metaData);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (decimal)result;
- }
-
- internal static double GetDouble(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Double))
- {
- return GetDouble_Unchecked(sink, getters, ordinal);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (double)result;
- }
-
- internal static Guid GetGuid(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Guid))
- {
- return GetGuid_Unchecked(sink, getters, ordinal);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (Guid)result;
- }
-
- internal static short GetInt16(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Int16))
- {
- return GetInt16_Unchecked(sink, getters, ordinal);
- }
- object obj = GetValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- return (short)obj;
- }
-
- internal static int GetInt32(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Int32))
- {
- return GetInt32_Unchecked(sink, getters, ordinal);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (int)result;
- }
-
- internal static long GetInt64(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Int64))
- {
- return GetInt64_Unchecked(sink, getters, ordinal);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (long)result;
- }
-
- internal static float GetSingle(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Single))
- {
- return GetSingle_Unchecked(sink, getters, ordinal);
- }
- object result = GetValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (float)result;
- }
-
- internal static SqlBinary GetSqlBinary(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlBinary))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- return SqlBinary.Null;
- }
- return GetSqlBinary_Unchecked(sink, getters, ordinal);
- }
- object result = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (SqlBinary)result;
- }
-
- internal static SqlBoolean GetSqlBoolean(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlBoolean))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- return SqlBoolean.Null;
- }
- return new SqlBoolean(GetBoolean_Unchecked(sink, getters, ordinal));
- }
- object result = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (SqlBoolean)result;
- }
-
- internal static SqlByte GetSqlByte(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlByte))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- return SqlByte.Null;
- }
- return new SqlByte(GetByte_Unchecked(sink, getters, ordinal));
- }
- object result = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == result)
- {
- throw ADP.InvalidCast();
- }
- return (SqlByte)result;
- }
-
- internal static SqlBytes GetSqlBytes(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context)
- {
- SqlBytes result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlBytes))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlBytes.Null;
- }
- else
- {
- long length = GetBytesLength_Unchecked(sink, getters, ordinal);
- if (0 <= length && length < __maxByteChunkSize)
- {
- byte[] byteBuffer = GetByteArray_Unchecked(sink, getters, ordinal);
- result = new SqlBytes(byteBuffer);
- }
- else
- {
- Stream s = new SmiGettersStream(sink, getters, ordinal, metaData);
- s = CopyIntoNewSmiScratchStream(s, sink, context);
- result = new SqlBytes(s);
- }
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- SqlBinary binaryVal = (SqlBinary)obj;
- if (binaryVal.IsNull)
- {
- result = SqlBytes.Null;
- }
- else
- {
- result = new SqlBytes(binaryVal.Value);
- }
- }
-
- return result;
- }
-
- internal static SqlChars GetSqlChars(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context)
- {
- SqlChars result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlChars))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlChars.Null;
- }
- else
- {
- long length = GetCharsLength_Unchecked(sink, getters, ordinal);
- if (length < __maxCharChunkSize || !InOutOfProcHelper.InProc)
- {
- char[] charBuffer = GetCharArray_Unchecked(sink, getters, ordinal);
- result = new SqlChars(charBuffer);
- }
- else
- { // InProc only
- Stream s = new SmiGettersStream(sink, getters, ordinal, metaData);
- SqlStreamChars sc = CopyIntoNewSmiScratchStreamChars(s, sink, context);
-
- Type SqlCharsType = (typeof(SqlChars));
- Type[] argTypes = new Type[] { typeof(SqlStreamChars) };
- SqlChars SqlCharsInstance = (SqlChars)SqlCharsType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
- null, argTypes, null).Invoke(new Object[] { sc });
- result = SqlCharsInstance;
- }
- }
- }
- else
- {
- SqlString stringValue;
- if (SqlDbType.Xml == metaData.SqlDbType)
- {
- SqlXml xmlValue = GetSqlXml_Unchecked(sink, getters, ordinal, null);
-
- if (xmlValue.IsNull)
- {
- result = SqlChars.Null;
- }
- else
- {
- result = new SqlChars(xmlValue.Value.ToCharArray());
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- stringValue = (SqlString)obj;
-
- if (stringValue.IsNull)
- {
- result = SqlChars.Null;
- }
- else
- {
- result = new SqlChars(stringValue.Value.ToCharArray());
- }
- }
- }
-
- return result;
- }
-
- internal static SqlDateTime GetSqlDateTime(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlDateTime result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlDateTime))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlDateTime.Null;
- }
- else
- {
- DateTime temp = GetDateTime_Unchecked(sink, getters, ordinal);
- result = new SqlDateTime(temp);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlDateTime)obj;
- }
-
- return result;
- }
-
- internal static SqlDecimal GetSqlDecimal(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlDecimal result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlDecimal))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlDecimal.Null;
- }
- else
- {
- result = GetSqlDecimal_Unchecked(sink, getters, ordinal);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlDecimal)obj;
- }
-
- return result;
- }
-
- internal static SqlDouble GetSqlDouble(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlDouble result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlDouble))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlDouble.Null;
- }
- else
- {
- double temp = GetDouble_Unchecked(sink, getters, ordinal);
- result = new SqlDouble(temp);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlDouble)obj;
- }
-
- return result;
- }
-
- internal static SqlGuid GetSqlGuid(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlGuid result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlGuid))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlGuid.Null;
- }
- else
- {
- Guid temp = GetGuid_Unchecked(sink, getters, ordinal);
- result = new SqlGuid(temp);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlGuid)obj;
- }
-
- return result;
- }
-
- internal static SqlInt16 GetSqlInt16(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlInt16 result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlInt16))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlInt16.Null;
- }
- else
- {
- short temp = GetInt16_Unchecked(sink, getters, ordinal);
- result = new SqlInt16(temp);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlInt16)obj;
- }
-
- return result;
- }
-
- internal static SqlInt32 GetSqlInt32(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlInt32 result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlInt32))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlInt32.Null;
- }
- else
- {
- int temp = GetInt32_Unchecked(sink, getters, ordinal);
- result = new SqlInt32(temp);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlInt32)obj;
- }
- return result;
- }
-
- internal static SqlInt64 GetSqlInt64(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlInt64 result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlInt64))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlInt64.Null;
- }
- else
- {
- long temp = GetInt64_Unchecked(sink, getters, ordinal);
- result = new SqlInt64(temp);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlInt64)obj;
- }
-
- return result;
- }
-
- internal static SqlMoney GetSqlMoney(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlMoney result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlMoney))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlMoney.Null;
- }
- else
- {
- result = GetSqlMoney_Unchecked(sink, getters, ordinal);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlMoney)obj;
- }
-
- return result;
- }
-
- internal static SqlSingle GetSqlSingle(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlSingle result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlSingle))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlSingle.Null;
- }
- else
- {
- float temp = GetSingle_Unchecked(sink, getters, ordinal);
- result = new SqlSingle(temp);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlSingle)obj;
- }
-
- return result;
- }
-
- internal static SqlString GetSqlString(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- SqlString result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlString))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlString.Null;
- }
- else
- {
- string temp = GetString_Unchecked(sink, getters, ordinal);
- result = new SqlString(temp);
- }
- }
- else if (SqlDbType.Xml == metaData.SqlDbType)
- {
- SqlXml xmlValue = GetSqlXml_Unchecked(sink, getters, ordinal, null);
-
- if (xmlValue.IsNull)
- {
- result = SqlString.Null;
- }
- else
- {
- result = new SqlString(xmlValue.Value);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlString)obj;
- }
-
- return result;
- }
-
- internal static SqlXml GetSqlXml(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context)
- {
- SqlXml result;
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlXml))
- {
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = SqlXml.Null;
- }
- else
- {
- result = GetSqlXml_Unchecked(sink, getters, ordinal, context);
- }
- }
- else
- {
- object obj = GetSqlValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- result = (SqlXml)obj;
- }
-
- return result;
- }
-
- internal static string GetString(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.String))
- {
- return GetString_Unchecked(sink, getters, ordinal);
- }
- object obj = GetValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- return (string)obj;
- }
-
- internal static SqlSequentialStreamSmi GetSequentialStream(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool bypassTypeCheck = false)
- {
- Debug.Assert(!ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal), "Should not try to get a SqlSequentialStreamSmi on a null column");
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if ((!bypassTypeCheck) && (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Stream)))
- {
- throw ADP.InvalidCast();
- }
-
- // This will advance the column to ordinal
- long length = GetBytesLength_Unchecked(sink, getters, ordinal);
- return new SqlSequentialStreamSmi(sink, getters, ordinal, length);
- }
-
- internal static SqlSequentialTextReaderSmi GetSequentialTextReader(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- Debug.Assert(!ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal), "Should not try to get a SqlSequentialTextReaderSmi on a null column");
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.TextReader))
- {
- throw ADP.InvalidCast();
- }
-
- // This will advance the column to ordinal
- long length = GetCharsLength_Unchecked(sink, getters, ordinal);
- return new SqlSequentialTextReaderSmi(sink, getters, ordinal, length);
- }
-
- internal static Stream GetStream(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool bypassTypeCheck = false)
- {
- bool isDbNull = ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal);
-
- // If a sql_variant, get the internal type
- if (!bypassTypeCheck)
- {
- if ((!isDbNull) && (metaData.SqlDbType == SqlDbType.Variant))
- {
- metaData = getters.GetVariantType(sink, ordinal);
- }
- // If the SqlDbType is still variant, then it must contain null, so don't throw InvalidCast
- if ((metaData.SqlDbType != SqlDbType.Variant) && (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Stream)))
- {
- throw ADP.InvalidCast();
- }
- }
-
- byte[] data;
- if (isDbNull)
- {
- // "null" stream
- data = new byte[0];
- }
- else
- {
- // Read all data
- data = GetByteArray_Unchecked(sink, getters, ordinal);
- }
-
- // Wrap data in pre-built object
- return new MemoryStream(data, writable: false);
- }
-
- internal static TextReader GetTextReader(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- bool isDbNull = ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal);
-
- // If a sql_variant, get the internal type
- if ((!isDbNull) && (metaData.SqlDbType == SqlDbType.Variant))
- {
- metaData = getters.GetVariantType(sink, ordinal);
- }
- // If the SqlDbType is still variant, then it must contain null, so don't throw InvalidCast
- if ((metaData.SqlDbType != SqlDbType.Variant) && (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.TextReader)))
- {
- throw ADP.InvalidCast();
- }
-
- string data;
- if (isDbNull)
- {
- // "null" textreader
- data = string.Empty;
- }
- else
- {
- // Read all data
- data = GetString_Unchecked(sink, getters, ordinal);
- }
-
- // Wrap in pre-built object
- return new StringReader(data);
- }
-
- // calling GetTimeSpan on possibly v100 SMI
- internal static TimeSpan GetTimeSpan(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool gettersSupportKatmaiDateTime)
- {
- if (gettersSupportKatmaiDateTime)
- {
- return GetTimeSpan(sink, (SmiTypedGetterSetter)getters, ordinal, metaData);
- }
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- object obj = GetValue(sink, getters, ordinal, metaData, null);
- if (null == obj)
- {
- throw ADP.InvalidCast();
- }
- return (TimeSpan)obj;
- }
-
- // dealing with v200 SMI
- internal static TimeSpan GetTimeSpan(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal, SmiMetaData metaData)
- {
- ThrowIfITypedGettersIsNull(sink, getters, ordinal);
- if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.TimeSpan))
- {
- return GetTimeSpan_Unchecked(sink, getters, ordinal);
- }
- return (TimeSpan)GetValue200(sink, getters, ordinal, metaData, null);
- }
-
- // GetValue() for v200 SMI (new Katmai Date/Time types)
- internal static object GetValue200(
- SmiEventSink_Default sink,
- SmiTypedGetterSetter getters,
- int ordinal,
- SmiMetaData metaData,
- SmiContext context
- )
- {
- object result = null;
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = DBNull.Value;
- }
- else
- {
- switch (metaData.SqlDbType)
- {
- case SqlDbType.Variant: // Handle variants specifically for v200, since they could contain v200 types
- metaData = getters.GetVariantType(sink, ordinal);
- sink.ProcessMessagesAndThrow();
- Debug.Assert(SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant causes endless recursion!");
- result = GetValue200(sink, getters, ordinal, metaData, context);
- break;
- case SqlDbType.Date:
- case SqlDbType.DateTime2:
- result = GetDateTime_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Time:
- result = GetTimeSpan_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.DateTimeOffset:
- result = GetDateTimeOffset_Unchecked(sink, getters, ordinal);
- break;
- default:
- result = GetValue(sink, getters, ordinal, metaData, context);
- break;
- }
- }
-
- return result;
- }
-
- // implements SqlClient 1.1-compatible GetValue() semantics for everything except output parameters
- internal static object GetValue(
- SmiEventSink_Default sink,
- ITypedGettersV3 getters,
- int ordinal,
- SmiMetaData metaData,
- SmiContext context
- )
- {
- object result = null;
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- result = DBNull.Value;
- }
- else
- {
- switch (metaData.SqlDbType)
- {
- case SqlDbType.BigInt:
- result = GetInt64_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Binary:
- result = GetByteArray_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Bit:
- result = GetBoolean_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Char:
- result = GetString_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.DateTime:
- result = GetDateTime_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Decimal:
- result = GetSqlDecimal_Unchecked(sink, getters, ordinal).Value;
- break;
- case SqlDbType.Float:
- result = GetDouble_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Image:
- result = GetByteArray_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Int:
- result = GetInt32_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Money:
- result = GetSqlMoney_Unchecked(sink, getters, ordinal).Value;
- break;
- case SqlDbType.NChar:
- result = GetString_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.NText:
- result = GetString_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.NVarChar:
- result = GetString_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Real:
- result = GetSingle_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.UniqueIdentifier:
- result = GetGuid_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.SmallDateTime:
- result = GetDateTime_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.SmallInt:
- result = GetInt16_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.SmallMoney:
- result = GetSqlMoney_Unchecked(sink, getters, ordinal).Value;
- break;
- case SqlDbType.Text:
- result = GetString_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Timestamp:
- result = GetByteArray_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.TinyInt:
- result = GetByte_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.VarBinary:
- result = GetByteArray_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.VarChar:
- result = GetString_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Variant:
- metaData = getters.GetVariantType(sink, ordinal);
- sink.ProcessMessagesAndThrow();
- Debug.Assert(SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant causes endless recursion!");
- result = GetValue(sink, getters, ordinal, metaData, context);
- break;
- case SqlDbType.Xml:
- result = GetSqlXml_Unchecked(sink, getters, ordinal, context).Value;
- break;
- case SqlDbType.Udt:
- result = GetUdt_LengthChecked(sink, getters, ordinal, metaData);
- break;
- }
- }
-
- return result;
- }
-
- // dealing with v200 SMI
- internal static object GetSqlValue200(
- SmiEventSink_Default sink,
- SmiTypedGetterSetter getters,
- int ordinal,
- SmiMetaData metaData,
- SmiContext context
- )
- {
- object result = null;
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- if (SqlDbType.Udt == metaData.SqlDbType)
- {
- result = NullUdtInstance(metaData);
- }
- else
- {
- result = s_typeSpecificNullForSqlValue[(int)metaData.SqlDbType];
- }
- }
- else
- {
- switch (metaData.SqlDbType)
- {
- case SqlDbType.Variant: // Handle variants specifically for v200, since they could contain v200 types
- metaData = getters.GetVariantType(sink, ordinal);
- sink.ProcessMessagesAndThrow();
- Debug.Assert(SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant causes endless recursion!");
- result = GetSqlValue200(sink, getters, ordinal, metaData, context);
- break;
- case SqlDbType.Date:
- case SqlDbType.DateTime2:
- result = GetDateTime_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Time:
- result = GetTimeSpan_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.DateTimeOffset:
- result = GetDateTimeOffset_Unchecked(sink, getters, ordinal);
- break;
- default:
- result = GetSqlValue(sink, getters, ordinal, metaData, context);
- break;
- }
- }
-
- return result;
- }
-
- // implements SqlClient 1.1-compatible GetSqlValue() semantics for everything except output parameters
- internal static object GetSqlValue(
- SmiEventSink_Default sink,
- ITypedGettersV3 getters,
- int ordinal,
- SmiMetaData metaData,
- SmiContext context
- )
- {
- object result = null;
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- if (SqlDbType.Udt == metaData.SqlDbType)
- {
- result = NullUdtInstance(metaData);
- }
- else
- {
- result = s_typeSpecificNullForSqlValue[(int)metaData.SqlDbType];
- }
- }
- else
- {
- switch (metaData.SqlDbType)
- {
- case SqlDbType.BigInt:
- result = new SqlInt64(GetInt64_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Binary:
- result = GetSqlBinary_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Bit:
- result = new SqlBoolean(GetBoolean_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Char:
- result = new SqlString(GetString_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.DateTime:
- result = new SqlDateTime(GetDateTime_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Decimal:
- result = GetSqlDecimal_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Float:
- result = new SqlDouble(GetDouble_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Image:
- result = GetSqlBinary_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Int:
- result = new SqlInt32(GetInt32_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Money:
- result = GetSqlMoney_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.NChar:
- result = new SqlString(GetString_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.NText:
- result = new SqlString(GetString_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.NVarChar:
- result = new SqlString(GetString_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Real:
- result = new SqlSingle(GetSingle_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.UniqueIdentifier:
- result = new SqlGuid(GetGuid_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.SmallDateTime:
- result = new SqlDateTime(GetDateTime_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.SmallInt:
- result = new SqlInt16(GetInt16_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.SmallMoney:
- result = GetSqlMoney_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Text:
- result = new SqlString(GetString_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Timestamp:
- result = GetSqlBinary_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.TinyInt:
- result = new SqlByte(GetByte_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.VarBinary:
- result = GetSqlBinary_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.VarChar:
- result = new SqlString(GetString_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Variant:
- metaData = getters.GetVariantType(sink, ordinal);
- sink.ProcessMessagesAndThrow();
- Debug.Assert(SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant causes endless recursion!");
- result = GetSqlValue(sink, getters, ordinal, metaData, context);
- break;
- case SqlDbType.Xml:
- result = GetSqlXml_Unchecked(sink, getters, ordinal, context);
- break;
- case SqlDbType.Udt:
- result = GetUdt_LengthChecked(sink, getters, ordinal, metaData);
- break;
- }
- }
-
- return result;
- }
-
- // null return values for SqlClient 1.1-compatible GetSqlValue()
- private static object[] s_typeSpecificNullForSqlValue = {
- SqlInt64.Null, // SqlDbType.BigInt
- SqlBinary.Null, // SqlDbType.Binary
- SqlBoolean.Null, // SqlDbType.Bit
- SqlString.Null, // SqlDbType.Char
- SqlDateTime.Null, // SqlDbType.DateTime
- SqlDecimal.Null, // SqlDbType.Decimal
- SqlDouble.Null, // SqlDbType.Float
- SqlBinary.Null, // SqlDbType.Image
- SqlInt32.Null, // SqlDbType.Int
- SqlMoney.Null, // SqlDbType.Money
- SqlString.Null, // SqlDbType.NChar
- SqlString.Null, // SqlDbType.NText
- SqlString.Null, // SqlDbType.NVarChar
- SqlSingle.Null, // SqlDbType.Real
- SqlGuid.Null, // SqlDbType.UniqueIdentifier
- SqlDateTime.Null, // SqlDbType.SmallDateTime
- SqlInt16.Null, // SqlDbType.SmallInt
- SqlMoney.Null, // SqlDbType.SmallMoney
- SqlString.Null, // SqlDbType.Text
- SqlBinary.Null, // SqlDbType.Timestamp
- SqlByte.Null, // SqlDbType.TinyInt
- SqlBinary.Null, // SqlDbType.VarBinary
- SqlString.Null, // SqlDbType.VarChar
- DBNull.Value, // SqlDbType.Variant
- null, // 24
- SqlXml.Null, // SqlDbType.Xml
- null, // 26
- null, // 27
- null, // 28
- null, // SqlDbType.Udt -- requires instantiating udt-specific type
- null, // SqlDbType.Structured
- DBNull.Value, // SqlDbType.Date
- DBNull.Value, // SqlDbType.Time
- DBNull.Value, // SqlDbType.DateTime2
- DBNull.Value, // SqlDbType.DateTimeOffset
- };
-
- internal static object NullUdtInstance(SmiMetaData metaData)
- {
- Type t = metaData.Type;
- Debug.Assert(t != null, "Unexpected null of Udt type on NullUdtInstance!");
- return t.InvokeMember("Null", BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Static, null, null, new Object[] { }, CultureInfo.InvariantCulture);
- }
-
- internal static SqlBuffer.StorageType SqlDbTypeToStorageType(SqlDbType dbType)
- {
- int index = unchecked((int)dbType);
- Debug.Assert(index >= 0 && index < __dbTypeToStorageType.Length, string.Format(CultureInfo.InvariantCulture, "Unexpected dbType value: {0}", dbType));
- return __dbTypeToStorageType[index];
- }
-
- private static void GetNullOutputParameterSmi(SmiMetaData metaData, SqlBuffer targetBuffer, ref object result)
- {
- if (SqlDbType.Udt == metaData.SqlDbType)
- {
- result = NullUdtInstance(metaData);
- }
- else
- {
- SqlBuffer.StorageType stype = SqlDbTypeToStorageType(metaData.SqlDbType);
- if (SqlBuffer.StorageType.Empty == stype)
- {
- result = DBNull.Value;
- }
- else if (SqlBuffer.StorageType.SqlBinary == stype)
- {
- // special case SqlBinary, 'cause tds parser never sets SqlBuffer to null, just to empty!
- targetBuffer.SqlBinary = SqlBinary.Null;
- }
- else if (SqlBuffer.StorageType.SqlGuid == stype)
- {
- targetBuffer.SqlGuid = SqlGuid.Null;
- }
- else
- {
- targetBuffer.SetToNullOfType(stype);
- }
- }
- }
-
- // UDTs and null variants come back via return value, all else is via targetBuffer.
- // implements SqlClient 2.0-compatible output parameter semantics
- internal static object GetOutputParameterV3Smi(
- SmiEventSink_Default sink, // event sink for errors
- ITypedGettersV3 getters, // getters interface to grab value from
- int ordinal, // parameter within getters
- SmiMetaData metaData, // Getter's type for this ordinal
- SmiContext context, // used to obtain scratch streams
- SqlBuffer targetBuffer // destination
- )
- {
- object result = null; // Workaround for UDT hack in non-Smi code paths.
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- GetNullOutputParameterSmi(metaData, targetBuffer, ref result);
- }
- else
- {
- switch (metaData.SqlDbType)
- {
- case SqlDbType.BigInt:
- targetBuffer.Int64 = GetInt64_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Binary:
- case SqlDbType.Image:
- case SqlDbType.Timestamp:
- case SqlDbType.VarBinary:
- targetBuffer.SqlBinary = GetSqlBinary_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Bit:
- targetBuffer.Boolean = GetBoolean_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.NChar:
- case SqlDbType.NText:
- case SqlDbType.NVarChar:
- case SqlDbType.Char:
- case SqlDbType.VarChar:
- case SqlDbType.Text:
- targetBuffer.SetToString(GetString_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.DateTime:
- case SqlDbType.SmallDateTime:
- {
- SqlDateTime dt = new SqlDateTime(GetDateTime_Unchecked(sink, getters, ordinal));
- targetBuffer.SetToDateTime(dt.DayTicks, dt.TimeTicks);
- break;
- }
- case SqlDbType.Decimal:
- {
- SqlDecimal dec = GetSqlDecimal_Unchecked(sink, getters, ordinal);
- targetBuffer.SetToDecimal(dec.Precision, dec.Scale, dec.IsPositive, dec.Data);
- break;
- }
- case SqlDbType.Float:
- targetBuffer.Double = GetDouble_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Int:
- targetBuffer.Int32 = GetInt32_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Money:
- case SqlDbType.SmallMoney:
- targetBuffer.SetToMoney(GetInt64_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.Real:
- targetBuffer.Single = GetSingle_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.UniqueIdentifier:
- targetBuffer.SqlGuid = new SqlGuid(GetGuid_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.SmallInt:
- targetBuffer.Int16 = GetInt16_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.TinyInt:
- targetBuffer.Byte = GetByte_Unchecked(sink, getters, ordinal);
- break;
- case SqlDbType.Variant:
- // For variants, recur using the current value's sqldbtype
- metaData = getters.GetVariantType(sink, ordinal);
- sink.ProcessMessagesAndThrow();
- Debug.Assert(SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant not supposed to be possible!");
- GetOutputParameterV3Smi(sink, getters, ordinal, metaData, context, targetBuffer);
- break;
- case SqlDbType.Udt:
- result = GetUdt_LengthChecked(sink, getters, ordinal, metaData);
- break;
- case SqlDbType.Xml:
- targetBuffer.SqlXml = GetSqlXml_Unchecked(sink, getters, ordinal, null);
- break;
- default:
- Debug.Assert(false, "Unexpected SqlDbType");
- break;
- }
- }
-
- return result;
- }
-
- // UDTs and null variants come back via return value, all else is via targetBuffer.
- // implements SqlClient 1.1-compatible output parameter semantics
- internal static object GetOutputParameterV200Smi(
- SmiEventSink_Default sink, // event sink for errors
- SmiTypedGetterSetter getters, // getters interface to grab value from
- int ordinal, // parameter within getters
- SmiMetaData metaData, // Getter's type for this ordinal
- SmiContext context, // used to obtain scratch streams
- SqlBuffer targetBuffer // destination
- )
- {
- object result = null; // Workaround for UDT hack in non-Smi code paths.
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- GetNullOutputParameterSmi(metaData, targetBuffer, ref result);
- }
- else
- {
- switch (metaData.SqlDbType)
- {
- // new types go here
- case SqlDbType.Variant: // Handle variants specifically for v200, since they could contain v200 types
- // For variants, recur using the current value's sqldbtype
- metaData = getters.GetVariantType(sink, ordinal);
- sink.ProcessMessagesAndThrow();
- Debug.Assert(SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant not supposed to be possible!");
- GetOutputParameterV200Smi(sink, getters, ordinal, metaData, context, targetBuffer);
- break;
- case SqlDbType.Date:
- targetBuffer.SetToDate(GetDateTime_Unchecked(sink, getters, ordinal));
- break;
- case SqlDbType.DateTime2:
- targetBuffer.SetToDateTime2(GetDateTime_Unchecked(sink, getters, ordinal), metaData.Scale);
- break;
- case SqlDbType.Time:
- targetBuffer.SetToTime(GetTimeSpan_Unchecked(sink, getters, ordinal), metaData.Scale);
- break;
- case SqlDbType.DateTimeOffset:
- targetBuffer.SetToDateTimeOffset(GetDateTimeOffset_Unchecked(sink, getters, ordinal), metaData.Scale);
- break;
- default:
- result = GetOutputParameterV3Smi(sink, getters, ordinal, metaData, context, targetBuffer);
- break;
- }
- }
-
- return result;
- }
-
- private static SqlBuffer.StorageType[] __dbTypeToStorageType = new SqlBuffer.StorageType[] {
- SqlBuffer.StorageType.Int64, // BigInt
- SqlBuffer.StorageType.SqlBinary, // Binary
- SqlBuffer.StorageType.Boolean, // Bit
- SqlBuffer.StorageType.String, // Char
- SqlBuffer.StorageType.DateTime, // DateTime
- SqlBuffer.StorageType.Decimal, // Decimal
- SqlBuffer.StorageType.Double, // Float
- SqlBuffer.StorageType.SqlBinary, // Image
- SqlBuffer.StorageType.Int32, // Int
- SqlBuffer.StorageType.Money, // Money
- SqlBuffer.StorageType.String, // NChar
- SqlBuffer.StorageType.String, // NText
- SqlBuffer.StorageType.String, // NVarChar
- SqlBuffer.StorageType.Single, // Real
- SqlBuffer.StorageType.SqlGuid, // UniqueIdentifier
- SqlBuffer.StorageType.DateTime, // SmallDateTime
- SqlBuffer.StorageType.Int16, // SmallInt
- SqlBuffer.StorageType.Money, // SmallMoney
- SqlBuffer.StorageType.String, // Text
- SqlBuffer.StorageType.SqlBinary, // Timestamp
- SqlBuffer.StorageType.Byte, // TinyInt
- SqlBuffer.StorageType.SqlBinary, // VarBinary
- SqlBuffer.StorageType.String, // VarChar
- SqlBuffer.StorageType.Empty, // Variant
- SqlBuffer.StorageType.Empty, // 24
- SqlBuffer.StorageType.SqlXml, // Xml
- SqlBuffer.StorageType.Empty, // 26
- SqlBuffer.StorageType.Empty, // 27
- SqlBuffer.StorageType.Empty, // 28
- SqlBuffer.StorageType.Empty, // Udt
- SqlBuffer.StorageType.Empty, // Structured
- SqlBuffer.StorageType.Date, // Date
- SqlBuffer.StorageType.Time, // Time
- SqlBuffer.StorageType.DateTime2, // DateTime2
- SqlBuffer.StorageType.DateTimeOffset, // DateTimeOffset
- };
-
- // Strongly-typed setters are a bit simpler than their corresponding getters.
- // 1) check to make sure the type is compatible (exception if not)
- // 2) push the data
- internal static void SetDBNull(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, bool value)
- {
- SetDBNull_Unchecked(sink, setters, ordinal);
- }
-
- internal static void SetBoolean(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, bool value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Boolean);
-
- SetBoolean_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetByte(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, byte value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Byte);
-
- SetByte_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static long SetBytes(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.ByteArray);
- if (null == buffer)
- {
- throw ADP.ArgumentNull(nameof(buffer));
- }
- length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, NoLengthLimit /* actual */, fieldOffset, buffer.Length, bufferOffset, length);
- Debug.Assert(length >= 0, "Buffer.Length was invalid!");
- if (0 == length)
- {
- // Front end semantics says to ignore fieldOffset and bufferOffset
- // if not doing any actual work.
- // Back end semantics says they must be valid, even for no work.
- // Compensate by setting offsets to zero here (valid for any scenario)
- fieldOffset = 0;
- bufferOffset = 0;
- }
- return SetBytes_Unchecked(sink, setters, ordinal, fieldOffset, buffer, bufferOffset, length);
- }
-
- internal static long SetBytesLength(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long length)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.ByteArray);
-
- if (length < 0)
- {
- throw ADP.InvalidDataLength(length);
- }
-
- if (metaData.MaxLength >= 0 && length > metaData.MaxLength)
- {
- length = metaData.MaxLength;
- }
-
- setters.SetBytesLength(sink, ordinal, length);
- sink.ProcessMessagesAndThrow();
-
- return length;
- }
-
- internal static long SetChars(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long fieldOffset, char[] buffer, int bufferOffset, int length)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.CharArray);
- if (null == buffer)
- {
- throw ADP.ArgumentNull(nameof(buffer));
- }
- length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, NoLengthLimit /* actual */, fieldOffset, buffer.Length, bufferOffset, length);
- Debug.Assert(length >= 0, "Buffer.Length was invalid!");
- if (0 == length)
- {
- // Front end semantics says to ignore fieldOffset and bufferOffset
- // if not doing any actual work.
- // Back end semantics says they must be valid, even for no work.
- // Compensate by setting offsets to zero here (valid for any scenario)
- fieldOffset = 0;
- bufferOffset = 0;
- }
- return SetChars_Unchecked(sink, setters, ordinal, fieldOffset, buffer, bufferOffset, length);
- }
-
- internal static void SetDateTime(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTime value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.DateTime);
-
- SetDateTime_Checked(sink, setters, ordinal, metaData, value);
- }
-
- internal static void SetDateTimeOffset(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTimeOffset value, bool settersSupportKatmaiDateTime)
- {
- if (!settersSupportKatmaiDateTime)
- {
- throw ADP.InvalidCast();
- }
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.DateTimeOffset);
- SetDateTimeOffset_Unchecked(sink, (SmiTypedGetterSetter)setters, ordinal, value);
- }
-
- internal static void SetDecimal(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, decimal value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Decimal);
-
- SetDecimal_PossiblyMoney(sink, setters, ordinal, metaData, value);
- }
-
- internal static void SetDouble(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, double value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Double);
-
- SetDouble_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetGuid(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, Guid value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Guid);
-
- SetGuid_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetInt16(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, short value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Int16);
-
- SetInt16_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetInt32(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, int value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Int32);
-
- SetInt32_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetInt64(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Int64);
-
- SetInt64_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSingle(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, float value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Single);
-
- SetSingle_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlBinary(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBinary value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlBinary);
- SetSqlBinary_LengthChecked(sink, setters, ordinal, metaData, value, 0);
- }
-
- internal static void SetSqlBoolean(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBoolean value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlBoolean);
-
- SetSqlBoolean_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlByte(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlByte value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlByte);
-
- SetSqlByte_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlBytes(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBytes value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlBytes);
-
- SetSqlBytes_LengthChecked(sink, setters, ordinal, metaData, value, 0);
- }
-
- internal static void SetSqlChars(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlChars value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlChars);
- SetSqlChars_LengthChecked(sink, setters, ordinal, metaData, value, 0);
- }
-
- internal static void SetSqlDateTime(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDateTime value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlDateTime);
-
- SetSqlDateTime_Checked(sink, setters, ordinal, metaData, value);
- }
-
- internal static void SetSqlDecimal(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDecimal value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlDecimal);
-
- SetSqlDecimal_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlDouble(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDouble value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlDouble);
-
- SetSqlDouble_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlGuid(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlGuid value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlGuid);
-
- SetSqlGuid_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlInt16(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlInt16 value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlInt16);
-
- SetSqlInt16_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlInt32(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlInt32 value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlInt32);
-
- SetSqlInt32_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlInt64(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlInt64 value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlInt64);
-
- SetSqlInt64_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlMoney(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlMoney value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlMoney);
-
- SetSqlMoney_Checked(sink, setters, ordinal, metaData, value);
- }
-
- internal static void SetSqlSingle(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlSingle value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlSingle);
-
- SetSqlSingle_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetSqlString(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlString value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlString);
- SetSqlString_LengthChecked(sink, setters, ordinal, metaData, value, 0);
- }
-
- internal static void SetSqlXml(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlXml value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlXml);
-
- SetSqlXml_Unchecked(sink, setters, ordinal, value);
- }
-
- internal static void SetString(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, string value)
- {
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.String);
-
- SetString_LengthChecked(sink, setters, ordinal, metaData, value, 0);
- }
-
- internal static void SetTimeSpan(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, TimeSpan value, bool settersSupportKatmaiDateTime)
- {
- if (!settersSupportKatmaiDateTime)
- {
- throw ADP.InvalidCast();
- }
- ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.TimeSpan);
- SetTimeSpan_Checked(sink, (SmiTypedGetterSetter)setters, ordinal, metaData, value);
- }
-
- // Implements SqlClient 2.0-compatible SetValue() semantics
- // Assumes caller already validated type against the metadata, other than trimming lengths
- internal static void SetCompatibleValue(
- SmiEventSink_Default sink,
- ITypedSettersV3 setters,
- int ordinal,
- SmiMetaData metaData, // metadata for target setter column
- object value,
- ExtendedClrTypeCode typeCode,
- int offset
- )
- {
- // Ensure either an invalid type, or caller validated compatibility
- // SqlDbType.Variant and have special handling
- Debug.Assert(typeCode == ExtendedClrTypeCode.Invalid ||
- typeCode == ExtendedClrTypeCode.SByte ||
- typeCode == ExtendedClrTypeCode.UInt16 ||
- typeCode == ExtendedClrTypeCode.UInt32 ||
- typeCode == ExtendedClrTypeCode.UInt64 ||
- typeCode == ExtendedClrTypeCode.DBNull ||
- typeCode == ExtendedClrTypeCode.Empty ||
- CanAccessSetterDirectly(metaData, typeCode) ||
- value is DataFeed /* already validated */);
-
- switch (typeCode)
- {
- case ExtendedClrTypeCode.Invalid:
- throw ADP.UnknownDataType(value.GetType());
- case ExtendedClrTypeCode.Boolean:
- SetBoolean_Unchecked(sink, setters, ordinal, (bool)value);
- break;
- case ExtendedClrTypeCode.Byte:
- SetByte_Unchecked(sink, setters, ordinal, (byte)value);
- break;
- case ExtendedClrTypeCode.Char:
- {
- char[] charsValue = new char[] { (char)value };
- // recur with array type
- SetCompatibleValue(sink, setters, ordinal, metaData, charsValue, ExtendedClrTypeCode.CharArray, 0);
- break;
- }
- case ExtendedClrTypeCode.DateTime:
- SetDateTime_Checked(sink, setters, ordinal, metaData, (DateTime)value);
- break;
- case ExtendedClrTypeCode.DBNull:
- SetDBNull_Unchecked(sink, setters, ordinal);
- break;
- case ExtendedClrTypeCode.Decimal:
- SetDecimal_PossiblyMoney(sink, setters, ordinal, metaData, (decimal)value);
- break;
- case ExtendedClrTypeCode.Double:
- SetDouble_Unchecked(sink, setters, ordinal, (double)value);
- break;
- case ExtendedClrTypeCode.Empty:
- SetDBNull_Unchecked(sink, setters, ordinal);
- break;
- case ExtendedClrTypeCode.Int16:
- SetInt16_Unchecked(sink, setters, ordinal, (short)value);
- break;
- case ExtendedClrTypeCode.Int32:
- SetInt32_Unchecked(sink, setters, ordinal, (int)value);
- break;
- case ExtendedClrTypeCode.Int64:
- SetInt64_Unchecked(sink, setters, ordinal, (long)value);
- break;
- case ExtendedClrTypeCode.SByte:
- throw ADP.InvalidCast();
- case ExtendedClrTypeCode.Single:
- SetSingle_Unchecked(sink, setters, ordinal, (float)value);
- break;
- case ExtendedClrTypeCode.String:
- SetString_LengthChecked(sink, setters, ordinal, metaData, (string)value, offset);
- break;
- case ExtendedClrTypeCode.UInt16:
- throw ADP.InvalidCast();
- case ExtendedClrTypeCode.UInt32:
- throw ADP.InvalidCast();
- case ExtendedClrTypeCode.UInt64:
- throw ADP.InvalidCast();
- case ExtendedClrTypeCode.Object:
- SetUdt_LengthChecked(sink, setters, ordinal, metaData, value);
- break;
- case ExtendedClrTypeCode.ByteArray:
- SetByteArray_LengthChecked(sink, setters, ordinal, metaData, (byte[])value, offset);
- break;
- case ExtendedClrTypeCode.CharArray:
- SetCharArray_LengthChecked(sink, setters, ordinal, metaData, (char[])value, offset);
- break;
- case ExtendedClrTypeCode.Guid:
- SetGuid_Unchecked(sink, setters, ordinal, (Guid)value);
- break;
- case ExtendedClrTypeCode.SqlBinary:
- SetSqlBinary_LengthChecked(sink, setters, ordinal, metaData, (SqlBinary)value, offset);
- break;
- case ExtendedClrTypeCode.SqlBoolean:
- SetSqlBoolean_Unchecked(sink, setters, ordinal, (SqlBoolean)value);
- break;
- case ExtendedClrTypeCode.SqlByte:
- SetSqlByte_Unchecked(sink, setters, ordinal, (SqlByte)value);
- break;
- case ExtendedClrTypeCode.SqlDateTime:
- SetSqlDateTime_Checked(sink, setters, ordinal, metaData, (SqlDateTime)value);
- break;
- case ExtendedClrTypeCode.SqlDouble:
- SetSqlDouble_Unchecked(sink, setters, ordinal, (SqlDouble)value);
- break;
- case ExtendedClrTypeCode.SqlGuid:
- SetSqlGuid_Unchecked(sink, setters, ordinal, (SqlGuid)value);
- break;
- case ExtendedClrTypeCode.SqlInt16:
- SetSqlInt16_Unchecked(sink, setters, ordinal, (SqlInt16)value);
- break;
- case ExtendedClrTypeCode.SqlInt32:
- SetSqlInt32_Unchecked(sink, setters, ordinal, (SqlInt32)value);
- break;
- case ExtendedClrTypeCode.SqlInt64:
- SetSqlInt64_Unchecked(sink, setters, ordinal, (SqlInt64)value);
- break;
- case ExtendedClrTypeCode.SqlMoney:
- SetSqlMoney_Checked(sink, setters, ordinal, metaData, (SqlMoney)value);
- break;
- case ExtendedClrTypeCode.SqlDecimal:
- SetSqlDecimal_Unchecked(sink, setters, ordinal, (SqlDecimal)value);
- break;
- case ExtendedClrTypeCode.SqlSingle:
- SetSqlSingle_Unchecked(sink, setters, ordinal, (SqlSingle)value);
- break;
- case ExtendedClrTypeCode.SqlString:
- SetSqlString_LengthChecked(sink, setters, ordinal, metaData, (SqlString)value, offset);
- break;
- case ExtendedClrTypeCode.SqlChars:
- SetSqlChars_LengthChecked(sink, setters, ordinal, metaData, (SqlChars)value, offset);
- break;
- case ExtendedClrTypeCode.SqlBytes:
- SetSqlBytes_LengthChecked(sink, setters, ordinal, metaData, (SqlBytes)value, offset);
- break;
- case ExtendedClrTypeCode.SqlXml:
- SetSqlXml_Unchecked(sink, setters, ordinal, (SqlXml)value);
- break;
- case ExtendedClrTypeCode.Stream:
- SetStream_Unchecked(sink, setters, ordinal, metaData, (StreamDataFeed)value);
- break;
- case ExtendedClrTypeCode.TextReader:
- SetTextReader_Unchecked(sink, setters, ordinal, metaData, (TextDataFeed)value);
- break;
- case ExtendedClrTypeCode.XmlReader:
- SetXmlReader_Unchecked(sink, setters, ordinal, ((XmlDataFeed)value)._source);
- break;
- default:
- Debug.Fail("Unvalidated extendedtypecode: " + typeCode);
- break;
- }
- }
-
- // VSTFDevDiv#479681 - Data corruption when sending Katmai Date types to the server via TVP
- // Ensures proper handling on DateTime2 sub type for Sql_Variants and TVPs.
- internal static void SetCompatibleValueV200(
- SmiEventSink_Default sink,
- SmiTypedGetterSetter setters,
- int ordinal,
- SmiMetaData metaData,
- object value,
- ExtendedClrTypeCode typeCode,
- int offset,
- int length,
- ParameterPeekAheadValue peekAhead,
- SqlBuffer.StorageType storageType
- )
- {
- // Ensure caller validated compatibility for types handled directly in this method
- Debug.Assert((ExtendedClrTypeCode.DataTable != typeCode &&
- ExtendedClrTypeCode.DbDataReader != typeCode &&
- ExtendedClrTypeCode.IEnumerableOfSqlDataRecord != typeCode) ||
- CanAccessSetterDirectly(metaData, typeCode), "Un-validated type '" + typeCode + "' for metaData: " + metaData.SqlDbType);
-
- if (typeCode == ExtendedClrTypeCode.DateTime)
- {
- if (storageType == SqlBuffer.StorageType.DateTime2)
- SetDateTime2_Checked(sink, setters, ordinal, metaData, (DateTime)value);
- else if (storageType == SqlBuffer.StorageType.Date)
- SetDate_Checked(sink, setters, ordinal, metaData, (DateTime)value);
- else
- SetDateTime_Checked(sink, setters, ordinal, metaData, (DateTime)value);
- }
- else
- {
- SetCompatibleValueV200(sink, setters, ordinal, metaData, value, typeCode, offset, length, peekAhead);
- }
- }
-
- // Implements SqlClient 2.0-compatible SetValue() semantics + Orcas extensions
- // Assumes caller already validated basic type against the metadata, other than trimming lengths and
- // checking individual field values (TVPs)
- internal static void SetCompatibleValueV200(
- SmiEventSink_Default sink,
- SmiTypedGetterSetter setters,
- int ordinal,
- SmiMetaData metaData,
- object value,
- ExtendedClrTypeCode typeCode,
- int offset,
- int length,
- ParameterPeekAheadValue peekAhead
- )
- {
- // Ensure caller validated compatibility for types handled directly in this method
- Debug.Assert((ExtendedClrTypeCode.DataTable != typeCode &&
- ExtendedClrTypeCode.DbDataReader != typeCode &&
- ExtendedClrTypeCode.IEnumerableOfSqlDataRecord != typeCode) ||
- CanAccessSetterDirectly(metaData, typeCode), "Un-validated type '" + typeCode + "' for metaData: " + metaData.SqlDbType);
-
- switch (typeCode)
- {
- case ExtendedClrTypeCode.DataTable:
- SetDataTable_Unchecked(sink, setters, ordinal, metaData, (DataTable)value);
- break;
- case ExtendedClrTypeCode.DbDataReader:
- SetDbDataReader_Unchecked(sink, setters, ordinal, metaData, (DbDataReader)value);
- break;
- case ExtendedClrTypeCode.IEnumerableOfSqlDataRecord:
- SetIEnumerableOfSqlDataRecord_Unchecked(sink, setters, ordinal, metaData, (IEnumerable)value, peekAhead);
- break;
- case ExtendedClrTypeCode.TimeSpan:
- SetTimeSpan_Checked(sink, setters, ordinal, metaData, (TimeSpan)value);
- break;
- case ExtendedClrTypeCode.DateTimeOffset:
- SetDateTimeOffset_Unchecked(sink, setters, ordinal, (DateTimeOffset)value);
- break;
- default:
- SetCompatibleValue(sink, setters, ordinal, metaData, value, typeCode, offset);
- break;
- }
- }
-
- // Copy multiple fields from reader to ITypedSettersV3
- // Assumes caller enforces that reader and setter metadata are compatible
- internal static void FillCompatibleITypedSettersFromReader(SmiEventSink_Default sink, ITypedSettersV3 setters, SmiMetaData[] metaData, SqlDataReader reader)
- {
- for (int i = 0; i < metaData.Length; i++)
- {
- if (reader.IsDBNull(i))
- {
- ValueUtilsSmi.SetDBNull_Unchecked(sink, setters, i);
- }
- else
- {
- switch (metaData[i].SqlDbType)
- {
- case SqlDbType.BigInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int64));
- ValueUtilsSmi.SetInt64_Unchecked(sink, setters, i, reader.GetInt64(i));
- break;
- case SqlDbType.Binary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- ValueUtilsSmi.SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0);
- break;
- case SqlDbType.Bit:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Boolean));
- SetBoolean_Unchecked(sink, setters, i, reader.GetBoolean(i));
- break;
- case SqlDbType.Char:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0);
- break;
- case SqlDbType.DateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i));
- break;
- case SqlDbType.Decimal:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlDecimal));
- SetSqlDecimal_Unchecked(sink, setters, i, reader.GetSqlDecimal(i));
- break;
- case SqlDbType.Float:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Double));
- SetDouble_Unchecked(sink, setters, i, reader.GetDouble(i));
- break;
- case SqlDbType.Image:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0);
- break;
- case SqlDbType.Int:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int32));
- SetInt32_Unchecked(sink, setters, i, reader.GetInt32(i));
- break;
- case SqlDbType.Money:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Unchecked(sink, setters, i, metaData[i], reader.GetSqlMoney(i));
- break;
- case SqlDbType.NChar:
- case SqlDbType.NText:
- case SqlDbType.NVarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0);
- break;
- case SqlDbType.Real:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Single));
- SetSingle_Unchecked(sink, setters, i, reader.GetFloat(i));
- break;
- case SqlDbType.UniqueIdentifier:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Guid));
- SetGuid_Unchecked(sink, setters, i, reader.GetGuid(i));
- break;
- case SqlDbType.SmallDateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i));
- break;
- case SqlDbType.SmallInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int16));
- SetInt16_Unchecked(sink, setters, i, reader.GetInt16(i));
- break;
- case SqlDbType.SmallMoney:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Checked(sink, setters, i, metaData[i], reader.GetSqlMoney(i));
- break;
- case SqlDbType.Text:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0);
- break;
- case SqlDbType.Timestamp:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0);
- break;
- case SqlDbType.TinyInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Byte));
- SetByte_Unchecked(sink, setters, i, reader.GetByte(i));
- break;
- case SqlDbType.VarBinary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0);
- break;
- case SqlDbType.VarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.String));
- SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0);
- break;
- case SqlDbType.Xml:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlXml));
- SetSqlXml_Unchecked(sink, setters, i, reader.GetSqlXml(i));
- break;
- case SqlDbType.Variant:
- object o = reader.GetSqlValue(i);
- ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCode(o);
- SetCompatibleValue(sink, setters, i, metaData[i], o, typeCode, 0);
- break;
-
- case SqlDbType.Udt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0);
- break;
-
- default:
- // In order for us to get here we would have to have an
- // invalid instance of SqlDbType, or one would have to add
- // new member to SqlDbType without adding a case in this
- // switch, hence the assert.
- Debug.Fail("unsupported DbType:" + metaData[i].SqlDbType.ToString());
- throw ADP.NotSupported();
- }
- }
- }
- }
-
- // Copy multiple fields from reader to SmiTypedGetterSetter
- // Supports V200 code path, without damaging backward compat for V100 code.
- // Main differences are supporting DbDataReader, and for binary, character, decimal and Udt types.
- // Assumes caller enforces that reader and setter metadata are compatible
- internal static void FillCompatibleSettersFromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, IList metaData, DbDataReader reader)
- {
- for (int i = 0; i < metaData.Count; i++)
- {
- if (reader.IsDBNull(i))
- {
- ValueUtilsSmi.SetDBNull_Unchecked(sink, setters, i);
- }
- else
- {
- switch (metaData[i].SqlDbType)
- {
- case SqlDbType.BigInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int64));
- SetInt64_Unchecked(sink, setters, i, reader.GetInt64(i));
- break;
- case SqlDbType.Binary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.ByteArray));
- SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.Bit:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Boolean));
- SetBoolean_Unchecked(sink, setters, i, reader.GetBoolean(i));
- break;
- case SqlDbType.Char:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.CharArray));
- SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.DateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i));
- break;
- case SqlDbType.Decimal:
- { // block to scope sqlReader local to avoid conflicts
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlDecimal));
- // Support full fidelity for SqlDataReader
- SqlDataReader sqlReader = reader as SqlDataReader;
- if (null != sqlReader)
- {
- SetSqlDecimal_Unchecked(sink, setters, i, sqlReader.GetSqlDecimal(i));
- }
- else
- {
- SetSqlDecimal_Unchecked(sink, setters, i, new SqlDecimal(reader.GetDecimal(i)));
- }
- }
- break;
- case SqlDbType.Float:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Double));
- SetDouble_Unchecked(sink, setters, i, reader.GetDouble(i));
- break;
- case SqlDbType.Image:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.ByteArray));
- SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.Int:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int32));
- SetInt32_Unchecked(sink, setters, i, reader.GetInt32(i));
- break;
- case SqlDbType.Money:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Checked(sink, setters, i, metaData[i], new SqlMoney(reader.GetDecimal(i)));
- break;
- case SqlDbType.NChar:
- case SqlDbType.NText:
- case SqlDbType.NVarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.CharArray));
- SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.Real:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Single));
- SetSingle_Unchecked(sink, setters, i, reader.GetFloat(i));
- break;
- case SqlDbType.UniqueIdentifier:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Guid));
- SetGuid_Unchecked(sink, setters, i, reader.GetGuid(i));
- break;
- case SqlDbType.SmallDateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i));
- break;
- case SqlDbType.SmallInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int16));
- SetInt16_Unchecked(sink, setters, i, reader.GetInt16(i));
- break;
- case SqlDbType.SmallMoney:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Checked(sink, setters, i, metaData[i], new SqlMoney(reader.GetDecimal(i)));
- break;
- case SqlDbType.Text:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.CharArray));
- SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.Timestamp:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.ByteArray));
- SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.TinyInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Byte));
- SetByte_Unchecked(sink, setters, i, reader.GetByte(i));
- break;
- case SqlDbType.VarBinary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.ByteArray));
- SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.VarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.String));
- SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
- case SqlDbType.Xml:
- {
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlXml));
- SqlDataReader sqlReader = reader as SqlDataReader;
- if (null != sqlReader)
- {
- SetSqlXml_Unchecked(sink, setters, i, sqlReader.GetSqlXml(i));
- }
- else
- {
- SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0);
- }
- }
- break;
- case SqlDbType.Variant:
- { // block to scope sqlReader local and avoid conflicts
- // Support better options for SqlDataReader
- SqlDataReader sqlReader = reader as SqlDataReader;
- SqlBuffer.StorageType storageType = SqlBuffer.StorageType.Empty;
- object o;
- if (null != sqlReader)
- {
- o = sqlReader.GetSqlValue(i);
- storageType = sqlReader.GetVariantInternalStorageType(i);
- }
- else
- {
- o = reader.GetValue(i);
- }
- ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(metaData[i].SqlDbType, metaData[i].IsMultiValued, o, null,
- // TODO: this version works for shipping Orcas, since only Katmai (TVP) codepath calls this method at this time.
- // Need a better story for smi versioning of ValueUtilsSmi post-Orcas
- SmiContextFactory.KatmaiVersion
- );
- if ((storageType == SqlBuffer.StorageType.DateTime2) || (storageType == SqlBuffer.StorageType.Date))
- SetCompatibleValueV200(sink, setters, i, metaData[i], o, typeCode, 0, 0, null, storageType);
- else
- SetCompatibleValueV200(sink, setters, i, metaData[i], o, typeCode, 0, 0, null);
- }
- break;
-
- case SqlDbType.Udt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.ByteArray));
- // Skip serialization for Udt types.
- SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0);
- break;
-
- // SqlDbType.Structured should have been caught before this point for TVPs. SUDTs will still need to implement.
-
- case SqlDbType.Date:
- case SqlDbType.DateTime2:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i));
- break;
- case SqlDbType.Time:
- { // block to scope sqlReader local and avoid conflicts
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.TimeSpan));
- SqlDataReader sqlReader = reader as SqlDataReader;
- TimeSpan ts;
- if (null != sqlReader)
- {
- ts = sqlReader.GetTimeSpan(i);
- }
- else
- {
- ts = (TimeSpan)reader.GetValue(i);
- }
- SetTimeSpan_Checked(sink, setters, i, metaData[i], ts);
- }
- break;
- case SqlDbType.DateTimeOffset:
- { // block to scope sqlReader local and avoid conflicts
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTimeOffset));
- SqlDataReader sqlReader = reader as SqlDataReader;
- DateTimeOffset dto;
- if (null != sqlReader)
- {
- dto = sqlReader.GetDateTimeOffset(i);
- }
- else
- {
- dto = (DateTimeOffset)reader.GetValue(i);
- }
- SetDateTimeOffset_Unchecked(sink, setters, i, dto);
- }
- break;
-
- default:
- // In order for us to get here we would have to have an
- // invalid instance of SqlDbType, or one would have to add
- // new member to SqlDbType without adding a case in this
- // switch, hence the assert.
- Debug.Fail("unsupported DbType:" + metaData[i].SqlDbType.ToString());
- throw ADP.NotSupported();
- }
- }
- }
- }
-
- internal static void FillCompatibleITypedSettersFromRecord(SmiEventSink_Default sink, ITypedSettersV3 setters, SmiMetaData[] metaData, SqlDataRecord record)
- {
- FillCompatibleITypedSettersFromRecord(sink, setters, metaData, record, null);
- }
-
- internal static void FillCompatibleITypedSettersFromRecord(SmiEventSink_Default sink, ITypedSettersV3 setters, SmiMetaData[] metaData, SqlDataRecord record, SmiDefaultFieldsProperty useDefaultValues)
- {
- for (int i = 0; i < metaData.Length; ++i)
- {
- if (null != useDefaultValues && useDefaultValues[i])
- {
- continue;
- }
- if (record.IsDBNull(i))
- {
- ValueUtilsSmi.SetDBNull_Unchecked(sink, setters, i);
- }
- else
- {
- switch (metaData[i].SqlDbType)
- {
- case SqlDbType.BigInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int64));
- SetInt64_Unchecked(sink, setters, i, record.GetInt64(i));
- break;
- case SqlDbType.Binary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Bit:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Boolean));
- SetBoolean_Unchecked(sink, setters, i, record.GetBoolean(i));
- break;
- case SqlDbType.Char:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.DateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i));
- break;
- case SqlDbType.Decimal:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlDecimal));
- SetSqlDecimal_Unchecked(sink, setters, i, record.GetSqlDecimal(i));
- break;
- case SqlDbType.Float:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Double));
- SetDouble_Unchecked(sink, setters, i, record.GetDouble(i));
- break;
- case SqlDbType.Image:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Int:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int32));
- SetInt32_Unchecked(sink, setters, i, record.GetInt32(i));
- break;
- case SqlDbType.Money:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Unchecked(sink, setters, i, metaData[i], record.GetSqlMoney(i));
- break;
- case SqlDbType.NChar:
- case SqlDbType.NText:
- case SqlDbType.NVarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Real:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Single));
- SetSingle_Unchecked(sink, setters, i, record.GetFloat(i));
- break;
- case SqlDbType.UniqueIdentifier:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Guid));
- SetGuid_Unchecked(sink, setters, i, record.GetGuid(i));
- break;
- case SqlDbType.SmallDateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i));
- break;
- case SqlDbType.SmallInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int16));
- SetInt16_Unchecked(sink, setters, i, record.GetInt16(i));
- break;
- case SqlDbType.SmallMoney:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Checked(sink, setters, i, metaData[i], record.GetSqlMoney(i));
- break;
- case SqlDbType.Text:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Timestamp:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.TinyInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Byte));
- SetByte_Unchecked(sink, setters, i, record.GetByte(i));
- break;
- case SqlDbType.VarBinary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.VarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.String));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Xml:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlXml));
- SetSqlXml_Unchecked(sink, setters, i, record.GetSqlXml(i)); // perf improvement?
- break;
- case SqlDbType.Variant:
- object o = record.GetSqlValue(i);
- ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCode(o);
- SetCompatibleValue(sink, setters, i, metaData[i], o, typeCode, 0);
- break;
- case SqlDbType.Udt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- default:
- Debug.Assert(false, "unsupported DbType:" + metaData[i].SqlDbType.ToString());
- throw ADP.NotSupported();
- }
- }
- }
- }
-
- internal static void FillCompatibleSettersFromRecord(SmiEventSink_Default sink, SmiTypedGetterSetter setters, SmiMetaData[] metaData, SqlDataRecord record, SmiDefaultFieldsProperty useDefaultValues)
- {
- for (int i = 0; i < metaData.Length; ++i)
- {
- if (null != useDefaultValues && useDefaultValues[i])
- {
- continue;
- }
- if (record.IsDBNull(i))
- {
- ValueUtilsSmi.SetDBNull_Unchecked(sink, setters, i);
- }
- else
- {
- switch (metaData[i].SqlDbType)
- {
- case SqlDbType.BigInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int64));
- SetInt64_Unchecked(sink, setters, i, record.GetInt64(i));
- break;
- case SqlDbType.Binary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Bit:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Boolean));
- SetBoolean_Unchecked(sink, setters, i, record.GetBoolean(i));
- break;
- case SqlDbType.Char:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.DateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i));
- break;
- case SqlDbType.Decimal:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlDecimal));
- SetSqlDecimal_Unchecked(sink, setters, i, record.GetSqlDecimal(i));
- break;
- case SqlDbType.Float:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Double));
- SetDouble_Unchecked(sink, setters, i, record.GetDouble(i));
- break;
- case SqlDbType.Image:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Int:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int32));
- SetInt32_Unchecked(sink, setters, i, record.GetInt32(i));
- break;
- case SqlDbType.Money:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Unchecked(sink, setters, i, metaData[i], record.GetSqlMoney(i));
- break;
- case SqlDbType.NChar:
- case SqlDbType.NText:
- case SqlDbType.NVarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Real:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Single));
- SetSingle_Unchecked(sink, setters, i, record.GetFloat(i));
- break;
- case SqlDbType.UniqueIdentifier:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Guid));
- SetGuid_Unchecked(sink, setters, i, record.GetGuid(i));
- break;
- case SqlDbType.SmallDateTime:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i));
- break;
- case SqlDbType.SmallInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Int16));
- SetInt16_Unchecked(sink, setters, i, record.GetInt16(i));
- break;
- case SqlDbType.SmallMoney:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlMoney));
- SetSqlMoney_Checked(sink, setters, i, metaData[i], record.GetSqlMoney(i));
- break;
- case SqlDbType.Text:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlChars));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Timestamp:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.TinyInt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.Byte));
- SetByte_Unchecked(sink, setters, i, record.GetByte(i));
- break;
- case SqlDbType.VarBinary:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.VarChar:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.String));
- SetChars_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Xml:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlXml));
- SetSqlXml_Unchecked(sink, setters, i, record.GetSqlXml(i)); // perf improvement?
- break;
- case SqlDbType.Variant:
- object o = record.GetSqlValue(i);
- ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCode(o);
- SetCompatibleValueV200(sink, setters, i, metaData[i], o, typeCode, 0, -1 /* no length restriction */, null /* no peekahead */);
- break;
- case SqlDbType.Udt:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.SqlBytes));
- SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0);
- break;
- case SqlDbType.Date:
- case SqlDbType.DateTime2:
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTime));
- SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i));
- break;
- case SqlDbType.Time:
- { // block to scope sqlReader local and avoid conflicts
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.TimeSpan));
- SqlDataRecord sqlRecord = record as SqlDataRecord;
- TimeSpan ts;
- if (null != sqlRecord)
- {
- ts = sqlRecord.GetTimeSpan(i);
- }
- else
- {
- ts = (TimeSpan)record.GetValue(i);
- }
- SetTimeSpan_Checked(sink, setters, i, metaData[i], ts);
- }
- break;
- case SqlDbType.DateTimeOffset:
- { // block to scope sqlReader local and avoid conflicts
- Debug.Assert(CanAccessSetterDirectly(metaData[i], ExtendedClrTypeCode.DateTimeOffset));
- SqlDataRecord sqlRecord = record as SqlDataRecord;
- DateTimeOffset dto;
- if (null != sqlRecord)
- {
- dto = sqlRecord.GetDateTimeOffset(i);
- }
- else
- {
- dto = (DateTimeOffset)record.GetValue(i);
- }
- SetDateTimeOffset_Unchecked(sink, setters, i, dto);
- }
- break;
-
- default:
- Debug.Fail("unsupported DbType:" + metaData[i].SqlDbType.ToString());
- throw ADP.NotSupported();
- }
- }
- }
- }
-
- // spool a Stream into a scratch stream from the Smi interface and return it as a Stream
- internal static Stream CopyIntoNewSmiScratchStream(Stream source, SmiEventSink_Default sink, SmiContext context)
- {
- Stream dest;
- if (null == context)
- {
- dest = new MemoryStream();
- }
- else
- {
- dest = new SqlClientWrapperSmiStream(sink, context.GetScratchStream(sink));
- }
-
- int chunkSize;
- if (source.CanSeek && __maxByteChunkSize > source.Length)
- {
- chunkSize = unchecked((int)source.Length); // unchecked cast is safe due to check on line above
- }
- else
- {
- chunkSize = __maxByteChunkSize;
- }
-
- byte[] copyBuffer = new byte[chunkSize];
- int bytesRead;
- while (0 != (bytesRead = source.Read(copyBuffer, 0, chunkSize)))
- {
- dest.Write(copyBuffer, 0, bytesRead);
- }
- dest.Flush();
-
- // SQLBU 494334
- // Need to re-wind scratch stream to beginning before returning
- dest.Seek(0, SeekOrigin.Begin);
-
- return dest;
- }
-
- // spool a Stream into a scratch stream from the Smi interface and return it as a SqlStreamChars
- internal static SqlStreamChars CopyIntoNewSmiScratchStreamChars(Stream source, SmiEventSink_Default sink, SmiContext context)
- {
- SqlClientWrapperSmiStreamChars dest = new SqlClientWrapperSmiStreamChars(sink, context.GetScratchStream(sink));
-
- int chunkSize;
- if (source.CanSeek && __maxByteChunkSize > source.Length)
- {
- chunkSize = unchecked((int)source.Length); // unchecked cast is safe due to check on line above
- }
- else
- {
- chunkSize = __maxByteChunkSize;
- }
-
- byte[] copyBuffer = new byte[chunkSize];
- int bytesRead;
- while (0 != (bytesRead = source.Read(copyBuffer, 0, chunkSize)))
- {
- dest.Write(copyBuffer, 0, bytesRead);
- }
- dest.Flush();
-
- // SQLBU 494334
- // Need to re-wind scratch stream to beginning before returning
- dest.Seek(0, SeekOrigin.Begin);
-
- return dest;
- }
-
- //
- // Common utility code to get lengths correct for trimming
- //
- private static object GetUdt_LengthChecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
- {
- object result;
- if (IsDBNull_Unchecked(sink, getters, ordinal))
- {
- Type t = metaData.Type;
- Debug.Assert(t != null, "Unexpected null of udtType on GetUdt_LengthChecked!");
- result = t.InvokeMember("Null", BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Static, null, null, Array.Empty