Skip to content

Commit 21deeef

Browse files
[3.1] Test fixes to accommodate recent infra changes (#2709)
Co-authored-by: David Engel <[email protected]>
1 parent 15a694b commit 21deeef

File tree

9 files changed

+70
-34
lines changed

9 files changed

+70
-34
lines changed

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationProvider.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,11 @@ public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenti
114114
CancellationTokenSource cts = new CancellationTokenSource();
115115

116116
// Use Connection timeout value to cancel token acquire request after certain period of time.
117-
cts.CancelAfter(parameters.ConnectionTimeout * 1000); // Convert to milliseconds
117+
int timeout = parameters.ConnectionTimeout * 1000;
118+
if (timeout > 0) // if ConnectionTimeout is 0 or the millis overflows an int, no need to set CancelAfter
119+
{
120+
cts.CancelAfter(timeout); // Convert to milliseconds
121+
}
118122

119123
string scope = parameters.Resource.EndsWith(s_defaultScopeSuffix) ? parameters.Resource : parameters.Resource + s_defaultScopeSuffix;
120124
string[] scopes = new string[] { scope };

src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public static class DataTestUtility
6060
public static readonly string EnclaveAzureDatabaseConnString = null;
6161
public static bool ManagedIdentitySupported = true;
6262
public static string AADAccessToken = null;
63+
public static bool SupportsSystemAssignedManagedIdentity = false;
6364
public static string AADSystemIdentityAccessToken = null;
6465
public static string AADUserIdentityAccessToken = null;
6566
public const string UdtTestDbName = "UdtTestDb";
@@ -70,6 +71,15 @@ public static class DataTestUtility
7071
private static Dictionary<string, bool> AvailableDatabases;
7172
private static TraceEventListener TraceListener;
7273

74+
public static bool TcpConnectionStringDoesNotUseAadAuth
75+
{
76+
get
77+
{
78+
SqlConnectionStringBuilder builder = new (TCPConnectionString);
79+
return builder.Authentication == SqlAuthenticationMethod.SqlPassword || builder.Authentication == SqlAuthenticationMethod.NotSpecified;
80+
}
81+
}
82+
7383
static DataTestUtility()
7484
{
7585
Config c = Config.Load();
@@ -472,7 +482,7 @@ public static string GetAccessToken()
472482

473483
public static string GetSystemIdentityAccessToken()
474484
{
475-
if (true == ManagedIdentitySupported && null == AADSystemIdentityAccessToken && IsAADPasswordConnStrSetup())
485+
if (ManagedIdentitySupported && SupportsSystemAssignedManagedIdentity && null == AADSystemIdentityAccessToken && IsAADPasswordConnStrSetup())
476486
{
477487
AADSystemIdentityAccessToken = AADUtility.GetManagedIdentityToken().GetAwaiter().GetResult();
478488
if (AADSystemIdentityAccessToken == null)
@@ -485,7 +495,7 @@ public static string GetSystemIdentityAccessToken()
485495

486496
public static string GetUserIdentityAccessToken()
487497
{
488-
if (true == ManagedIdentitySupported && null == AADUserIdentityAccessToken && IsAADPasswordConnStrSetup())
498+
if (ManagedIdentitySupported && null == AADUserIdentityAccessToken && IsAADPasswordConnStrSetup())
489499
{
490500
// Pass User Assigned Managed Identity Client Id here.
491501
AADUserIdentityAccessToken = AADUtility.GetManagedIdentityToken(UserManagedIdentityClientId).GetAwaiter().GetResult();

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,14 @@ public void UpdateOffsetTest()
991991
}
992992
}
993993

994-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
994+
public static bool CanRunSchemaTests()
995+
{
996+
return DataTestUtility.AreConnStringsSetup() &&
997+
// Tests switch to master database, which is not guaranteed when using AAD auth
998+
DataTestUtility.TcpConnectionStringDoesNotUseAadAuth;
999+
}
1000+
1001+
[ConditionalFact(nameof(CanRunSchemaTests))]
9951002
public void SelectAllTest()
9961003
{
9971004
// Test exceptions

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/AADConnectionTest.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ private static void ConnectAndDisconnect(string connectionString, SqlCredential
3030
private static bool IsAccessTokenSetup() => DataTestUtility.IsAccessTokenSetup();
3131
private static bool IsAADConnStringsSetup() => DataTestUtility.IsAADPasswordConnStrSetup();
3232
private static bool IsManagedIdentitySetup() => DataTestUtility.ManagedIdentitySupported;
33+
private static bool SupportsSystemAssignedManagedIdentity() => DataTestUtility.SupportsSystemAssignedManagedIdentity;
3334

3435
[ConditionalFact(nameof(IsAccessTokenSetup), nameof(IsAADConnStringsSetup))]
3536
public static void AccessTokenTest()
@@ -481,7 +482,7 @@ public static void ActiveDirectoryDefaultMustPass()
481482
{
482483
string[] credKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
483484
string connStr = DataTestUtility.RemoveKeysInConnStr(DataTestUtility.AADPasswordConnectionString, credKeys) +
484-
"Authentication=ActiveDirectoryDefault;";
485+
$"Authentication=ActiveDirectoryDefault;User ID={DataTestUtility.UserManagedIdentityClientId};";
485486

486487
// Connection should be established using Managed Identity by default.
487488
ConnectAndDisconnect(connStr);
@@ -537,7 +538,7 @@ public static void ConnectionSpeed()
537538

538539
#region Managed Identity Authentication tests
539540

540-
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
541+
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
541542
public static void SystemAssigned_ManagedIdentityTest()
542543
{
543544
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
@@ -555,7 +556,7 @@ public static void UserAssigned_ManagedIdentityTest()
555556
ConnectAndDisconnect(connStr);
556557
}
557558

558-
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
559+
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
559560
public static void AccessToken_SystemManagedIdentityTest()
560561
{
561562
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
@@ -583,7 +584,7 @@ public static void AccessToken_UserManagedIdentityTest()
583584
}
584585
}
585586

586-
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure))]
587+
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
587588
public static void Azure_SystemManagedIdentityTest()
588589
{
589590
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD", "Trusted_Connection", "Integrated Security" };
@@ -613,7 +614,7 @@ public static void Azure_UserManagedIdentityTest()
613614
}
614615
}
615616

616-
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure))]
617+
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsAccessTokenSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
617618
public static void Azure_AccessToken_SystemManagedIdentityTest()
618619
{
619620
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD", "Trusted_Connection", "Integrated Security" };

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,8 @@ public static void ConnectionStringPersistentInfoTest()
347347
}
348348
}
349349

