Skip to content

Commit c7de60b

Browse files
authored
[5.2.2] | Fix ArgumentNullException on SqlDataRecord.GetValue when using Udt data type (#2448) (#2816)
1 parent b5edb42 commit c7de60b

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,11 +500,7 @@ internal static SmiExtendedMetaData SqlMetaDataToSmiExtendedMetaData(SqlMetaData
500500
source.Scale,
501501
source.LocaleId,
502502
source.CompareOptions,
503-
#if NETFRAMEWORK
504503
source.Type,
505-
#else
506-
null,
507-
#endif
508504
source.Name,
509505
typeSpecificNamePart1,
510506
typeSpecificNamePart2,

src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@
9494
<PackageReference Condition="$(ReferenceType.Contains('NetStandard'))" Include="System.Diagnostics.DiagnosticSource" Version="$(SystemDiagnosticsDiagnosticSourceVersion)" />
9595
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
9696
<Reference Condition="'$(TargetGroup)'=='netfx'" Include="System.Transactions" />
97+
<PackageReference Condition="'$(TargetGroup)'=='netfx'" Include="Microsoft.SqlServer.Types" Version="$(MicrosoftSqlServerTypesVersion)" />
98+
<PackageReference Condition="'$(TargetGroup)'=='netcoreapp'" Include="Microsoft.SqlServer.Types" Version="$(MicrosoftSqlServerTypesVersionNet)" />
9799
</ItemGroup>
98100
<ItemGroup Condition="'$(TargetGroup)' == 'netcoreapp'">
99101
<PackageReference Include="System.Data.Odbc" Version="$(SystemDataOdbcVersion)" />

src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Data;
99
using System.Data.SqlTypes;
1010
using Microsoft.Data.SqlClient.Server;
11+
using Microsoft.SqlServer.Types;
1112
using Xunit;
1213

1314
namespace Microsoft.Data.SqlClient.Tests
@@ -318,6 +319,19 @@ public void GetChar_ThrowsNotSupported()
318319
Assert.Throws<NotSupportedException>(() => record.GetChar(0));
319320
}
320321

322+
[Theory]
323+
[ClassData(typeof(GetUdtTypeTestData))]
324+
public void GetUdt_ReturnsValue(Type udtType, object value, string serverTypeName)
325+
{
326+
SqlMetaData[] metadata = new SqlMetaData[] { new SqlMetaData(nameof(udtType.Name), SqlDbType.Udt, udtType, serverTypeName) };
327+
328+
SqlDataRecord record = new SqlDataRecord(metadata);
329+
330+
record.SetValue(0, value);
331+
332+
Assert.Equal(value.ToString(), record.GetValue(0).ToString());
333+
}
334+
321335
[Theory]
322336
[ClassData(typeof(GetXXXBadTypeTestData))]
323337
public void GetXXX_ThrowsIfBadType(Func<SqlDataRecord, object> getXXX)
@@ -342,8 +356,8 @@ public void GetXXX_ReturnValue(SqlDbType dbType, object value, Func<SqlDataRecor
342356
};
343357
SqlDataRecord record = new SqlDataRecord(metaData);
344358
record.SetValue(0, value);
359+
Assert.Equal(value, record.GetValue(0));
345360
Assert.Equal(value, getXXX(record));
346-
347361
}
348362
}
349363

@@ -369,6 +383,21 @@ IEnumerator IEnumerable.GetEnumerator()
369383
}
370384
}
371385

386+
public class GetUdtTypeTestData : IEnumerable<object[]>
387+
{
388+
public IEnumerator<object[]> GetEnumerator()
389+
{
390+
yield return new object[] { typeof(SqlGeography), SqlGeography.Point(43, -81, 4326), "Geography" };
391+
yield return new object[] { typeof(SqlGeometry), SqlGeometry.Point(43, -81, 4326), "Geometry" };
392+
yield return new object[] { typeof(SqlHierarchyId), SqlHierarchyId.Parse("/"), "HierarchyId" };
393+
}
394+
395+
IEnumerator IEnumerable.GetEnumerator()
396+
{
397+
return GetEnumerator();
398+
}
399+
}
400+
372401
public class GetXXXCheckValueTestData : IEnumerable<object[]>
373402
{
374403
public IEnumerator<object[]> GetEnumerator()
@@ -383,6 +412,10 @@ public IEnumerator<object[]> GetEnumerator()
383412
yield return new object[] { SqlDbType.DateTime, DateTime.Now, new Func<SqlDataRecord, object>(r => r.GetDateTime(0)) };
384413
yield return new object[] { SqlDbType.DateTimeOffset, new DateTimeOffset(DateTime.Now), new Func<SqlDataRecord, object>(r => r.GetDateTimeOffset(0)) };
385414
yield return new object[] { SqlDbType.Time, TimeSpan.FromHours(1), new Func<SqlDataRecord, object>(r => r.GetTimeSpan(0)) };
415+
yield return new object[] { SqlDbType.Date, DateTime.Now.Date, new Func<SqlDataRecord, object>(r => r.GetDateTime(0)) };
416+
yield return new object[] { SqlDbType.Bit, bool.Parse(bool.TrueString), new Func<SqlDataRecord, object>(r => r.GetBoolean(0)) };
417+
yield return new object[] { SqlDbType.SmallDateTime, DateTime.Now, new Func<SqlDataRecord, object>(r => r.GetDateTime(0)) };
418+
yield return new object[] { SqlDbType.TinyInt, (byte)1, new Func<SqlDataRecord, object>(r => r.GetByte(0)) };
386419
}
387420

388421
IEnumerator IEnumerable.GetEnumerator()

0 commit comments

Comments
 (0)