diff --git a/release-notes/3.0/3.0.0.md b/release-notes/3.0/3.0.0.md
index 6bef9eda1a..ef090c2f3c 100644
--- a/release-notes/3.0/3.0.0.md
+++ b/release-notes/3.0/3.0.0.md
@@ -102,9 +102,12 @@ public SqlCommand
```
API Usage examples can be found here:
-[SqlConnection retry sample](..\..\doc\samples\SqlConfigurableRetryLogic_OpenConnection.cs)
-[SqlCommand retry sample](..\..\doc\samples\SqlConfigurableRetryLogic_SqlCommand.cs)
-[Sample for retry logic options](..\..\doc\samples\SqlConfigurableRetryLogic_SqlRetryLogicOptions.cs)
+
+[SqlConnection retry sample](../../doc/samples/SqlConfigurableRetryLogic_OpenConnection.cs)
+
+[SqlCommand retry sample](../../doc/samples/SqlConfigurableRetryLogic_SqlCommand.cs)
+
+[Sample for retry logic options](../../doc/samples/SqlConfigurableRetryLogic_SqlRetryLogicOptions.cs)
New configuration sections have also been introduced to do the same registration from configuration files, without having to modify existing code:
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 69914d8812..8643b077f2 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
@@ -46,6 +46,9 @@
Microsoft\Data\Common\ActivityCorrelator.cs
+
+ Microsoft\Data\Common\DbConnectionStringCommon.cs
+
Microsoft\Data\Common\DbConnectionPoolKey.cs
@@ -154,6 +157,12 @@
Microsoft\Data\SqlClient\Server\SmiMetaData.cs
+
+ Microsoft\Data\SqlClient\Server\SqlDataRecord.cs
+
+
+ Microsoft\Data\SqlClient\Server\SqlDataRecord.netcore.cs
+
Microsoft\Data\SqlClient\ColumnEncryptionKeyInfo.cs
@@ -232,9 +241,15 @@
Microsoft\Data\SqlClient\SqlColumnEncryptionKeyStoreProvider.cs
+
+ Microsoft\Data\SqlClient\SqlCommandBuilder.cs
+
Microsoft\Data\SqlClient\SqlCommandSet.cs
+
+ Microsoft\Data\SqlClient\SqlConnectionPoolGroupProviderInfo.cs
+
Microsoft\Data\SqlClient\SqlConnectionPoolProviderInfo.cs
@@ -244,9 +259,24 @@
Microsoft\Data\SqlClient\SqlDataAdapter.cs
+
+ Microsoft\Data\SqlClient\SqlDependency.cs
+
+
+ Microsoft\Data\SqlClient\SqlEnums.cs
+
+
+ Microsoft\Data\SqlClient\SqlErrorCollection.cs
+
+
+ Microsoft\Data\SqlClient\SqlException.cs
+
Microsoft\Data\SqlClient\SqlInfoMessageEventHandler.cs
+
+ Microsoft\Data\SqlClient\SqlNotificationEventArgs.cs
+
Microsoft\Data\SqlClient\SqlNotificationInfo.cs
@@ -265,6 +295,9 @@
Microsoft\Data\SqlClient\SqlQueryMetadataCache.cs
+
+ Microsoft\Data\SqlClient\SqlReferenceCollection.cs
+
Microsoft\Data\SqlClient\SqlRowUpdatedEvent.cs
@@ -304,6 +337,9 @@
Microsoft\Data\SqlClient\Server\SqlRecordBuffer.cs
+
+ Microsoft\Data\SqlClient\Server\ValueUtilsSmi.cs
+
Microsoft\Data\SqlClient\SignatureVerificationCache.cs
@@ -322,6 +358,12 @@
Microsoft\Data\SqlClient\Server\SmiTypedGetterSetter.cs
+
+ Microsoft\Data\SqlClient\Server\SmiEventSink.cs
+
+
+ Microsoft\Data\SqlClient\Server\SmiEventSink_Default.Common.cs
+
Microsoft\Data\SqlClient\Reliability\SqlRetryingEventArgs.cs
@@ -458,15 +500,10 @@
-
-
-
-
-
Common\Microsoft\Data\ProviderBase\DbConnectionInternal.cs
@@ -503,11 +540,9 @@
-
-
@@ -515,26 +550,20 @@
Microsoft\Data\SqlClient\SqlConnectionTimeoutErrorInternal.cs
-
-
-
Microsoft\Data\SqlClient\SqlEnclaveSession.cs
-
-
-
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SmiEventSink.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SmiEventSink.cs
deleted file mode 100644
index 04ae3bedc5..0000000000
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SmiEventSink.cs
+++ /dev/null
@@ -1,25 +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.
-
-namespace Microsoft.Data.SqlClient.Server
-{
- // SqlEventSink is implemented by calling code. In all methods that accept
- // a SqlEventSink directly the sink must be able to handle multiple callbacks
- // without control returning from the original call.
-
- // Methods that do not accept SmiEventSync are (generally) ProcessEvent on
- // the SmiEventStream methods returning a SmiEventStream and methods that
- // are certain to never call to the server (most will, for in-proc back end).
-
- // Methods are commented with their corresponding TDS token
-
- // NOTE: Throwing from these methods will not usually produce the desired
- // effect -- the managed to native boundary will eat any exceptions,
- // and will cause a simple "Something bad happened" exception to be
- // thrown in the native to managed boundary...
- internal abstract class SmiEventSink
- {
- }
-}
-
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SqlDataRecord.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SqlDataRecord.cs
deleted file mode 100644
index 9c588b810b..0000000000
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SqlDataRecord.cs
+++ /dev/null
@@ -1,461 +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.Data;
-using System.Data.SqlTypes;
-using System.Diagnostics;
-using Microsoft.Data.Common;
-using Microsoft.Data.ProviderBase;
-
-namespace Microsoft.Data.SqlClient.Server
-{
- ///
- public class SqlDataRecord : IDataRecord
- {
- private readonly SmiRecordBuffer _recordBuffer;
- private readonly SmiExtendedMetaData[] _columnSmiMetaData;
- private readonly SmiEventSink_Default _eventSink;
- private readonly SqlMetaData[] _columnMetaData;
- private FieldNameLookup _fieldNameLookup;
- private readonly bool _usesStringStorageForXml;
-
- private static readonly SmiMetaData s_maxNVarCharForXml = new SmiMetaData(
- SqlDbType.NVarChar,
- SmiMetaData.UnlimitedMaxLengthIndicator,
- SmiMetaData.DefaultNVarChar_NoCollation.Precision,
- SmiMetaData.DefaultNVarChar_NoCollation.Scale,
- SmiMetaData.DefaultNVarChar.LocaleId,
- SmiMetaData.DefaultNVarChar.CompareOptions,
- userDefinedType: null
- );
-
- ///
- public virtual int FieldCount => _columnMetaData.Length;
-
- ///
- public virtual string GetName(int ordinal) => GetSqlMetaData(ordinal).Name;
-
- ///
- public virtual string GetDataTypeName(int ordinal)
- {
- SqlMetaData metaData = GetSqlMetaData(ordinal);
- if (metaData.SqlDbType == SqlDbType.Udt)
- {
- return metaData.UdtTypeName;
- }
- else
- {
- return MetaType.GetMetaTypeFromSqlDbType(metaData.SqlDbType, false).TypeName;
- }
- }
-
- ///
- public virtual Type GetFieldType(int ordinal) => MetaType.GetMetaTypeFromSqlDbType(GetSqlMetaData(ordinal).SqlDbType, false).ClassType;
-
- ///
- public virtual object GetValue(int ordinal) => ValueUtilsSmi.GetValue200(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual int GetValues(object[] values)
- {
- if (values == null)
- {
- throw ADP.ArgumentNull(nameof(values));
- }
-
- int copyLength = (values.Length < FieldCount) ? values.Length : FieldCount;
- for (int i = 0; i < copyLength; i++)
- {
- values[i] = GetValue(i);
- }
-
- return copyLength;
- }
-
- ///
- public virtual int GetOrdinal(string name)
- {
- if (_fieldNameLookup == null)
- {
- string[] names = new string[FieldCount];
- for (int i = 0; i < names.Length; i++)
- {
- names[i] = GetSqlMetaData(i).Name;
- }
-
- _fieldNameLookup = new FieldNameLookup(names, -1);
- }
-
- return _fieldNameLookup.GetOrdinal(name);
- }
-
- ///
- public virtual object this[int ordinal] => GetValue(ordinal);
-
- ///
- public virtual object this[string name] => GetValue(GetOrdinal(name));
-
- ///
- public virtual bool GetBoolean(int ordinal) => ValueUtilsSmi.GetBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual byte GetByte(int ordinal) => ValueUtilsSmi.GetByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual long GetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) => ValueUtilsSmi.GetBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length, throwOnNull: true);
-
- ///
- public virtual char GetChar(int ordinal) => throw ADP.NotSupported();
-
- ///
- public virtual long GetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) => ValueUtilsSmi.GetChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length);
-
- ///
- public virtual Guid GetGuid(int ordinal) => ValueUtilsSmi.GetGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual short GetInt16(int ordinal) => ValueUtilsSmi.GetInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual int GetInt32(int ordinal) => ValueUtilsSmi.GetInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual long GetInt64(int ordinal) => ValueUtilsSmi.GetInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual float GetFloat(int ordinal) => ValueUtilsSmi.GetSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual double GetDouble(int ordinal) => ValueUtilsSmi.GetDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual string GetString(int ordinal)
- {
- SmiMetaData colMeta = GetSmiMetaData(ordinal);
- if (_usesStringStorageForXml && colMeta.SqlDbType == SqlDbType.Xml)
- {
- return ValueUtilsSmi.GetString(_eventSink, _recordBuffer, ordinal, s_maxNVarCharForXml);
- }
- else
- {
- return ValueUtilsSmi.GetString(_eventSink, _recordBuffer, ordinal, colMeta);
- }
- }
-
- ///
- public virtual decimal GetDecimal(int ordinal) => ValueUtilsSmi.GetDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual DateTime GetDateTime(int ordinal) => ValueUtilsSmi.GetDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual DateTimeOffset GetDateTimeOffset(int ordinal) => ValueUtilsSmi.GetDateTimeOffset(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual TimeSpan GetTimeSpan(int ordinal) => ValueUtilsSmi.GetTimeSpan(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual bool IsDBNull(int ordinal)
- {
- ThrowIfInvalidOrdinal(ordinal);
- return ValueUtilsSmi.IsDBNull(_eventSink, _recordBuffer, ordinal);
- }
-
- ///
- // ISqlRecord implementation
- public virtual SqlMetaData GetSqlMetaData(int ordinal)
- {
- ThrowIfInvalidOrdinal(ordinal);
- return _columnMetaData[ordinal];
- }
-
- ///
- public virtual Type GetSqlFieldType(int ordinal) => MetaType.GetMetaTypeFromSqlDbType(GetSqlMetaData(ordinal).SqlDbType, false).SqlType;
-
- ///
- public virtual object GetSqlValue(int ordinal) => ValueUtilsSmi.GetSqlValue200(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual int GetSqlValues(object[] values)
- {
- if (null == values)
- {
- throw ADP.ArgumentNull(nameof(values));
- }
-
- int copyLength = (values.Length < FieldCount) ? values.Length : FieldCount;
- for (int i = 0; i < copyLength; i++)
- {
- values[i] = GetSqlValue(i);
- }
-
- return copyLength;
- }
-
- ///
- public virtual SqlBinary GetSqlBinary(int ordinal) => ValueUtilsSmi.GetSqlBinary(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlBytes GetSqlBytes(int ordinal) => ValueUtilsSmi.GetSqlBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlXml GetSqlXml(int ordinal) => ValueUtilsSmi.GetSqlXml(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlBoolean GetSqlBoolean(int ordinal) => ValueUtilsSmi.GetSqlBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlByte GetSqlByte(int ordinal) => ValueUtilsSmi.GetSqlByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlChars GetSqlChars(int ordinal) => ValueUtilsSmi.GetSqlChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlInt16 GetSqlInt16(int ordinal) => ValueUtilsSmi.GetSqlInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlInt32 GetSqlInt32(int ordinal) => ValueUtilsSmi.GetSqlInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlInt64 GetSqlInt64(int ordinal) => ValueUtilsSmi.GetSqlInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlSingle GetSqlSingle(int ordinal) => ValueUtilsSmi.GetSqlSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlDouble GetSqlDouble(int ordinal) => ValueUtilsSmi.GetSqlDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlMoney GetSqlMoney(int ordinal) => ValueUtilsSmi.GetSqlMoney(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlDateTime GetSqlDateTime(int ordinal) => ValueUtilsSmi.GetSqlDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlDecimal GetSqlDecimal(int ordinal) => ValueUtilsSmi.GetSqlDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlString GetSqlString(int ordinal) => ValueUtilsSmi.GetSqlString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- public virtual SqlGuid GetSqlGuid(int ordinal) => ValueUtilsSmi.GetSqlGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal));
-
- ///
- // ISqlUpdateableRecord Implementation
- public virtual int SetValues(params object[] values)
- {
- if (values == null)
- {
- throw ADP.ArgumentNull(nameof(values));
- }
-
- // Allow values array longer than FieldCount, just ignore the extra cells.
- int copyLength = (values.Length > FieldCount) ? FieldCount : values.Length;
-
- ExtendedClrTypeCode[] typeCodes = new ExtendedClrTypeCode[copyLength];
-
- // Verify all data values as acceptable before changing current state.
- for (int i = 0; i < copyLength; i++)
- {
- SqlMetaData metaData = GetSqlMetaData(i);
- typeCodes[i] = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(
- metaData.SqlDbType,
- isMultiValued: false,
- values[i],
- metaData.Type
- );
- if (typeCodes[i] == ExtendedClrTypeCode.Invalid)
- {
- throw ADP.InvalidCast();
- }
- }
-
- // Now move the data (it'll only throw if someone plays with the values array between
- // the validation loop and here, or if an invalid UDT was sent).
- for (int i = 0; i < copyLength; i++)
- {
- ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, i, GetSmiMetaData(i), values[i], typeCodes[i], offset: 0, length: 0, peekAhead: null);
- }
-
- return copyLength;
- }
-
- ///
- public virtual void SetValue(int ordinal, object value)
- {
- SqlMetaData metaData = GetSqlMetaData(ordinal);
- ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(
- metaData.SqlDbType,
- isMultiValued: false,
- value,
- metaData.Type
- );
- if (typeCode == ExtendedClrTypeCode.Invalid)
- {
- throw ADP.InvalidCast();
- }
-
- ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value, typeCode, offset: 0, length: 0, peekAhead: null);
- }
-
- ///
- public virtual void SetBoolean(int ordinal, bool value) => ValueUtilsSmi.SetBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetByte(int ordinal, byte value) => ValueUtilsSmi.SetByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) => ValueUtilsSmi.SetBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length);
-
- ///
- public virtual void SetChar(int ordinal, char value) => throw ADP.NotSupported();
-
- ///
- public virtual void SetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) => ValueUtilsSmi.SetChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length);
-
- ///
- public virtual void SetInt16(int ordinal, short value) => ValueUtilsSmi.SetInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetInt32(int ordinal, int value) => ValueUtilsSmi.SetInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetInt64(int ordinal, long value) => ValueUtilsSmi.SetInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetFloat(int ordinal, float value) => ValueUtilsSmi.SetSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
- ///
- public virtual void SetDouble(int ordinal, double value) => ValueUtilsSmi.SetDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetString(int ordinal, string value) => ValueUtilsSmi.SetString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetDecimal(int ordinal, decimal value) => ValueUtilsSmi.SetDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetDateTime(int ordinal, DateTime value) => ValueUtilsSmi.SetDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetTimeSpan(int ordinal, TimeSpan value) => ValueUtilsSmi.SetTimeSpan(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetDateTimeOffset(int ordinal, DateTimeOffset value) => ValueUtilsSmi.SetDateTimeOffset(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetDBNull(int ordinal)
- {
- ThrowIfInvalidOrdinal(ordinal);
- ValueUtilsSmi.SetDBNull(_eventSink, _recordBuffer, ordinal, true);
- }
-
- ///
- public virtual void SetGuid(int ordinal, Guid value) => ValueUtilsSmi.SetGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlBoolean(int ordinal, SqlBoolean value) => ValueUtilsSmi.SetSqlBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlByte(int ordinal, SqlByte value) => ValueUtilsSmi.SetSqlByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlInt16(int ordinal, SqlInt16 value) => ValueUtilsSmi.SetSqlInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlInt32(int ordinal, SqlInt32 value) => ValueUtilsSmi.SetSqlInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlInt64(int ordinal, SqlInt64 value) => ValueUtilsSmi.SetSqlInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlSingle(int ordinal, SqlSingle value) => ValueUtilsSmi.SetSqlSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlDouble(int ordinal, SqlDouble value) => ValueUtilsSmi.SetSqlDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlMoney(int ordinal, SqlMoney value) => ValueUtilsSmi.SetSqlMoney(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlDateTime(int ordinal, SqlDateTime value) => ValueUtilsSmi.SetSqlDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlXml(int ordinal, SqlXml value) => ValueUtilsSmi.SetSqlXml(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlDecimal(int ordinal, SqlDecimal value) => ValueUtilsSmi.SetSqlDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlString(int ordinal, SqlString value) => ValueUtilsSmi.SetSqlString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlBinary(int ordinal, SqlBinary value) => ValueUtilsSmi.SetSqlBinary(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlGuid(int ordinal, SqlGuid value) => ValueUtilsSmi.SetSqlGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlChars(int ordinal, SqlChars value) => ValueUtilsSmi.SetSqlChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- ///
- public virtual void SetSqlBytes(int ordinal, SqlBytes value) => ValueUtilsSmi.SetSqlBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
-
- // SqlDataRecord public API
- ///
- public SqlDataRecord(params SqlMetaData[] metaData)
- {
- // Initial consistency check
- if (metaData == null)
- {
- throw ADP.ArgumentNull(nameof(metaData));
- }
-
- _columnMetaData = new SqlMetaData[metaData.Length];
- _columnSmiMetaData = new SmiExtendedMetaData[metaData.Length];
- for (int i = 0; i < _columnSmiMetaData.Length; i++)
- {
- if (metaData[i] == null)
- {
- throw ADP.ArgumentNull($"{nameof(metaData)}[{i}]");
- }
- _columnMetaData[i] = metaData[i];
- _columnSmiMetaData[i] = MetaDataUtilsSmi.SqlMetaDataToSmiExtendedMetaData(_columnMetaData[i]);
- }
-
- _eventSink = new SmiEventSink_Default();
- _recordBuffer = new MemoryRecordBuffer(_columnSmiMetaData);
- _usesStringStorageForXml = true;
- _eventSink.ProcessMessagesAndThrow();
- }
-
- //
- // SqlDataRecord private members
- //
- internal SmiRecordBuffer RecordBuffer => _recordBuffer;
-
- internal SqlMetaData[] InternalGetMetaData() => _columnMetaData;
-
- internal SmiExtendedMetaData[] InternalGetSmiMetaData() => _columnSmiMetaData;
-
- internal SmiExtendedMetaData GetSmiMetaData(int ordinal)
- {
- ThrowIfInvalidOrdinal(ordinal);
- return _columnSmiMetaData[ordinal];
- }
-
- internal void ThrowIfInvalidOrdinal(int ordinal)
- {
- if (0 > ordinal || FieldCount <= ordinal)
- {
- throw ADP.IndexOutOfRange(ordinal);
- }
- }
-
- ///
- [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
- IDataReader System.Data.IDataRecord.GetData(int ordinal) => throw ADP.NotSupported();
- }
-}
-
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnectionPoolGroupProviderInfo.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnectionPoolGroupProviderInfo.cs
deleted file mode 100644
index 5a88dee38b..0000000000
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnectionPoolGroupProviderInfo.cs
+++ /dev/null
@@ -1,91 +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 Microsoft.Data.ProviderBase;
-
-namespace Microsoft.Data.SqlClient
-{
- sealed internal class SqlConnectionPoolGroupProviderInfo : DbConnectionPoolGroupProviderInfo
- {
- private string _alias;
- private string _failoverPartner;
- private bool _useFailoverPartner;
-
- internal SqlConnectionPoolGroupProviderInfo(SqlConnectionString connectionOptions)
- {
- // This is for the case where the user specified the failover partner
- // in the connection string and we have not yet connected to get the
- // env change.
- _failoverPartner = connectionOptions.FailoverPartner;
-
- if (string.IsNullOrEmpty(_failoverPartner))
- {
- _failoverPartner = null;
- }
- }
-
- internal string FailoverPartner
- {
- get
- {
- return _failoverPartner;
- }
- }
-
- internal bool UseFailoverPartner
- {
- get
- {
- return _useFailoverPartner;
- }
- }
-
- internal void AliasCheck(string server)
- {
- if (_alias != server)
- {
- lock (this)
- {
- if (null == _alias)
- {
- _alias = server;
- }
- else if (_alias != server)
- {
- SqlClientEventSource.Log.TryTraceEvent("SqlConnectionPoolGroupProviderInfo.AliasCheck | Info | Alias change detected. Clearing PoolGroup.");
- base.PoolGroup.Clear();
- _alias = server;
- }
- }
- }
- }
-
-
- internal void FailoverCheck(SqlInternalConnection connection, bool actualUseFailoverPartner, SqlConnectionString userConnectionOptions, string actualFailoverPartner)
- {
- if (UseFailoverPartner != actualUseFailoverPartner)
- {
- SqlClientEventSource.Log.TryTraceEvent("SqlConnectionPoolGroupProviderInfo.FailoverCheck | Info | Failover detected. Failover partner '{0}'. Clearing PoolGroup", actualFailoverPartner);
- base.PoolGroup.Clear();
- _useFailoverPartner = actualUseFailoverPartner;
- }
- // Only construct a new permission set when we're connecting to the
- // primary data source, not the failover partner.
- if (!_useFailoverPartner && _failoverPartner != actualFailoverPartner)
- {
- // NOTE: we optimistically generate the permission set to keep
- // lock short, but we only do this when we get a new
- // failover partner.
-
- lock (this)
- {
- if (_failoverPartner != actualFailoverPartner)
- {
- _failoverPartner = actualFailoverPartner;
- }
- }
- }
- }
- }
-}
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlErrorCollection.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlErrorCollection.cs
deleted file mode 100644
index 80d625a38b..0000000000
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlErrorCollection.cs
+++ /dev/null
@@ -1,46 +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;
-using System.Collections.Generic;
-
-namespace Microsoft.Data.SqlClient
-{
- ///
- public sealed class SqlErrorCollection : ICollection
- {
- // Ideally this would be typed as List, but that would make the non-generic
- // CopyTo behave differently than the full framework (which uses ArrayList), throwing
- // ArgumentException instead of the expected InvalidCastException for incompatible types.
- // Instead, we use List