Skip to content

Commit ee9640c

Browse files
authored
Cleanup | Merge SqlDataRecord and remove context connection remnants (#3454)
1 parent ad01286 commit ee9640c

File tree

16 files changed

+129
-753
lines changed

16 files changed

+129
-753
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,6 @@
432432
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SmiMetaDataProperty.cs">
433433
<Link>Microsoft\Data\SqlClient\Server\SmiMetaDataProperty.cs</Link>
434434
</Compile>
435-
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SmiRecordBuffer.cs">
436-
<Link>Microsoft\Data\SqlClient\Server\SmiRecordBuffer.cs</Link>
437-
</Compile>
438435
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SmiSettersStream.cs">
439436
<Link>Microsoft\Data\SqlClient\Server\SmiSettersStream.cs</Link>
440437
</Compile>
@@ -450,9 +447,6 @@
450447
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SqlDataRecord.cs">
451448
<Link>Microsoft\Data\SqlClient\Server\SqlDataRecord.cs</Link>
452449
</Compile>
453-
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SqlDataRecord.netcore.cs">
454-
<Link>Microsoft\Data\SqlClient\Server\SqlDataRecord.netcore.cs</Link>
455-
</Compile>
456450
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SqlMetaData.cs">
457451
<Link>Microsoft\Data\SqlClient\Server\SqlMetaData.cs</Link>
458452
</Compile>

src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -543,9 +543,6 @@
543543
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SmiMetaDataProperty.cs">
544544
<Link>Microsoft\Data\SqlClient\Server\SmiMetaDataProperty.cs</Link>
545545
</Compile>
546-
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SmiRecordBuffer.cs">
547-
<Link>Microsoft\Data\SqlClient\Server\SmiRecordBuffer.cs</Link>
548-
</Compile>
549546
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SmiSettersStream.cs">
550547
<Link>Microsoft\Data\SqlClient\Server\SmiSettersStream.cs</Link>
551548
</Compile>
@@ -561,9 +558,6 @@
561558
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SqlDataRecord.cs">
562559
<Link>Microsoft\Data\SqlClient\Server\SqlDataRecord.cs</Link>
563560
</Compile>
564-
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SqlDataRecord.netfx.cs">
565-
<Link>Microsoft\Data\SqlClient\Server\SqlDataRecord.netfx.cs</Link>
566-
</Compile>
567561
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlClient\Server\SqlMetaData.cs">
568562
<Link>Microsoft\Data\SqlClient\Server\SqlMetaData.cs</Link>
569563
</Compile>

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnection.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,11 +1988,7 @@ internal TdsParser Parser
19881988
{
19891989
get
19901990
{
1991-
SqlInternalConnectionTds tdsConnection = (GetOpenConnection() as SqlInternalConnectionTds);
1992-
if (tdsConnection == null)
1993-
{
1994-
throw SQL.NotAvailableOnContextConnection();
1995-
}
1991+
SqlInternalConnectionTds tdsConnection = GetOpenTdsConnection();
19961992
return tdsConnection.Parser;
19971993
}
19981994
}

src/Microsoft.Data.SqlClient/src/Microsoft/Data/Common/AdapterUtil.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,14 +1455,6 @@ internal static ArgumentException InvalidValue(string parameterName)
14551455
{
14561456
return Argument(StringsHelper.GetString(Strings.ADP_InvalidValue), parameterName);
14571457
}
1458-
internal static ArgumentException InvalidMixedArgumentOfSecureCredentialAndContextConnection()
1459-
{
1460-
return ADP.Argument(StringsHelper.GetString(Strings.ADP_InvalidMixedUsageOfSecureCredentialAndContextConnection));
1461-
}
1462-
internal static InvalidOperationException InvalidMixedUsageOfAccessTokenAndContextConnection()
1463-
{
1464-
return ADP.InvalidOperation(StringsHelper.GetString(Strings.ADP_InvalidMixedUsageOfAccessTokenAndContextConnection));
1465-
}
14661458
internal static Exception InvalidMixedUsageOfAccessTokenAndCredential()
14671459
{
14681460
return ADP.InvalidOperation(StringsHelper.GetString(Strings.ADP_InvalidMixedUsageOfAccessTokenAndCredential));

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/ITypedGettersV3.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ internal interface ITypedGettersV3
6363

6464
// valid for UniqueIdentifier
6565
Guid GetGuid(int ordinal);
66+
// valid for SqlDbType.Time
67+
TimeSpan GetTimeSpan(int ordinal);
68+
// valid for DateTimeOffset
69+
DateTimeOffset GetDateTimeOffset(int ordinal);
6670
}
6771
}
6872

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/ITypedSettersV3.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ internal interface ITypedSettersV3
7373

