66using System . Data ;
77using Microsoft . Data . SqlClient . Server ;
88using Xunit ;
9+ using Xunit . Abstractions ;
10+ using Xunit . Sdk ;
911
1012namespace Microsoft . Data . SqlClient . ManualTesting . Tests
1113{
@@ -31,9 +33,11 @@ public class UdtDateTimeOffsetTest
3133 {
3234 private readonly string _connectionString = null ;
3335 private readonly string _udtTableType = DataTestUtility . GetUniqueNameForSqlServer ( "DataTimeOffsetTableType" ) ;
36+ private readonly ITestOutputHelper _testOutputHelper ;
3437
35- public UdtDateTimeOffsetTest ( )
38+ public UdtDateTimeOffsetTest ( ITestOutputHelper testOutputHelper )
3639 {
40+ _testOutputHelper = testOutputHelper ;
3741 _connectionString = DataTestUtility . TCPConnectionString ;
3842 }
3943
@@ -74,26 +78,27 @@ public void SelectFromSqlParameterShouldSucceed()
7478 [ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . AreConnStringsSetup ) , nameof ( DataTestUtility . IsNotAzureServer ) , nameof ( DataTestUtility . IsNotAzureSynapse ) ) ]
7579 public void DateTimeOffsetAllScalesTestShouldSucceed ( )
7680 {
77- string tvpTypeName = DataTestUtility . GetUniqueNameForSqlServer ( "tvpType" ) ;
78-
7981 using SqlConnection connection = new ( _connectionString ) ;
8082 connection . Open ( ) ;
8183
82- try
84+ // Use different scale for each test: 0 to 7
85+ int fromScale = 0 ;
86+ int toScale = 7 ;
87+
88+ for ( int scale = fromScale ; scale <= toScale ; scale ++ )
8389 {
84- // Use different scale for each test: 0 to 7
85- int fromScale = 0 ;
86- int toScale = 7 ;
90+ string tvpTypeName = DataTestUtility . GetUniqueNameForSqlServer ( "tvpType" ) ; // Need a unique name per scale, else we get errors. See https://github.com/dotnet/SqlClient/issues/3011
8791
88- for ( int scale = fromScale ; scale <= toScale ; scale ++ )
89- {
90- DateTimeOffset dateTimeOffset = new DateTimeOffset ( 2024 , 1 , 1 , 23 , 59 , 59 , TimeSpan . Zero ) ;
92+ DateTimeOffset dateTimeOffset = new DateTimeOffset ( 2024 , 1 , 1 , 23 , 59 , 59 , TimeSpan . Zero ) ;
9193
92- // Add sub-second offset corresponding to the scale being tested
93- TimeSpan subSeconds = TimeSpan . FromTicks ( ( long ) ( TimeSpan . TicksPerSecond / Math . Pow ( 10 , scale ) ) ) ;
94- dateTimeOffset = dateTimeOffset . Add ( subSeconds ) ;
94+ // Add sub-second offset corresponding to the scale being tested
95+ TimeSpan subSeconds = TimeSpan . FromTicks ( ( long ) ( TimeSpan . TicksPerSecond / Math . Pow ( 10 , scale ) ) ) ;
96+ dateTimeOffset = dateTimeOffset . Add ( subSeconds ) ;
9597
96- DataTestUtility . DropUserDefinedType ( connection , tvpTypeName ) ;
98+ DataTestUtility . DropUserDefinedType ( connection , tvpTypeName ) ;
99+
100+ try
101+ {
97102 SetupDateTimeOffsetTableType ( connection , tvpTypeName , scale ) ;
98103
99104 var param = new SqlParameter
@@ -109,14 +114,24 @@ public void DateTimeOffsetAllScalesTestShouldSucceed()
109114 {
110115 cmd . CommandText = "SELECT * FROM @params" ;
111116 cmd . Parameters . Add ( param ) ;
112- var result = cmd . ExecuteScalar ( ) ;
113- Assert . Equal ( dateTimeOffset , result ) ;
117+
118+ object result = null ;
119+ try
120+ {
121+ result = cmd . ExecuteScalar ( ) ;
122+ Assert . Equal ( dateTimeOffset , result ) ;
123+ }
124+ catch ( Exception )
125+ {
126+ _testOutputHelper . WriteLine ( $ "{ DateTime . UtcNow : O} : Failed for scale { scale } DateTimeOffset: { dateTimeOffset } Result: { result ?? "No result" } ") ;
127+ throw ;
128+ }
114129 }
115130 }
116- }
117- finally
118- {
119- DataTestUtility . DropUserDefinedType ( connection , tvpTypeName ) ;
131+ finally
132+ {
133+ DataTestUtility . DropUserDefinedType ( connection , tvpTypeName ) ;
134+ }
120135 }
121136 }
122137
0 commit comments