350-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
350+
// ConnectionOpenDisableRetry relies on error 4060 for automatic retry, which is not returned when using AAD auth
351+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
351352
public static void ConnectionOpenDisableRetry()
352353
{
353354
using (SqlConnection sqlConnection = new SqlConnection((new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString) { InitialCatalog = "DoesNotExist0982532435423", Pooling = false }).ConnectionString))

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataBaseSchemaTest/ConnectionSchemaTest.cs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,86 +10,92 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests
1010
{
1111
public static class ConnectionSchemaTest
1212
{
13+
public static bool CanRunSchemaTests()
14+
{
15+
return DataTestUtility.AreConnStringsSetup() &&
16+
// Tests switch to master database, which is not guaranteed when using AAD auth
17+
DataTestUtility.TcpConnectionStringDoesNotUseAadAuth;
18+
}
1319

14-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
20+
[ConditionalFact(nameof(CanRunSchemaTests))]
1521
public static void GetTablesFromSchema()
1622
{
1723
VerifySchemaTable(SqlClientMetaDataCollectionNames.Tables, new string[] { "TABLE_CATALOG", "TABLE_SCHEMA", "TABLE_NAME", "TABLE_TYPE" });
1824
}
1925

20-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
26+
[ConditionalFact(nameof(CanRunSchemaTests))]
2127
public static void GetProceduresFromSchema()
2228
{
2329
VerifySchemaTable(SqlClientMetaDataCollectionNames.Procedures, new string[] { "ROUTINE_SCHEMA", "ROUTINE_NAME", "ROUTINE_TYPE" });
2430
}
2531

26-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
32+
[ConditionalFact(nameof(CanRunSchemaTests))]
2733
public static void GetProcedureParametersFromSchema()
2834
{
2935
VerifySchemaTable(SqlClientMetaDataCollectionNames.ProcedureParameters, new string[] { "PARAMETER_MODE", "PARAMETER_NAME" });
3036
}
3137

32-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
38+
[ConditionalFact(nameof(CanRunSchemaTests))]
3339
public static void GetDatabasesFromSchema()
3440
{
3541
VerifySchemaTable(SqlClientMetaDataCollectionNames.Databases, new string[] { "database_name", "dbid", "create_date" });
3642
}
3743

38-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
44+
[ConditionalFact(nameof(CanRunSchemaTests))]
3945
public static void GetForeignKeysFromSchema()
4046
{
4147
VerifySchemaTable(SqlClientMetaDataCollectionNames.ForeignKeys, new string[] { "CONSTRAINT_TYPE", "IS_DEFERRABLE", "INITIALLY_DEFERRED" });
4248
}
4349

44-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
50+
[ConditionalFact(nameof(CanRunSchemaTests))]
4551
public static void GetIndexesFromSchema()
4652
{
4753
VerifySchemaTable(SqlClientMetaDataCollectionNames.Indexes, new string[] { "index_name", "constraint_name" });
4854
}
4955

50-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
56+
[ConditionalFact(nameof(CanRunSchemaTests))]
5157
public static void GetIndexColumnsFromSchema()
5258
{
5359
VerifySchemaTable(SqlClientMetaDataCollectionNames.IndexColumns, new string[] { "index_name", "KeyType", "column_name" });
5460
}
5561

56-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
62+
[ConditionalFact(nameof(CanRunSchemaTests))]
5763
public static void GetColumnsFromSchema()
5864
{
5965
VerifySchemaTable(SqlClientMetaDataCollectionNames.Columns, new string[] { "IS_NULLABLE", "COLUMN_DEFAULT" });
6066
}
6167

62-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
68+
[ConditionalFact(nameof(CanRunSchemaTests))]
6369
public static void GetAllColumnsFromSchema()
6470
{
6571
VerifySchemaTable(SqlClientMetaDataCollectionNames.AllColumns, new string[] { "IS_NULLABLE", "COLUMN_DEFAULT", "IS_FILESTREAM", "IS_SPARSE", "IS_COLUMN_SET" });
6672
}
67-
68-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
73+
74+
[ConditionalFact(nameof(CanRunSchemaTests))]
6975
public static void GetColumnSetColumnsFromSchema()
7076
{
7177
VerifySchemaTable(SqlClientMetaDataCollectionNames.ColumnSetColumns, new string[] { "IS_NULLABLE", "COLUMN_DEFAULT", "IS_FILESTREAM", "IS_SPARSE", "IS_COLUMN_SET" });
7278
}
7379

74-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
80+
[ConditionalFact(nameof(CanRunSchemaTests))]
7581
public static void GetUsersFromSchema()
7682
{
7783
VerifySchemaTable(SqlClientMetaDataCollectionNames.Users, new string[] { "uid", "user_name" });
7884
}
7985

80-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
86+
[ConditionalFact(nameof(CanRunSchemaTests))]
8187
public static void GetViewsFromSchema()
8288
{
8389
VerifySchemaTable(SqlClientMetaDataCollectionNames.Views, new string[] { "TABLE_NAME", "CHECK_OPTION", "IS_UPDATABLE" });
8490
}
8591

86-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
92+
[ConditionalFact(nameof(CanRunSchemaTests))]
8793
public static void GetViewColumnsFromSchema()
8894
{
8995
VerifySchemaTable(SqlClientMetaDataCollectionNames.ViewColumns, new string[] { "VIEW_CATALOG", "VIEW_SCHEMA", "VIEW_NAME" });
9096
}
9197

92-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
98+
[ConditionalFact(nameof(CanRunSchemaTests))]
9399
public static void GetUserDefinedTypesFromSchema()
94100
{
95101
VerifySchemaTable(SqlClientMetaDataCollectionNames.UserDefinedTypes, new string[] { "assembly_name", "version_revision", "culture_info" });

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ExceptionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ public static void ExceptionTests()
201201
}
202202

203203
// Synapse: 110003;Invalid user or password
204-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
204+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))]
205205
public static void VariousExceptionTests()
206206
{
207207
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString);
@@ -219,7 +219,7 @@ public static void VariousExceptionTests()
219219
}
220220