7474
// valid for UniqueIdentifier
7575
void SetGuid(int ordinal, Guid value);
76+
// valid for SqlDbType.Time
77+
void SetTimeSpan(int ordinal, TimeSpan value);
78+
// valid for DateTimeOffset
79+
void SetDateTimeOffset(int ordinal, DateTimeOffset value);
7680
}
7781
}
7882

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/MemoryRecordBuffer.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace Microsoft.Data.SqlClient.Server
1010
{
1111
// Class for implementing a record object used in out-of-proc scenarios.
12-
internal sealed class MemoryRecordBuffer : SmiRecordBuffer
12+
internal sealed class MemoryRecordBuffer : SmiTypedGetterSetter
1313
{
1414
private SqlRecordBuffer[] _buffer;
1515

@@ -25,6 +25,12 @@ internal MemoryRecordBuffer(SmiMetaData[] metaData)
2525
}
2626
}
2727

28+
#region Read/Write
29+
protected override bool CanGet => true;
30+
31+
protected override bool CanSet => true;
32+
#endregion
33+
2834
#region Getters
2935
// Null test
3036
// valid for all types

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SmiRecordBuffer.cs

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlDataRecord.cs

Lines changed: 91 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Microsoft.Data.SqlClient.Server
1414
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SqlDataRecord/*' />
1515
public partial class SqlDataRecord : IDataRecord
1616
{
17-
private readonly SmiRecordBuffer _recordBuffer;
17+
private readonly MemoryRecordBuffer _recordBuffer;
1818
private readonly SmiExtendedMetaData[] _columnSmiMetaData;
1919
private readonly SqlMetaData[] _columnMetaData;
2020
private FieldNameLookup _fieldNameLookup;
@@ -54,10 +54,22 @@ public virtual string GetDataTypeName(int ordinal)
5454
#if NET
5555
[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields)]
5656
#endif
57-
public virtual Type GetFieldType(int ordinal) => GetFieldTypeFrameworkSpecific(ordinal);
57+
public virtual Type GetFieldType(int ordinal)
58+
{
59+
SqlMetaData md = GetSqlMetaData(ordinal);
60+
61+
#if NETFRAMEWORK
62+
if (md.SqlDbType == SqlDbType.Udt)
63+
{
64+
return md.Type;
65+
}
66+
#endif
67+
68+
return MetaType.GetMetaTypeFromSqlDbType(md.SqlDbType, isMultiValued: false).ClassType;
69+
}
5870

5971
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetValue/*' />
60-
public virtual object GetValue(int ordinal) => GetValueFrameworkSpecific(ordinal);
72+
public virtual object GetValue(int ordinal) => ValueUtilsSmi.GetValue200(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
6173

6274
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetValues/*' />
6375
public virtual int GetValues(object[] values)
@@ -177,7 +189,7 @@ public virtual SqlMetaData GetSqlMetaData(int ordinal)
177189
public virtual Type GetSqlFieldType(int ordinal) => MetaType.GetMetaTypeFromSqlDbType(GetSqlMetaData(ordinal).SqlDbType, false).SqlType;
178190

179191
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetSqlValue/*' />
180-
public virtual object GetSqlValue(int ordinal) => GetSqlValueFrameworkSpecific(ordinal);
192+
public virtual object GetSqlValue(int ordinal) => ValueUtilsSmi.GetSqlValue200(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
181193

182194
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetSqlValues/*' />
183195
public virtual int GetSqlValues(object[] values)
@@ -200,10 +212,10 @@ public virtual int GetSqlValues(object[] values)
200212
public virtual SqlBinary GetSqlBinary(int ordinal) => ValueUtilsSmi.GetSqlBinary(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
201213

202214
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetSqlBytes/*' />
203-
public virtual SqlBytes GetSqlBytes(int ordinal) => GetSqlBytesFrameworkSpecific(ordinal);
215+
public virtual SqlBytes GetSqlBytes(int ordinal) => ValueUtilsSmi.GetSqlBytes(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
204216

205217
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetSqlXml/*' />
206-
public virtual SqlXml GetSqlXml(int ordinal) => GetSqlXmlFrameworkSpecific(ordinal);
218+
public virtual SqlXml GetSqlXml(int ordinal) => ValueUtilsSmi.GetSqlXml(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
207219

208220
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetSqlBoolean/*' />
209221
public virtual SqlBoolean GetSqlBoolean(int ordinal) => ValueUtilsSmi.GetSqlBoolean(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
@@ -212,7 +224,7 @@ public virtual int GetSqlValues(object[] values)
212224
public virtual SqlByte GetSqlByte(int ordinal) => ValueUtilsSmi.GetSqlByte(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
213225

214226
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetSqlChars/*' />
215-
public virtual SqlChars GetSqlChars(int ordinal) => GetSqlCharsFrameworkSpecific(ordinal);
227+
public virtual SqlChars GetSqlChars(int ordinal) => ValueUtilsSmi.GetSqlChars(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
216228

217229
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetSqlInt16/*' />
218230
public virtual SqlInt16 GetSqlInt16(int ordinal) => ValueUtilsSmi.GetSqlInt16(_recordBuffer, ordinal, GetSmiMetaData(ordinal));
@@ -246,10 +258,78 @@ public virtual int GetSqlValues(object[] values)
246258

247259
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetValues/*' />
248260
// ISqlUpdateableRecord Implementation
249-
public virtual int SetValues(params object[] values) => SetValuesFrameworkSpecific(values);
261+
public virtual int SetValues(params object[] values)
262+
{
263+
if (values == null)
264+
{
265+
throw ADP.ArgumentNull(nameof(values));
266+
}
267+
268+
// Allow values array longer than FieldCount, just ignore the extra cells.
269+
int copyLength = (values.Length > FieldCount) ? FieldCount : values.Length;
270+
271+
if (copyLength == 0)
272+
{
273+
return 0;
274+
}
275+
276+
ExtendedClrTypeCode[] typeCodes = new ExtendedClrTypeCode[copyLength];
277+
278+
// Verify all data values as acceptable before changing current state.
279+
for (int i = 0; i < copyLength; i++)
280+
{
281+
SqlMetaData metaData = GetSqlMetaData(i);
282+
typeCodes[i] = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(
283+
metaData.SqlDbType,
284+
isMultiValued: false,
285+
values[i],
286+
metaData.Type);
287+
if (typeCodes[i] == ExtendedClrTypeCode.Invalid)
288+
{
289+
throw ADP.InvalidCast();
290+
}
291+
}
292+
293+
// Now move the data. We've already validated the element types above, so this will
294+
// only throw if an invalid UDT was sent.
295+
for (int i = 0; i < copyLength; i++)
296+
{
297+
ValueUtilsSmi.SetCompatibleValueV200(
298+
_recordBuffer,
299+
ordinal: i,
300+
GetSmiMetaData(i),
301+
values[i],
302+
typeCodes[i],
303+
offset: 0,
304+
peekAhead: null);
305+
}
306+
307+
return copyLength;
308+
}
250309

251310
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetValue/*' />
252-
public virtual void SetValue(int ordinal, object value) => SetValueFrameworkSpecific(ordinal, value);
311+
public virtual void SetValue(int ordinal, object value)
312+
{
313+
SqlMetaData metaData = GetSqlMetaData(ordinal);
314+
ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(
315+
metaData.SqlDbType,
316+
isMultiValued: false,
317+
value,
318+
metaData.Type);
319+
if (typeCode == ExtendedClrTypeCode.Invalid)
320+
{
321+
throw ADP.InvalidCast();
322+
}
323+
324+
ValueUtilsSmi.SetCompatibleValueV200(
325+
_recordBuffer,
326+
ordinal,
327+
GetSmiMetaData(ordinal),
328+
value,
329+
typeCode,
330+
offset: 0,
331+
peekAhead: null);
332+
}
253333

254334
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetBoolean/*' />
255335
public virtual void SetBoolean(int ordinal, bool value) => ValueUtilsSmi.SetBoolean(_recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
@@ -290,10 +370,10 @@ public virtual int GetSqlValues(object[] values)
290370
public virtual void SetDateTime(int ordinal, DateTime value) => ValueUtilsSmi.SetDateTime(_recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
291371

292372
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetTimeSpan/*' />
293-
public virtual void SetTimeSpan(int ordinal, TimeSpan value) => SetTimeSpanFrameworkSpecific(ordinal, value);
373+
public virtual void SetTimeSpan(int ordinal, TimeSpan value) => ValueUtilsSmi.SetTimeSpan(_recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
294374

295375
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetDateTimeOffset/*' />
296-
public virtual void SetDateTimeOffset(int ordinal, DateTimeOffset value) => SetDateTimeOffsetFrameworkSpecific(ordinal, value);
376+
public virtual void SetDateTimeOffset(int ordinal, DateTimeOffset value) => ValueUtilsSmi.SetDateTimeOffset(_recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
297377

298378
/// <include file='../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetDBNull/*' />
299379
public virtual void SetDBNull(int ordinal)

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlDataRecord.netcore.cs

Lines changed: 0 additions & 97 deletions
This file was deleted.

0 commit comments

Comments
 (0)