221221
// Test 1 - B
222-
badBuilder = new SqlConnectionStringBuilder(builder.ConnectionString) { Password = string.Empty, IntegratedSecurity = false };
222+
badBuilder = new SqlConnectionStringBuilder(builder.ConnectionString) { Password = string.Empty, IntegratedSecurity = false, Authentication = SqlAuthenticationMethod.NotSpecified };
223223
using (var sqlConnection = new SqlConnection(badBuilder.ConnectionString))
224224
{
225225
string errorMessage = string.Format(CultureInfo.InvariantCulture, logonFailedErrorMessage, badBuilder.UserID);

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConfigurationManagerReliabilityTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public class SqlConfigurationManagerReliabilityTest
2323
{ InitialCatalog = SqlConnectionReliabilityTest.InvalidInitialCatalog, ConnectTimeout = 1 }.ConnectionString;
2424

2525
#region Internal Functions
26-
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
26+
// Test relies on error 4060 for automatic retry, which is not returned when using AAD auth
27+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
2728
[InlineData(RetryLogicConfigHelper.RetryMethodName_Fix, RetryLogicConfigHelper.RetryMethodName_Inc)]
2829
[InlineData(RetryLogicConfigHelper.RetryMethodName_Inc, RetryLogicConfigHelper.RetryMethodName_Exp)]
2930
[InlineData(RetryLogicConfigHelper.RetryMethodName_Exp, RetryLogicConfigHelper.RetryMethodName_Fix)]
@@ -160,7 +161,8 @@ public void InvalidRetryMethodName(string methodName)
160161
s_commandCRLTest.NoneRetriableExecuteFail(TcpCnnString, cmdProvider);
161162
}
162163

163-
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
164+
// Test relies on error 4060 for automatic retry, which is not returned when using AAD auth
165+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
164166
[InlineData("InvalidRetrylogicTypeName")]
165167
[InlineData("")]
166168
[InlineData(null)]

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public class SqlConnectionReliabilityTest
1616
private readonly string _cancelErrMsgPattern = RetryLogicTestHelper.s_CancelErrMsgPattern;
1717

1818
#region Sync
19-
[Theory]
19+
// Test relies on error 4060 for automatic retry, which is not reliable when using Azure or AAD auth
20+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))]
2021
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper))]
2122
public void ConnectionRetryOpenInvalidCatalogFailed(string cnnString, SqlRetryLogicBaseProvider provider)
2223
{
@@ -33,7 +34,8 @@ public void ConnectionRetryOpenInvalidCatalogFailed(string cnnString, SqlRetryLo
3334
}
3435
}
3536

36-
[Theory]
37+
// Test relies on error 4060 for automatic retry, which is not reliable when using Azure or AAD auth
38+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))]
3739
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper))]
3840
public void ConnectionCancelRetryOpenInvalidCatalog(string cnnString, SqlRetryLogicBaseProvider provider)
3941
{
@@ -98,7 +100,8 @@ public void CreateDatabaseWhileTryingToConnect(string cnnString, SqlRetryLogicBa
98100
Assert.True(currentRetries > 0);
99101
}
100102

101-
[Theory]
103+
// Test relies on AggregateException but SqlException is thrown for Azure auth (Address in #31453)
104+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.IsNotAzureServer))]
102105
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper))]
103106
public void ConcurrentExecution(string cnnString, SqlRetryLogicBaseProvider provider)
104107
{
@@ -154,7 +157,8 @@ public void DefaultOpenWithoutRetry(string connectionString, SqlRetryLogicBasePr
154157
#endregion
155158

156159
#region Async
157-
[Theory]
160+
// Test relies on error 4060 for automatic retry, which is not reliable when using Azure or AAD auth
161+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))]
158162
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 5 }, MemberType = typeof(RetryLogicTestHelper))]
159163
public async void ConnectionRetryOpenAsyncInvalidCatalogFailed(string cnnString, SqlRetryLogicBaseProvider provider)
160164
{
@@ -171,7 +175,8 @@ public async void ConnectionRetryOpenAsyncInvalidCatalogFailed(string cnnString,
171175
}
172176
}
173177

174-
[Theory]
178+
// Test relies on error 4060 for automatic retry, which is not returned when using AAD auth
179+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
175180
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper))]
176181
public async void ConnectionCancelRetryOpenAsyncInvalidCatalog(string cnnString, SqlRetryLogicBaseProvider provider)
177182
{

0 commit comments

Comments
 (0)