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 1bd80ed583..a362d6dc83 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj @@ -393,6 +393,9 @@ Resources\StringsHelper.cs + + Microsoft\Data\SqlClient\SqlConnectionStringBuilder.cs + Microsoft\Data\Common\AdapterUtil.cs @@ -528,7 +531,6 @@ - Microsoft\Data\SqlClient\SqlConnectionTimeoutErrorInternal.cs diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs deleted file mode 100644 index cbb8f0dd67..0000000000 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs +++ /dev/null @@ -1,1510 +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; -using System.ComponentModel; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using Microsoft.Data.Common; - -namespace Microsoft.Data.SqlClient -{ - /// - [DefaultPropertyAttribute(DbConnectionStringKeywords.DataSource)] - public sealed partial class SqlConnectionStringBuilder : DbConnectionStringBuilder - { - private enum Keywords - { // specific ordering for ConnectionString output construction - // NamedConnection, - DataSource, - FailoverPartner, - AttachDBFilename, - InitialCatalog, - IntegratedSecurity, - PersistSecurityInfo, - UserID, - Password, - Enlist, - Pooling, - MinPoolSize, - MaxPoolSize, - PoolBlockingPeriod, - MultipleActiveResultSets, - Replication, - ConnectTimeout, - Encrypt, - TrustServerCertificate, - LoadBalanceTimeout, - PacketSize, - TypeSystemVersion, - Authentication, - ApplicationName, - CurrentLanguage, - WorkstationID, - UserInstance, - TransactionBinding, - ApplicationIntent, - MultiSubnetFailover, - ConnectRetryCount, - ConnectRetryInterval, - ColumnEncryptionSetting, - EnclaveAttestationUrl, - AttestationProtocol, - - CommandTimeout, - IPAddressPreference, - - // keep the count value last - KeywordsCount - } - - internal const int KeywordsCount = (int)Keywords.KeywordsCount; - internal const int DeprecatedKeywordsCount = 3; - - private static readonly string[] s_validKeywords = CreateValidKeywords(); - private static readonly Dictionary s_keywords = CreateKeywordsDictionary(); - - private ApplicationIntent _applicationIntent = DbConnectionStringDefaults.ApplicationIntent; - private string _applicationName = DbConnectionStringDefaults.ApplicationName; - private string _attachDBFilename = DbConnectionStringDefaults.AttachDBFilename; - private string _currentLanguage = DbConnectionStringDefaults.CurrentLanguage; - private string _dataSource = DbConnectionStringDefaults.DataSource; - private string _failoverPartner = DbConnectionStringDefaults.FailoverPartner; - private string _initialCatalog = DbConnectionStringDefaults.InitialCatalog; - // private string _namedConnection = DbConnectionStringDefaults.NamedConnection; - private string _password = DbConnectionStringDefaults.Password; - private string _transactionBinding = DbConnectionStringDefaults.TransactionBinding; - private string _typeSystemVersion = DbConnectionStringDefaults.TypeSystemVersion; - private string _userID = DbConnectionStringDefaults.UserID; - private string _workstationID = DbConnectionStringDefaults.WorkstationID; - - private int _commandTimeout = DbConnectionStringDefaults.CommandTimeout; - private int _connectTimeout = DbConnectionStringDefaults.ConnectTimeout; - private int _loadBalanceTimeout = DbConnectionStringDefaults.LoadBalanceTimeout; - private int _maxPoolSize = DbConnectionStringDefaults.MaxPoolSize; - private int _minPoolSize = DbConnectionStringDefaults.MinPoolSize; - private int _packetSize = DbConnectionStringDefaults.PacketSize; - private int _connectRetryCount = DbConnectionStringDefaults.ConnectRetryCount; - private int _connectRetryInterval = DbConnectionStringDefaults.ConnectRetryInterval; - - private bool _encrypt = DbConnectionStringDefaults.Encrypt; - private bool _trustServerCertificate = DbConnectionStringDefaults.TrustServerCertificate; - private bool _enlist = DbConnectionStringDefaults.Enlist; - private bool _integratedSecurity = DbConnectionStringDefaults.IntegratedSecurity; - private bool _multipleActiveResultSets = DbConnectionStringDefaults.MultipleActiveResultSets; - private bool _multiSubnetFailover = DbConnectionStringDefaults.MultiSubnetFailover; - private bool _persistSecurityInfo = DbConnectionStringDefaults.PersistSecurityInfo; - private PoolBlockingPeriod _poolBlockingPeriod = DbConnectionStringDefaults.PoolBlockingPeriod; - private bool _pooling = DbConnectionStringDefaults.Pooling; - private bool _replication = DbConnectionStringDefaults.Replication; - private bool _userInstance = DbConnectionStringDefaults.UserInstance; - private SqlAuthenticationMethod _authentication = DbConnectionStringDefaults.Authentication; - private SqlConnectionColumnEncryptionSetting _columnEncryptionSetting = DbConnectionStringDefaults.ColumnEncryptionSetting; - private string _enclaveAttestationUrl = DbConnectionStringDefaults.EnclaveAttestationUrl; - private SqlConnectionAttestationProtocol _attestationProtocol = DbConnectionStringDefaults.AttestationProtocol; - private SqlConnectionIPAddressPreference _ipAddressPreference = DbConnectionStringDefaults.IPAddressPreference; - - private static string[] CreateValidKeywords() - { - string[] validKeywords = new string[KeywordsCount]; - validKeywords[(int)Keywords.ApplicationIntent] = DbConnectionStringKeywords.ApplicationIntent; - validKeywords[(int)Keywords.ApplicationName] = DbConnectionStringKeywords.ApplicationName; - validKeywords[(int)Keywords.AttachDBFilename] = DbConnectionStringKeywords.AttachDBFilename; - validKeywords[(int)Keywords.PoolBlockingPeriod] = DbConnectionStringKeywords.PoolBlockingPeriod; - validKeywords[(int)Keywords.CommandTimeout] = DbConnectionStringKeywords.CommandTimeout; - validKeywords[(int)Keywords.ConnectTimeout] = DbConnectionStringKeywords.ConnectTimeout; - validKeywords[(int)Keywords.CurrentLanguage] = DbConnectionStringKeywords.CurrentLanguage; - validKeywords[(int)Keywords.DataSource] = DbConnectionStringKeywords.DataSource; - validKeywords[(int)Keywords.Encrypt] = DbConnectionStringKeywords.Encrypt; - validKeywords[(int)Keywords.Enlist] = DbConnectionStringKeywords.Enlist; - validKeywords[(int)Keywords.FailoverPartner] = DbConnectionStringKeywords.FailoverPartner; - validKeywords[(int)Keywords.InitialCatalog] = DbConnectionStringKeywords.InitialCatalog; - validKeywords[(int)Keywords.IntegratedSecurity] = DbConnectionStringKeywords.IntegratedSecurity; - validKeywords[(int)Keywords.LoadBalanceTimeout] = DbConnectionStringKeywords.LoadBalanceTimeout; - validKeywords[(int)Keywords.MaxPoolSize] = DbConnectionStringKeywords.MaxPoolSize; - validKeywords[(int)Keywords.MinPoolSize] = DbConnectionStringKeywords.MinPoolSize; - validKeywords[(int)Keywords.MultipleActiveResultSets] = DbConnectionStringKeywords.MultipleActiveResultSets; - validKeywords[(int)Keywords.MultiSubnetFailover] = DbConnectionStringKeywords.MultiSubnetFailover; - // validKeywords[(int)Keywords.NamedConnection] = DbConnectionStringKeywords.NamedConnection; - validKeywords[(int)Keywords.PacketSize] = DbConnectionStringKeywords.PacketSize; - validKeywords[(int)Keywords.Password] = DbConnectionStringKeywords.Password; - validKeywords[(int)Keywords.PersistSecurityInfo] = DbConnectionStringKeywords.PersistSecurityInfo; - validKeywords[(int)Keywords.Pooling] = DbConnectionStringKeywords.Pooling; - validKeywords[(int)Keywords.Replication] = DbConnectionStringKeywords.Replication; - validKeywords[(int)Keywords.TransactionBinding] = DbConnectionStringKeywords.TransactionBinding; - validKeywords[(int)Keywords.TrustServerCertificate] = DbConnectionStringKeywords.TrustServerCertificate; - validKeywords[(int)Keywords.TypeSystemVersion] = DbConnectionStringKeywords.TypeSystemVersion; - validKeywords[(int)Keywords.UserID] = DbConnectionStringKeywords.UserID; - validKeywords[(int)Keywords.UserInstance] = DbConnectionStringKeywords.UserInstance; - validKeywords[(int)Keywords.WorkstationID] = DbConnectionStringKeywords.WorkstationID; - validKeywords[(int)Keywords.ConnectRetryCount] = DbConnectionStringKeywords.ConnectRetryCount; - validKeywords[(int)Keywords.ConnectRetryInterval] = DbConnectionStringKeywords.ConnectRetryInterval; - validKeywords[(int)Keywords.Authentication] = DbConnectionStringKeywords.Authentication; - validKeywords[(int)Keywords.ColumnEncryptionSetting] = DbConnectionStringKeywords.ColumnEncryptionSetting; - validKeywords[(int)Keywords.EnclaveAttestationUrl] = DbConnectionStringKeywords.EnclaveAttestationUrl; - validKeywords[(int)Keywords.AttestationProtocol] = DbConnectionStringKeywords.AttestationProtocol; - validKeywords[(int)Keywords.IPAddressPreference] = DbConnectionStringKeywords.IPAddressPreference; - return validKeywords; - } - - private static Dictionary CreateKeywordsDictionary() - { - Dictionary hash = new Dictionary(KeywordsCount + SqlConnectionString.SynonymCount, StringComparer.OrdinalIgnoreCase); - hash.Add(DbConnectionStringKeywords.ApplicationIntent, Keywords.ApplicationIntent); - hash.Add(DbConnectionStringKeywords.ApplicationName, Keywords.ApplicationName); - hash.Add(DbConnectionStringKeywords.AttachDBFilename, Keywords.AttachDBFilename); - hash.Add(DbConnectionStringKeywords.PoolBlockingPeriod, Keywords.PoolBlockingPeriod); - hash.Add(DbConnectionStringKeywords.CommandTimeout, Keywords.CommandTimeout); - hash.Add(DbConnectionStringKeywords.ConnectTimeout, Keywords.ConnectTimeout); - hash.Add(DbConnectionStringKeywords.CurrentLanguage, Keywords.CurrentLanguage); - hash.Add(DbConnectionStringKeywords.DataSource, Keywords.DataSource); - hash.Add(DbConnectionStringKeywords.Encrypt, Keywords.Encrypt); - hash.Add(DbConnectionStringKeywords.Enlist, Keywords.Enlist); - hash.Add(DbConnectionStringKeywords.FailoverPartner, Keywords.FailoverPartner); - hash.Add(DbConnectionStringKeywords.InitialCatalog, Keywords.InitialCatalog); - hash.Add(DbConnectionStringKeywords.IntegratedSecurity, Keywords.IntegratedSecurity); - hash.Add(DbConnectionStringKeywords.LoadBalanceTimeout, Keywords.LoadBalanceTimeout); - hash.Add(DbConnectionStringKeywords.MultipleActiveResultSets, Keywords.MultipleActiveResultSets); - hash.Add(DbConnectionStringKeywords.MaxPoolSize, Keywords.MaxPoolSize); - hash.Add(DbConnectionStringKeywords.MinPoolSize, Keywords.MinPoolSize); - hash.Add(DbConnectionStringKeywords.MultiSubnetFailover, Keywords.MultiSubnetFailover); - // hash.Add(DbConnectionStringKeywords.NamedConnection, Keywords.NamedConnection); - hash.Add(DbConnectionStringKeywords.PacketSize, Keywords.PacketSize); - hash.Add(DbConnectionStringKeywords.Password, Keywords.Password); - hash.Add(DbConnectionStringKeywords.PersistSecurityInfo, Keywords.PersistSecurityInfo); - hash.Add(DbConnectionStringKeywords.Pooling, Keywords.Pooling); - hash.Add(DbConnectionStringKeywords.Replication, Keywords.Replication); - hash.Add(DbConnectionStringKeywords.TransactionBinding, Keywords.TransactionBinding); - hash.Add(DbConnectionStringKeywords.TrustServerCertificate, Keywords.TrustServerCertificate); - hash.Add(DbConnectionStringKeywords.TypeSystemVersion, Keywords.TypeSystemVersion); - hash.Add(DbConnectionStringKeywords.UserID, Keywords.UserID); - hash.Add(DbConnectionStringKeywords.UserInstance, Keywords.UserInstance); - hash.Add(DbConnectionStringKeywords.WorkstationID, Keywords.WorkstationID); - hash.Add(DbConnectionStringKeywords.ConnectRetryCount, Keywords.ConnectRetryCount); - hash.Add(DbConnectionStringKeywords.ConnectRetryInterval, Keywords.ConnectRetryInterval); - hash.Add(DbConnectionStringKeywords.Authentication, Keywords.Authentication); - hash.Add(DbConnectionStringKeywords.ColumnEncryptionSetting, Keywords.ColumnEncryptionSetting); - hash.Add(DbConnectionStringKeywords.EnclaveAttestationUrl, Keywords.EnclaveAttestationUrl); - hash.Add(DbConnectionStringKeywords.AttestationProtocol, Keywords.AttestationProtocol); - hash.Add(DbConnectionStringKeywords.IPAddressPreference, Keywords.IPAddressPreference); - - hash.Add(DbConnectionStringSynonyms.IPADDRESSPREFERENCE, Keywords.IPAddressPreference); - hash.Add(DbConnectionStringSynonyms.APP, Keywords.ApplicationName); - hash.Add(DbConnectionStringSynonyms.APPLICATIONINTENT, Keywords.ApplicationIntent); - hash.Add(DbConnectionStringSynonyms.EXTENDEDPROPERTIES, Keywords.AttachDBFilename); - hash.Add(DbConnectionStringSynonyms.INITIALFILENAME, Keywords.AttachDBFilename); - hash.Add(DbConnectionStringSynonyms.CONNECTIONTIMEOUT, Keywords.ConnectTimeout); - hash.Add(DbConnectionStringSynonyms.CONNECTRETRYCOUNT, Keywords.ConnectRetryCount); - hash.Add(DbConnectionStringSynonyms.CONNECTRETRYINTERVAL, Keywords.ConnectRetryInterval); - hash.Add(DbConnectionStringSynonyms.TIMEOUT, Keywords.ConnectTimeout); - hash.Add(DbConnectionStringSynonyms.LANGUAGE, Keywords.CurrentLanguage); - hash.Add(DbConnectionStringSynonyms.ADDR, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.ADDRESS, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.MULTIPLEACTIVERESULTSETS, Keywords.MultipleActiveResultSets); - hash.Add(DbConnectionStringSynonyms.MULTISUBNETFAILOVER, Keywords.MultiSubnetFailover); - hash.Add(DbConnectionStringSynonyms.NETWORKADDRESS, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.POOLBLOCKINGPERIOD, Keywords.PoolBlockingPeriod); - hash.Add(DbConnectionStringSynonyms.SERVER, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.DATABASE, Keywords.InitialCatalog); - hash.Add(DbConnectionStringSynonyms.TRUSTEDCONNECTION, Keywords.IntegratedSecurity); - hash.Add(DbConnectionStringSynonyms.TRUSTSERVERCERTIFICATE, Keywords.TrustServerCertificate); - hash.Add(DbConnectionStringSynonyms.ConnectionLifetime, Keywords.LoadBalanceTimeout); - hash.Add(DbConnectionStringSynonyms.Pwd, Keywords.Password); - hash.Add(DbConnectionStringSynonyms.PERSISTSECURITYINFO, Keywords.PersistSecurityInfo); - hash.Add(DbConnectionStringSynonyms.UID, Keywords.UserID); - hash.Add(DbConnectionStringSynonyms.User, Keywords.UserID); - hash.Add(DbConnectionStringSynonyms.WSID, Keywords.WorkstationID); - Debug.Assert((KeywordsCount + SqlConnectionString.SynonymCount) == hash.Count, "initial expected size is incorrect"); - return hash; - } - - /// - public SqlConnectionStringBuilder() : this((string)null) - { - } - - /// - public SqlConnectionStringBuilder(string connectionString) : base() - { - if (!string.IsNullOrEmpty(connectionString)) - { - ConnectionString = connectionString; - } - } - - /// - public override object this[string keyword] - { - get - { - Keywords index = GetIndex(keyword); - return GetAt(index); - } - set - { - if (null != value) - { - Keywords index = GetIndex(keyword); - switch (index) - { - case Keywords.ApplicationIntent: - this.ApplicationIntent = ConvertToApplicationIntent(keyword, value); - break; - case Keywords.ApplicationName: - ApplicationName = ConvertToString(value); - break; - case Keywords.AttachDBFilename: - AttachDBFilename = ConvertToString(value); - break; - case Keywords.CurrentLanguage: - CurrentLanguage = ConvertToString(value); - break; - case Keywords.DataSource: - DataSource = ConvertToString(value); - break; - case Keywords.FailoverPartner: - FailoverPartner = ConvertToString(value); - break; - case Keywords.InitialCatalog: - InitialCatalog = ConvertToString(value); - break; - // case Keywords.NamedConnection: NamedConnection = ConvertToString(value); break; - case Keywords.Password: - Password = ConvertToString(value); - break; - case Keywords.UserID: - UserID = ConvertToString(value); - break; - case Keywords.TransactionBinding: - TransactionBinding = ConvertToString(value); - break; - case Keywords.TypeSystemVersion: - TypeSystemVersion = ConvertToString(value); - break; - case Keywords.WorkstationID: - WorkstationID = ConvertToString(value); - break; - - case Keywords.CommandTimeout: - CommandTimeout = ConvertToInt32(value); - break; - case Keywords.ConnectTimeout: - ConnectTimeout = ConvertToInt32(value); - break; - case Keywords.LoadBalanceTimeout: - LoadBalanceTimeout = ConvertToInt32(value); - break; - case Keywords.MaxPoolSize: - MaxPoolSize = ConvertToInt32(value); - break; - case Keywords.MinPoolSize: - MinPoolSize = ConvertToInt32(value); - break; - case Keywords.PacketSize: - PacketSize = ConvertToInt32(value); - break; - - case Keywords.IntegratedSecurity: - IntegratedSecurity = ConvertToIntegratedSecurity(value); - break; - case Keywords.Authentication: - Authentication = ConvertToAuthenticationType(keyword, value); - break; - case Keywords.ColumnEncryptionSetting: - ColumnEncryptionSetting = ConvertToColumnEncryptionSetting(keyword, value); - break; - case Keywords.EnclaveAttestationUrl: - EnclaveAttestationUrl = ConvertToString(value); - break; - case Keywords.AttestationProtocol: - AttestationProtocol = ConvertToAttestationProtocol(keyword, value); - break; - case Keywords.IPAddressPreference: - IPAddressPreference = ConvertToIPAddressPreference(keyword, value); - break; - case Keywords.PoolBlockingPeriod: - PoolBlockingPeriod = ConvertToPoolBlockingPeriod(keyword, value); - break; - case Keywords.Encrypt: - Encrypt = ConvertToBoolean(value); - break; - case Keywords.TrustServerCertificate: - TrustServerCertificate = ConvertToBoolean(value); - break; - case Keywords.Enlist: - Enlist = ConvertToBoolean(value); - break; - case Keywords.MultipleActiveResultSets: - MultipleActiveResultSets = ConvertToBoolean(value); - break; - case Keywords.MultiSubnetFailover: - MultiSubnetFailover = ConvertToBoolean(value); - break; - case Keywords.PersistSecurityInfo: - PersistSecurityInfo = ConvertToBoolean(value); - break; - case Keywords.Pooling: - Pooling = ConvertToBoolean(value); - break; - case Keywords.Replication: - Replication = ConvertToBoolean(value); - break; - case Keywords.UserInstance: - UserInstance = ConvertToBoolean(value); - break; - case Keywords.ConnectRetryCount: - ConnectRetryCount = ConvertToInt32(value); - break; - case Keywords.ConnectRetryInterval: - ConnectRetryInterval = ConvertToInt32(value); - break; - - default: - Debug.Fail("unexpected keyword"); - throw UnsupportedKeyword(keyword); - } - } - else - { - Remove(keyword); - } - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.ApplicationIntent)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ApplicationIntent)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public ApplicationIntent ApplicationIntent - { - get { return _applicationIntent; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidApplicationIntentValue(value)) - { - throw ADP.InvalidEnumerationValue(typeof(ApplicationIntent), (int)value); - } - - SetApplicationIntentValue(value); - _applicationIntent = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.ApplicationName)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Context)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ApplicationName)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string ApplicationName - { - get { return _applicationName; } - set - { - SetValue(DbConnectionStringKeywords.ApplicationName, value); - _applicationName = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.AttachDBFilename)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_AttachDBFilename)] - [EditorAttribute("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string AttachDBFilename - { - get { return _attachDBFilename; } - set - { - SetValue(DbConnectionStringKeywords.AttachDBFilename, value); - _attachDBFilename = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.CommandTimeout)] - [ResCategory(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescription(StringsHelper.ResourceNames.DbCommand_CommandTimeout)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int CommandTimeout - { - get { return _commandTimeout; } - set - { - if (value < 0) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.CommandTimeout); - } - SetValue(DbConnectionStringKeywords.CommandTimeout, value); - _commandTimeout = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.ConnectTimeout)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ConnectTimeout)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int ConnectTimeout - { - get { return _connectTimeout; } - set - { - if (value < 0) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectTimeout); - } - SetValue(DbConnectionStringKeywords.ConnectTimeout, value); - _connectTimeout = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.CurrentLanguage)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_CurrentLanguage)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string CurrentLanguage - { - get { return _currentLanguage; } - set - { - SetValue(DbConnectionStringKeywords.CurrentLanguage, value); - _currentLanguage = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.DataSource)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_DataSource)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string DataSource - { - get { return _dataSource; } - set - { - SetValue(DbConnectionStringKeywords.DataSource, value); - _dataSource = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.Encrypt)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Encrypt)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Encrypt - { - get { return _encrypt; } - set - { - SetValue(DbConnectionStringKeywords.Encrypt, value); - _encrypt = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.ColumnEncryptionSetting)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_ColumnEncryptionSetting)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting - { - get { return _columnEncryptionSetting; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidColumnEncryptionSetting(value)) - { - throw ADP.InvalidEnumerationValue(typeof(SqlConnectionColumnEncryptionSetting), (int)value); - } - - SetColumnEncryptionSettingValue(value); - _columnEncryptionSetting = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.EnclaveAttestationUrl)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_EnclaveAttestationUrl)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string EnclaveAttestationUrl - { - get { return _enclaveAttestationUrl; } - set - { - SetValue(DbConnectionStringKeywords.EnclaveAttestationUrl, value); - _enclaveAttestationUrl = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.AttestationProtocol)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_AttestationProtocol)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlConnectionAttestationProtocol AttestationProtocol - { - get { return _attestationProtocol; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidAttestationProtocol(value)) - { - throw ADP.InvalidEnumerationValue(typeof(SqlConnectionAttestationProtocol), (int)value); - } - - SetAttestationProtocolValue(value); - _attestationProtocol = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.IPAddressPreference)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_IPAddressPreference)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlConnectionIPAddressPreference IPAddressPreference - { - get => _ipAddressPreference; - set - { - if (!DbConnectionStringBuilderUtil.IsValidIPAddressPreference(value)) - { - throw ADP.InvalidEnumerationValue(typeof(SqlConnectionIPAddressPreference), (int)value); - } - - SetIPAddressPreferenceValue(value); - _ipAddressPreference = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.TrustServerCertificate)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_TrustServerCertificate)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool TrustServerCertificate - { - get { return _trustServerCertificate; } - set - { - SetValue(DbConnectionStringKeywords.TrustServerCertificate, value); - _trustServerCertificate = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.Enlist)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Enlist)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Enlist - { - get { return _enlist; } - set - { - SetValue(DbConnectionStringKeywords.Enlist, value); - _enlist = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.FailoverPartner)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_FailoverPartner)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string FailoverPartner - { - get { return _failoverPartner; } - set - { - SetValue(DbConnectionStringKeywords.FailoverPartner, value); - _failoverPartner = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.InitialCatalog)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_InitialCatalog)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - [TypeConverter(typeof(SqlInitialCatalogConverter))] - public string InitialCatalog - { - get { return _initialCatalog; } - set - { - SetValue(DbConnectionStringKeywords.InitialCatalog, value); - _initialCatalog = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.IntegratedSecurity)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_IntegratedSecurity)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool IntegratedSecurity - { - get { return _integratedSecurity; } - set - { - SetValue(DbConnectionStringKeywords.IntegratedSecurity, value); - _integratedSecurity = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.Authentication)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Authentication)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlAuthenticationMethod Authentication - { - get { return _authentication; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidAuthenticationTypeValue(value)) - { - throw ADP.InvalidEnumerationValue(typeof(SqlAuthenticationMethod), (int)value); - } - - SetAuthenticationValue(value); - _authentication = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.LoadBalanceTimeout)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_LoadBalanceTimeout)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int LoadBalanceTimeout - { - get { return _loadBalanceTimeout; } - set - { - if (value < 0) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.LoadBalanceTimeout); - } - SetValue(DbConnectionStringKeywords.LoadBalanceTimeout, value); - _loadBalanceTimeout = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.MaxPoolSize)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MaxPoolSize)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int MaxPoolSize - { - get { return _maxPoolSize; } - set - { - if (value < 1) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.MaxPoolSize); - } - SetValue(DbConnectionStringKeywords.MaxPoolSize, value); - _maxPoolSize = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.ConnectRetryCount)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_ConnectionResilency)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ConnectRetryCount)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int ConnectRetryCount - { - get { return _connectRetryCount; } - set - { - if ((value < 0) || (value > 255)) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectRetryCount); - } - SetValue(DbConnectionStringKeywords.ConnectRetryCount, value); - _connectRetryCount = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.ConnectRetryInterval)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_ConnectionResilency)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ConnectRetryInterval)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int ConnectRetryInterval - { - get { return _connectRetryInterval; } - set - { - if ((value < 1) || (value > 60)) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectRetryInterval); - } - SetValue(DbConnectionStringKeywords.ConnectRetryInterval, value); - _connectRetryInterval = value; - } - } - - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.MinPoolSize)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MinPoolSize)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int MinPoolSize - { - get { return _minPoolSize; } - set - { - if (value < 0) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.MinPoolSize); - } - SetValue(DbConnectionStringKeywords.MinPoolSize, value); - _minPoolSize = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.MultipleActiveResultSets)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MultipleActiveResultSets)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool MultipleActiveResultSets - { - get { return _multipleActiveResultSets; } - set - { - SetValue(DbConnectionStringKeywords.MultipleActiveResultSets, value); - _multipleActiveResultSets = value; - } - } - - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Justification = "Reviewed and Approved by UE")] - [DisplayNameAttribute(DbConnectionStringKeywords.MultiSubnetFailover)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MultiSubnetFailover)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool MultiSubnetFailover - { - get { return _multiSubnetFailover; } - set - { - SetValue(DbConnectionStringKeywords.MultiSubnetFailover, value); - _multiSubnetFailover = value; - } - } - /* - [DisplayName(DbConnectionStringKeywords.NamedConnection)] - [ResCategoryAttribute(Strings.DataCategory_NamedConnectionString)] - [ResDescriptionAttribute(Strings.DbConnectionString_NamedConnection)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - [TypeConverter(typeof(NamedConnectionStringConverter))] - public string NamedConnection { - get { return _namedConnection; } - set { - SetValue(DbConnectionStringKeywords.NamedConnection, value); - _namedConnection = value; - } - } - */ - /// - [DisplayNameAttribute(DbConnectionStringKeywords.PacketSize)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_PacketSize)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int PacketSize - { - get { return _packetSize; } - set - { - if ((value < TdsEnums.MIN_PACKET_SIZE) || (TdsEnums.MAX_PACKET_SIZE < value)) - { - throw SQL.InvalidPacketSizeValue(); - } - SetValue(DbConnectionStringKeywords.PacketSize, value); - _packetSize = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.Password)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Password)] - [PasswordPropertyTextAttribute(true)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string Password - { - get { return _password; } - set - { - SetValue(DbConnectionStringKeywords.Password, value); - _password = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.PersistSecurityInfo)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_PersistSecurityInfo)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool PersistSecurityInfo - { - get { return _persistSecurityInfo; } - set - { - SetValue(DbConnectionStringKeywords.PersistSecurityInfo, value); - _persistSecurityInfo = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.PoolBlockingPeriod)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_PoolBlockingPeriod)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public PoolBlockingPeriod PoolBlockingPeriod - { - get { return _poolBlockingPeriod; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidPoolBlockingPeriodValue(value)) - { - throw ADP.InvalidEnumerationValue(typeof(PoolBlockingPeriod), (int)value); - } - - SetPoolBlockingPeriodValue(value); - _poolBlockingPeriod = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.Pooling)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Pooling)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Pooling - { - get { return _pooling; } - set - { - SetValue(DbConnectionStringKeywords.Pooling, value); - _pooling = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.Replication)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Replication)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Replication)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Replication - { - get { return _replication; } - set - { - SetValue(DbConnectionStringKeywords.Replication, value); - _replication = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.TransactionBinding)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_TransactionBinding)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string TransactionBinding - { - get { return _transactionBinding; } - set - { - SetValue(DbConnectionStringKeywords.TransactionBinding, value); - _transactionBinding = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.TypeSystemVersion)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_TypeSystemVersion)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string TypeSystemVersion - { - get { return _typeSystemVersion; } - set - { - SetValue(DbConnectionStringKeywords.TypeSystemVersion, value); - _typeSystemVersion = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.UserID)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_UserID)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string UserID - { - get { return _userID; } - set - { - SetValue(DbConnectionStringKeywords.UserID, value); - _userID = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.UserInstance)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_UserInstance)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool UserInstance - { - get { return _userInstance; } - set - { - SetValue(DbConnectionStringKeywords.UserInstance, value); - _userInstance = value; - } - } - - /// - [DisplayNameAttribute(DbConnectionStringKeywords.WorkstationID)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Context)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_WorkstationID)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string WorkstationID - { - get { return _workstationID; } - set - { - SetValue(DbConnectionStringKeywords.WorkstationID, value); - _workstationID = value; - } - } - - /// - public override ICollection Keys - { - get - { - return new System.Collections.ObjectModel.ReadOnlyCollection(s_validKeywords); - } - } - - /// - public override ICollection Values - { - get - { - // written this way so if the ordering of Keywords & _validKeywords changes - // this is one less place to maintain - object[] values = new object[s_validKeywords.Length]; - for (int i = 0; i < values.Length; ++i) - { - values[i] = GetAt((Keywords)i); - } - return new System.Collections.ObjectModel.ReadOnlyCollection(values); - } - } - - /// - public override void Clear() - { - base.Clear(); - for (int i = 0; i < s_validKeywords.Length; ++i) - { - Reset((Keywords)i); - } - } - - /// - public override bool ContainsKey(string keyword) - { - ADP.CheckArgumentNull(keyword, nameof(keyword)); - return s_keywords.ContainsKey(keyword); - } - - private static bool ConvertToBoolean(object value) - { - return DbConnectionStringBuilderUtil.ConvertToBoolean(value); - } - private static int ConvertToInt32(object value) - { - return DbConnectionStringBuilderUtil.ConvertToInt32(value); - } - private static bool ConvertToIntegratedSecurity(object value) - { - return DbConnectionStringBuilderUtil.ConvertToIntegratedSecurity(value); - } - private static SqlAuthenticationMethod ConvertToAuthenticationType(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToAuthenticationType(keyword, value); - } - private static string ConvertToString(object value) - { - return DbConnectionStringBuilderUtil.ConvertToString(value); - } - private static ApplicationIntent ConvertToApplicationIntent(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToApplicationIntent(keyword, value); - } - - /// - /// Convert to SqlConnectionColumnEncryptionSetting. - /// - /// - /// - private static SqlConnectionColumnEncryptionSetting ConvertToColumnEncryptionSetting(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToColumnEncryptionSetting(keyword, value); - } - - /// - /// Convert to SqlConnectionAttestationProtocol - /// - /// - /// - private static SqlConnectionAttestationProtocol ConvertToAttestationProtocol(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToAttestationProtocol(keyword, value); - } - - /// - /// Convert to SqlConnectionIPAddressPreference - /// - /// - /// - private static SqlConnectionIPAddressPreference ConvertToIPAddressPreference(string keyword, object value) - => DbConnectionStringBuilderUtil.ConvertToIPAddressPreference(keyword, value); - - private static PoolBlockingPeriod ConvertToPoolBlockingPeriod(string keyword, object value) - => DbConnectionStringBuilderUtil.ConvertToPoolBlockingPeriod(keyword, value); - - private object GetAt(Keywords index) - { - switch (index) - { - case Keywords.ApplicationIntent: - return this.ApplicationIntent; - case Keywords.ApplicationName: - return ApplicationName; - case Keywords.AttachDBFilename: - return AttachDBFilename; - case Keywords.PoolBlockingPeriod: - return PoolBlockingPeriod; - case Keywords.CommandTimeout: - return CommandTimeout; - case Keywords.ConnectTimeout: - return ConnectTimeout; - case Keywords.CurrentLanguage: - return CurrentLanguage; - case Keywords.DataSource: - return DataSource; - case Keywords.Encrypt: - return Encrypt; - case Keywords.Enlist: - return Enlist; - case Keywords.FailoverPartner: - return FailoverPartner; - case Keywords.InitialCatalog: - return InitialCatalog; - case Keywords.IntegratedSecurity: - return IntegratedSecurity; - case Keywords.LoadBalanceTimeout: - return LoadBalanceTimeout; - case Keywords.MultipleActiveResultSets: - return MultipleActiveResultSets; - case Keywords.MaxPoolSize: - return MaxPoolSize; - case Keywords.MinPoolSize: - return MinPoolSize; - case Keywords.MultiSubnetFailover: - return MultiSubnetFailover; - // case Keywords.NamedConnection: return NamedConnection; - case Keywords.PacketSize: - return PacketSize; - case Keywords.Password: - return Password; - case Keywords.PersistSecurityInfo: - return PersistSecurityInfo; - case Keywords.Pooling: - return Pooling; - case Keywords.Replication: - return Replication; - case Keywords.TransactionBinding: - return TransactionBinding; - case Keywords.TrustServerCertificate: - return TrustServerCertificate; - case Keywords.TypeSystemVersion: - return TypeSystemVersion; - case Keywords.UserID: - return UserID; - case Keywords.UserInstance: - return UserInstance; - case Keywords.WorkstationID: - return WorkstationID; - case Keywords.ConnectRetryCount: - return ConnectRetryCount; - case Keywords.ConnectRetryInterval: - return ConnectRetryInterval; - case Keywords.Authentication: - return Authentication; - case Keywords.ColumnEncryptionSetting: - return ColumnEncryptionSetting; - case Keywords.EnclaveAttestationUrl: - return EnclaveAttestationUrl; - case Keywords.AttestationProtocol: - return AttestationProtocol; - case Keywords.IPAddressPreference: - return IPAddressPreference; - default: - Debug.Fail("unexpected keyword"); - throw UnsupportedKeyword(s_validKeywords[(int)index]); - } - } - - private Keywords GetIndex(string keyword) - { - ADP.CheckArgumentNull(keyword, nameof(keyword)); - Keywords index; - if (s_keywords.TryGetValue(keyword, out index)) - { - return index; - } - throw UnsupportedKeyword(keyword); - } - - /// - public override bool Remove(string keyword) - { - ADP.CheckArgumentNull(keyword, nameof(keyword)); - Keywords index; - if (s_keywords.TryGetValue(keyword, out index)) - { - if (base.Remove(s_validKeywords[(int)index])) - { - Reset(index); - return true; - } - } - return false; - } - - private void Reset(Keywords index) - { - switch (index) - { - case Keywords.ApplicationIntent: - _applicationIntent = DbConnectionStringDefaults.ApplicationIntent; - break; - case Keywords.ApplicationName: - _applicationName = DbConnectionStringDefaults.ApplicationName; - break; - case Keywords.AttachDBFilename: - _attachDBFilename = DbConnectionStringDefaults.AttachDBFilename; - break; - case Keywords.Authentication: - _authentication = DbConnectionStringDefaults.Authentication; - break; - case Keywords.PoolBlockingPeriod: - _poolBlockingPeriod = DbConnectionStringDefaults.PoolBlockingPeriod; - break; - case Keywords.CommandTimeout: - _commandTimeout = DbConnectionStringDefaults.CommandTimeout; - break; - case Keywords.ConnectTimeout: - _connectTimeout = DbConnectionStringDefaults.ConnectTimeout; - break; - case Keywords.CurrentLanguage: - _currentLanguage = DbConnectionStringDefaults.CurrentLanguage; - break; - case Keywords.DataSource: - _dataSource = DbConnectionStringDefaults.DataSource; - break; - case Keywords.Encrypt: - _encrypt = DbConnectionStringDefaults.Encrypt; - break; - case Keywords.Enlist: - _enlist = DbConnectionStringDefaults.Enlist; - break; - case Keywords.FailoverPartner: - _failoverPartner = DbConnectionStringDefaults.FailoverPartner; - break; - case Keywords.InitialCatalog: - _initialCatalog = DbConnectionStringDefaults.InitialCatalog; - break; - case Keywords.IntegratedSecurity: - _integratedSecurity = DbConnectionStringDefaults.IntegratedSecurity; - break; - case Keywords.LoadBalanceTimeout: - _loadBalanceTimeout = DbConnectionStringDefaults.LoadBalanceTimeout; - break; - case Keywords.MultipleActiveResultSets: - _multipleActiveResultSets = DbConnectionStringDefaults.MultipleActiveResultSets; - break; - case Keywords.MaxPoolSize: - _maxPoolSize = DbConnectionStringDefaults.MaxPoolSize; - break; - case Keywords.MinPoolSize: - _minPoolSize = DbConnectionStringDefaults.MinPoolSize; - break; - case Keywords.MultiSubnetFailover: - _multiSubnetFailover = DbConnectionStringDefaults.MultiSubnetFailover; - break; - // case Keywords.NamedConnection: - // _namedConnection = DbConnectionStringDefaults.NamedConnection; - // break; - case Keywords.PacketSize: - _packetSize = DbConnectionStringDefaults.PacketSize; - break; - case Keywords.Password: - _password = DbConnectionStringDefaults.Password; - break; - case Keywords.PersistSecurityInfo: - _persistSecurityInfo = DbConnectionStringDefaults.PersistSecurityInfo; - break; - case Keywords.Pooling: - _pooling = DbConnectionStringDefaults.Pooling; - break; - case Keywords.ConnectRetryCount: - _connectRetryCount = DbConnectionStringDefaults.ConnectRetryCount; - break; - case Keywords.ConnectRetryInterval: - _connectRetryInterval = DbConnectionStringDefaults.ConnectRetryInterval; - break; - case Keywords.Replication: - _replication = DbConnectionStringDefaults.Replication; - break; - case Keywords.TransactionBinding: - _transactionBinding = DbConnectionStringDefaults.TransactionBinding; - break; - case Keywords.TrustServerCertificate: - _trustServerCertificate = DbConnectionStringDefaults.TrustServerCertificate; - break; - case Keywords.TypeSystemVersion: - _typeSystemVersion = DbConnectionStringDefaults.TypeSystemVersion; - break; - case Keywords.UserID: - _userID = DbConnectionStringDefaults.UserID; - break; - case Keywords.UserInstance: - _userInstance = DbConnectionStringDefaults.UserInstance; - break; - case Keywords.WorkstationID: - _workstationID = DbConnectionStringDefaults.WorkstationID; - break; - case Keywords.ColumnEncryptionSetting: - _columnEncryptionSetting = DbConnectionStringDefaults.ColumnEncryptionSetting; - break; - case Keywords.EnclaveAttestationUrl: - _enclaveAttestationUrl = DbConnectionStringDefaults.EnclaveAttestationUrl; - break; - case Keywords.AttestationProtocol: - _attestationProtocol = DbConnectionStringDefaults.AttestationProtocol; - break; - case Keywords.IPAddressPreference: - _ipAddressPreference = DbConnectionStringDefaults.IPAddressPreference; - break; - default: - Debug.Fail("unexpected keyword"); - throw UnsupportedKeyword(s_validKeywords[(int)index]); - } - } - - private void SetValue(string keyword, bool value) - { - base[keyword] = value.ToString(); - } - private void SetValue(string keyword, int value) - { - base[keyword] = value.ToString((System.IFormatProvider)null); - } - private void SetValue(string keyword, string value) - { - ADP.CheckArgumentNull(value, keyword); - base[keyword] = value; - } - private void SetApplicationIntentValue(ApplicationIntent value) - { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidApplicationIntentValue(value), "invalid value"); - base[DbConnectionStringKeywords.ApplicationIntent] = DbConnectionStringBuilderUtil.ApplicationIntentToString(value); - } - private void SetColumnEncryptionSettingValue(SqlConnectionColumnEncryptionSetting value) - { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidColumnEncryptionSetting(value), "Invalid value for SqlConnectionColumnEncryptionSetting"); - base[DbConnectionStringKeywords.ColumnEncryptionSetting] = DbConnectionStringBuilderUtil.ColumnEncryptionSettingToString(value); - } - - private void SetAttestationProtocolValue(SqlConnectionAttestationProtocol value) - { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidAttestationProtocol(value), "Invalid value for SqlConnectionAttestationProtocol"); - base[DbConnectionStringKeywords.AttestationProtocol] = DbConnectionStringBuilderUtil.AttestationProtocolToString(value); - } - - private void SetIPAddressPreferenceValue(SqlConnectionIPAddressPreference value) - { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidIPAddressPreference(value), "Invalid value for SqlConnectionIPAddressPreference"); - base[DbConnectionStringKeywords.IPAddressPreference] = DbConnectionStringBuilderUtil.IPAddressPreferenceToString(value); - } - - private void SetAuthenticationValue(SqlAuthenticationMethod value) - { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidAuthenticationTypeValue(value), "Invalid value for AuthenticationType"); - base[DbConnectionStringKeywords.Authentication] = DbConnectionStringBuilderUtil.AuthenticationTypeToString(value); - } - - private void SetPoolBlockingPeriodValue(PoolBlockingPeriod value) - { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidPoolBlockingPeriodValue(value), "Invalid value for PoolBlockingPeriod"); - base[DbConnectionStringKeywords.PoolBlockingPeriod] = DbConnectionStringBuilderUtil.PoolBlockingPeriodToString(value); - } - - /// - public override bool ShouldSerialize(string keyword) - { - ADP.CheckArgumentNull(keyword, nameof(keyword)); - Keywords index; - return s_keywords.TryGetValue(keyword, out index) && base.ShouldSerialize(s_validKeywords[(int)index]); - } - - /// - public override bool TryGetValue(string keyword, out object value) - { - Keywords index; - if (s_keywords.TryGetValue(keyword, out index)) - { - value = GetAt(index); - return true; - } - value = null; - return false; - } - - private static readonly string[] s_notSupportedKeywords = new string[] { - DbConnectionStringKeywords.ConnectionReset, - DbConnectionStringKeywords.ContextConnection, - DbConnectionStringKeywords.TransactionBinding, - }; - - private static readonly string[] s_notSupportedNetworkLibraryKeywords = new string[] { - DbConnectionStringKeywords.NetworkLibrary, - - DbConnectionStringSynonyms.NET, - DbConnectionStringSynonyms.NETWORK - }; - - private Exception UnsupportedKeyword(string keyword) - { - if (s_notSupportedKeywords.Contains(keyword, StringComparer.OrdinalIgnoreCase)) - { - return SQL.UnsupportedKeyword(keyword); - } - else if (s_notSupportedNetworkLibraryKeywords.Contains(keyword, StringComparer.OrdinalIgnoreCase)) - { - return SQL.NetworkLibraryKeywordNotSupported(); - } - else - { - return ADP.KeywordNotSupported(keyword); - } - } - - private sealed class SqlInitialCatalogConverter : StringConverter - { - // converter classes should have public ctor - public SqlInitialCatalogConverter() - { - } - - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) - { - return GetStandardValuesSupportedInternal(context); - } - - private bool GetStandardValuesSupportedInternal(ITypeDescriptorContext context) - { - // Only say standard values are supported if the connection string has enough - // information set to instantiate a connection and retrieve a list of databases - bool flag = false; - if (null != context) - { - SqlConnectionStringBuilder constr = (context.Instance as SqlConnectionStringBuilder); - if (null != constr) - { - if ((0 < constr.DataSource.Length) && (constr.IntegratedSecurity || (0 < constr.UserID.Length))) - { - flag = true; - } - } - } - return flag; - } - - public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) - { - // Although theoretically this could be true, some people may want to just type in a name - return false; - } - - public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) - { - // There can only be standard values if the connection string is in a state that might - // be able to instantiate a connection - if (GetStandardValuesSupportedInternal(context)) - { - - // Create an array list to store the database names - List values = new List(); - - try - { - SqlConnectionStringBuilder constr = (SqlConnectionStringBuilder)context.Instance; - - // Create a connection - using (SqlConnection connection = new SqlConnection()) - { - - // Create a basic connection string from current property values - connection.ConnectionString = constr.ConnectionString; - - // Try to open the connection - connection.Open(); - - DataTable databaseTable = connection.GetSchema("DATABASES"); - - foreach (DataRow row in databaseTable.Rows) - { - string dbName = (string)row["database_name"]; - values.Add(dbName); - } - } - } - catch (SqlException e) - { - ADP.TraceExceptionWithoutRethrow(e); - // silently fail - } - - // Return values as a StandardValuesCollection - return new StandardValuesCollection(values); - } - return null; - } - } - } -} diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj index c88a172035..6c86478a02 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj @@ -477,6 +477,9 @@ Resources\ResDescriptionAttribute.cs + + Microsoft\Data\SqlClient\SqlConnectionStringBuilder.cs + Microsoft\Data\Common\AdapterUtil.cs @@ -512,7 +515,6 @@ - Microsoft\Data\SqlClient\SqlConnectionTimeoutErrorInternal.cs diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs similarity index 57% rename from src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs rename to src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs index ddf8feae2e..b78c2e392b 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs @@ -7,24 +7,28 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using System.ComponentModel.Design.Serialization; using System.Data; using System.Data.Common; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Linq; using System.Reflection; using Microsoft.Data.Common; namespace Microsoft.Data.SqlClient { - /// - [DefaultProperty("DataSource")] - [System.ComponentModel.TypeConverterAttribute(typeof(SqlConnectionStringBuilder.SqlConnectionStringBuilderConverter))] + /// + [DefaultProperty(DbConnectionStringKeywords.DataSource)] + [TypeConverter(typeof(SqlConnectionStringBuilderConverter))] public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder { + /// + /// specific ordering for ConnectionString output construction + /// private enum Keywords - { // specific ordering for ConnectionString output construction - // NamedConnection, + { DataSource, FailoverPartner, AttachDBFilename, @@ -38,14 +42,12 @@ private enum Keywords MinPoolSize, MaxPoolSize, PoolBlockingPeriod, - ConnectionReset, MultipleActiveResultSets, Replication, ConnectTimeout, Encrypt, TrustServerCertificate, LoadBalanceTimeout, - NetworkLibrary, PacketSize, TypeSystemVersion, Authentication, @@ -53,31 +55,34 @@ private enum Keywords CurrentLanguage, WorkstationID, UserInstance, - ContextConnection, TransactionBinding, ApplicationIntent, MultiSubnetFailover, - TransparentNetworkIPResolution, ConnectRetryCount, ConnectRetryInterval, ColumnEncryptionSetting, EnclaveAttestationUrl, AttestationProtocol, - CommandTimeout, IPAddressPreference, - +#if NETFRAMEWORK + ConnectionReset, + NetworkLibrary, + ContextConnection, + TransparentNetworkIPResolution, #if ADONET_CERT_AUTH Certificate, #endif - // keep the count value last +#endif + // keep the KeywordsCount value last KeywordsCount } + #region Fields internal const int KeywordsCount = (int)Keywords.KeywordsCount; - private static readonly string[] _validKeywords; - private static readonly Dictionary _keywords; + private static readonly string[] s_validKeywords = CreateValidKeywords(); + private static readonly Dictionary s_keywords = CreateKeywordsDictionary(); private ApplicationIntent _applicationIntent = DbConnectionStringDefaults.ApplicationIntent; private string _applicationName = DbConnectionStringDefaults.ApplicationName; @@ -86,13 +91,12 @@ private enum Keywords private string _dataSource = DbConnectionStringDefaults.DataSource; private string _failoverPartner = DbConnectionStringDefaults.FailoverPartner; private string _initialCatalog = DbConnectionStringDefaults.InitialCatalog; - // private string _namedConnection = DbConnectionStringDefaults.NamedConnection; - private string _networkLibrary = DbConnectionStringDefaults.NetworkLibrary; private string _password = DbConnectionStringDefaults.Password; private string _transactionBinding = DbConnectionStringDefaults.TransactionBinding; private string _typeSystemVersion = DbConnectionStringDefaults.TypeSystemVersion; private string _userID = DbConnectionStringDefaults.UserID; private string _workstationID = DbConnectionStringDefaults.WorkstationID; + private int _commandTimeout = DbConnectionStringDefaults.CommandTimeout; private int _connectTimeout = DbConnectionStringDefaults.ConnectTimeout; private int _loadBalanceTimeout = DbConnectionStringDefaults.LoadBalanceTimeout; @@ -101,16 +105,15 @@ private enum Keywords private int _packetSize = DbConnectionStringDefaults.PacketSize; private int _connectRetryCount = DbConnectionStringDefaults.ConnectRetryCount; private int _connectRetryInterval = DbConnectionStringDefaults.ConnectRetryInterval; - private bool _connectionReset = DbConnectionStringDefaults.ConnectionReset; - private bool _contextConnection = DbConnectionStringDefaults.ContextConnection; private bool _encrypt = DbConnectionStringDefaults.Encrypt; private bool _trustServerCertificate = DbConnectionStringDefaults.TrustServerCertificate; private bool _enlist = DbConnectionStringDefaults.Enlist; private bool _integratedSecurity = DbConnectionStringDefaults.IntegratedSecurity; private bool _multipleActiveResultSets = DbConnectionStringDefaults.MultipleActiveResultSets; private bool _multiSubnetFailover = DbConnectionStringDefaults.MultiSubnetFailover; - private bool _transparentNetworkIPResolution = DbConnectionStringDefaults.TransparentNetworkIPResolution; + private bool _persistSecurityInfo = DbConnectionStringDefaults.PersistSecurityInfo; + private PoolBlockingPeriod _poolBlockingPeriod = DbConnectionStringDefaults.PoolBlockingPeriod; private bool _pooling = DbConnectionStringDefaults.Pooling; private bool _replication = DbConnectionStringDefaults.Replication; private bool _userInstance = DbConnectionStringDefaults.UserInstance; @@ -119,23 +122,30 @@ private enum Keywords private string _enclaveAttestationUrl = DbConnectionStringDefaults.EnclaveAttestationUrl; private SqlConnectionAttestationProtocol _attestationProtocol = DbConnectionStringDefaults.AttestationProtocol; private SqlConnectionIPAddressPreference _ipAddressPreference = DbConnectionStringDefaults.IPAddressPreference; - private PoolBlockingPeriod _poolBlockingPeriod = DbConnectionStringDefaults.PoolBlockingPeriod; +#if NETFRAMEWORK + private bool _connectionReset = DbConnectionStringDefaults.ConnectionReset; + private bool _contextConnection = DbConnectionStringDefaults.ContextConnection; + private bool _transparentNetworkIPResolution = DbConnectionStringDefaults.TransparentNetworkIPResolution; + private string _networkLibrary = DbConnectionStringDefaults.NetworkLibrary; #if ADONET_CERT_AUTH private string _certificate = DbConnectionStringDefaults.Certificate; #endif +#else + internal const int DeprecatedKeywordsCount = 3; +#endif + #endregion //Fields - static SqlConnectionStringBuilder() + #region Private Methods + private static string[] CreateValidKeywords() { string[] validKeywords = new string[KeywordsCount]; validKeywords[(int)Keywords.ApplicationIntent] = DbConnectionStringKeywords.ApplicationIntent; validKeywords[(int)Keywords.ApplicationName] = DbConnectionStringKeywords.ApplicationName; validKeywords[(int)Keywords.AttachDBFilename] = DbConnectionStringKeywords.AttachDBFilename; validKeywords[(int)Keywords.PoolBlockingPeriod] = DbConnectionStringKeywords.PoolBlockingPeriod; - validKeywords[(int)Keywords.ConnectionReset] = DbConnectionStringKeywords.ConnectionReset; - validKeywords[(int)Keywords.ContextConnection] = DbConnectionStringKeywords.ContextConnection; - validKeywords[(int)Keywords.ConnectTimeout] = DbConnectionStringKeywords.ConnectTimeout; validKeywords[(int)Keywords.CommandTimeout] = DbConnectionStringKeywords.CommandTimeout; + validKeywords[(int)Keywords.ConnectTimeout] = DbConnectionStringKeywords.ConnectTimeout; validKeywords[(int)Keywords.CurrentLanguage] = DbConnectionStringKeywords.CurrentLanguage; validKeywords[(int)Keywords.DataSource] = DbConnectionStringKeywords.DataSource; validKeywords[(int)Keywords.Encrypt] = DbConnectionStringKeywords.Encrypt; @@ -148,9 +158,6 @@ static SqlConnectionStringBuilder() validKeywords[(int)Keywords.MinPoolSize] = DbConnectionStringKeywords.MinPoolSize; validKeywords[(int)Keywords.MultipleActiveResultSets] = DbConnectionStringKeywords.MultipleActiveResultSets; validKeywords[(int)Keywords.MultiSubnetFailover] = DbConnectionStringKeywords.MultiSubnetFailover; - validKeywords[(int)Keywords.TransparentNetworkIPResolution] = DbConnectionStringKeywords.TransparentNetworkIPResolution; - // validKeywords[(int)Keywords.NamedConnection] = DbConnectionStringKeywords.NamedConnection; - validKeywords[(int)Keywords.NetworkLibrary] = DbConnectionStringKeywords.NetworkLibrary; validKeywords[(int)Keywords.PacketSize] = DbConnectionStringKeywords.PacketSize; validKeywords[(int)Keywords.Password] = DbConnectionStringKeywords.Password; validKeywords[(int)Keywords.PersistSecurityInfo] = DbConnectionStringKeywords.PersistSecurityInfo; @@ -169,1766 +176,1657 @@ static SqlConnectionStringBuilder() validKeywords[(int)Keywords.EnclaveAttestationUrl] = DbConnectionStringKeywords.EnclaveAttestationUrl; validKeywords[(int)Keywords.AttestationProtocol] = DbConnectionStringKeywords.AttestationProtocol; validKeywords[(int)Keywords.IPAddressPreference] = DbConnectionStringKeywords.IPAddressPreference; +#if NETFRAMEWORK + validKeywords[(int)Keywords.ConnectionReset] = DbConnectionStringKeywords.ConnectionReset; + validKeywords[(int)Keywords.ContextConnection] = DbConnectionStringKeywords.ContextConnection; + validKeywords[(int)Keywords.TransparentNetworkIPResolution] = DbConnectionStringKeywords.TransparentNetworkIPResolution; + validKeywords[(int)Keywords.NetworkLibrary] = DbConnectionStringKeywords.NetworkLibrary; #if ADONET_CERT_AUTH validKeywords[(int)Keywords.Certificate] = DbConnectionStringKeywords.Certificate; #endif - _validKeywords = validKeywords; - - Dictionary hash = new Dictionary(KeywordsCount + SqlConnectionString.SynonymCount, StringComparer.OrdinalIgnoreCase); - hash.Add(DbConnectionStringKeywords.ApplicationIntent, Keywords.ApplicationIntent); - hash.Add(DbConnectionStringKeywords.ApplicationName, Keywords.ApplicationName); - hash.Add(DbConnectionStringKeywords.AttachDBFilename, Keywords.AttachDBFilename); - hash.Add(DbConnectionStringKeywords.PoolBlockingPeriod, Keywords.PoolBlockingPeriod); - hash.Add(DbConnectionStringKeywords.ConnectTimeout, Keywords.ConnectTimeout); - hash.Add(DbConnectionStringKeywords.CommandTimeout, Keywords.CommandTimeout); - hash.Add(DbConnectionStringKeywords.ConnectionReset, Keywords.ConnectionReset); - hash.Add(DbConnectionStringKeywords.ContextConnection, Keywords.ContextConnection); - hash.Add(DbConnectionStringKeywords.CurrentLanguage, Keywords.CurrentLanguage); - hash.Add(DbConnectionStringKeywords.DataSource, Keywords.DataSource); - hash.Add(DbConnectionStringKeywords.Encrypt, Keywords.Encrypt); - hash.Add(DbConnectionStringKeywords.Enlist, Keywords.Enlist); - hash.Add(DbConnectionStringKeywords.FailoverPartner, Keywords.FailoverPartner); - hash.Add(DbConnectionStringKeywords.InitialCatalog, Keywords.InitialCatalog); - hash.Add(DbConnectionStringKeywords.IntegratedSecurity, Keywords.IntegratedSecurity); - hash.Add(DbConnectionStringKeywords.LoadBalanceTimeout, Keywords.LoadBalanceTimeout); - hash.Add(DbConnectionStringKeywords.MultipleActiveResultSets, Keywords.MultipleActiveResultSets); - hash.Add(DbConnectionStringKeywords.MaxPoolSize, Keywords.MaxPoolSize); - hash.Add(DbConnectionStringKeywords.MinPoolSize, Keywords.MinPoolSize); - hash.Add(DbConnectionStringKeywords.MultiSubnetFailover, Keywords.MultiSubnetFailover); - hash.Add(DbConnectionStringKeywords.TransparentNetworkIPResolution, Keywords.TransparentNetworkIPResolution); - // hash.Add(DbConnectionStringKeywords.NamedConnection, Keywords.NamedConnection); - hash.Add(DbConnectionStringKeywords.NetworkLibrary, Keywords.NetworkLibrary); - hash.Add(DbConnectionStringKeywords.PacketSize, Keywords.PacketSize); - hash.Add(DbConnectionStringKeywords.Password, Keywords.Password); - hash.Add(DbConnectionStringKeywords.PersistSecurityInfo, Keywords.PersistSecurityInfo); - hash.Add(DbConnectionStringKeywords.Pooling, Keywords.Pooling); - hash.Add(DbConnectionStringKeywords.Replication, Keywords.Replication); - hash.Add(DbConnectionStringKeywords.TransactionBinding, Keywords.TransactionBinding); - hash.Add(DbConnectionStringKeywords.TrustServerCertificate, Keywords.TrustServerCertificate); - hash.Add(DbConnectionStringKeywords.TypeSystemVersion, Keywords.TypeSystemVersion); - hash.Add(DbConnectionStringKeywords.UserID, Keywords.UserID); - hash.Add(DbConnectionStringKeywords.UserInstance, Keywords.UserInstance); - hash.Add(DbConnectionStringKeywords.WorkstationID, Keywords.WorkstationID); - hash.Add(DbConnectionStringKeywords.ConnectRetryCount, Keywords.ConnectRetryCount); - hash.Add(DbConnectionStringKeywords.ConnectRetryInterval, Keywords.ConnectRetryInterval); - hash.Add(DbConnectionStringKeywords.Authentication, Keywords.Authentication); - hash.Add(DbConnectionStringKeywords.ColumnEncryptionSetting, Keywords.ColumnEncryptionSetting); - hash.Add(DbConnectionStringKeywords.EnclaveAttestationUrl, Keywords.EnclaveAttestationUrl); - hash.Add(DbConnectionStringKeywords.AttestationProtocol, Keywords.AttestationProtocol); - hash.Add(DbConnectionStringKeywords.IPAddressPreference, Keywords.IPAddressPreference); +#endif + return validKeywords; + } + + private static Dictionary CreateKeywordsDictionary() + { + Dictionary pairs = new(KeywordsCount + SqlConnectionString.SynonymCount, StringComparer.OrdinalIgnoreCase) + { + { DbConnectionStringKeywords.ApplicationIntent, Keywords.ApplicationIntent }, + { DbConnectionStringKeywords.ApplicationName, Keywords.ApplicationName }, + { DbConnectionStringKeywords.AttachDBFilename, Keywords.AttachDBFilename }, + { DbConnectionStringKeywords.PoolBlockingPeriod, Keywords.PoolBlockingPeriod }, + { DbConnectionStringKeywords.CommandTimeout, Keywords.CommandTimeout }, + { DbConnectionStringKeywords.ConnectTimeout, Keywords.ConnectTimeout }, + { DbConnectionStringKeywords.CurrentLanguage, Keywords.CurrentLanguage }, + { DbConnectionStringKeywords.DataSource, Keywords.DataSource }, + { DbConnectionStringKeywords.Encrypt, Keywords.Encrypt }, + { DbConnectionStringKeywords.Enlist, Keywords.Enlist }, + { DbConnectionStringKeywords.FailoverPartner, Keywords.FailoverPartner }, + { DbConnectionStringKeywords.InitialCatalog, Keywords.InitialCatalog }, + { DbConnectionStringKeywords.IntegratedSecurity, Keywords.IntegratedSecurity }, + { DbConnectionStringKeywords.LoadBalanceTimeout, Keywords.LoadBalanceTimeout }, + { DbConnectionStringKeywords.MultipleActiveResultSets, Keywords.MultipleActiveResultSets }, + { DbConnectionStringKeywords.MaxPoolSize, Keywords.MaxPoolSize }, + { DbConnectionStringKeywords.MinPoolSize, Keywords.MinPoolSize }, + { DbConnectionStringKeywords.MultiSubnetFailover, Keywords.MultiSubnetFailover }, + { DbConnectionStringKeywords.PacketSize, Keywords.PacketSize }, + { DbConnectionStringKeywords.Password, Keywords.Password }, + { DbConnectionStringKeywords.PersistSecurityInfo, Keywords.PersistSecurityInfo }, + { DbConnectionStringKeywords.Pooling, Keywords.Pooling }, + { DbConnectionStringKeywords.Replication, Keywords.Replication }, + { DbConnectionStringKeywords.TransactionBinding, Keywords.TransactionBinding }, + { DbConnectionStringKeywords.TrustServerCertificate, Keywords.TrustServerCertificate }, + { DbConnectionStringKeywords.TypeSystemVersion, Keywords.TypeSystemVersion }, + { DbConnectionStringKeywords.UserID, Keywords.UserID }, + { DbConnectionStringKeywords.UserInstance, Keywords.UserInstance }, + { DbConnectionStringKeywords.WorkstationID, Keywords.WorkstationID }, + { DbConnectionStringKeywords.ConnectRetryCount, Keywords.ConnectRetryCount }, + { DbConnectionStringKeywords.ConnectRetryInterval, Keywords.ConnectRetryInterval }, + { DbConnectionStringKeywords.Authentication, Keywords.Authentication }, + { DbConnectionStringKeywords.ColumnEncryptionSetting, Keywords.ColumnEncryptionSetting }, + { DbConnectionStringKeywords.EnclaveAttestationUrl, Keywords.EnclaveAttestationUrl }, + { DbConnectionStringKeywords.AttestationProtocol, Keywords.AttestationProtocol }, + { DbConnectionStringKeywords.IPAddressPreference, Keywords.IPAddressPreference }, + +#if NETFRAMEWORK + { DbConnectionStringKeywords.ConnectionReset, Keywords.ConnectionReset }, + { DbConnectionStringKeywords.ContextConnection, Keywords.ContextConnection }, + { DbConnectionStringKeywords.TransparentNetworkIPResolution, Keywords.TransparentNetworkIPResolution }, + { DbConnectionStringKeywords.NetworkLibrary, Keywords.NetworkLibrary }, #if ADONET_CERT_AUTH - hash.Add(DbConnectionStringKeywords.Certificate, Keywords.Certificate); + { DbConnectionStringKeywords.Certificate, Keywords.Certificate }, #endif - hash.Add(DbConnectionStringSynonyms.IPADDRESSPREFERENCE, Keywords.IPAddressPreference); - hash.Add(DbConnectionStringSynonyms.APP, Keywords.ApplicationName); - hash.Add(DbConnectionStringSynonyms.APPLICATIONINTENT, Keywords.ApplicationIntent); - hash.Add(DbConnectionStringSynonyms.EXTENDEDPROPERTIES, Keywords.AttachDBFilename); - hash.Add(DbConnectionStringSynonyms.INITIALFILENAME, Keywords.AttachDBFilename); - hash.Add(DbConnectionStringSynonyms.CONNECTIONTIMEOUT, Keywords.ConnectTimeout); - hash.Add(DbConnectionStringSynonyms.CONNECTRETRYCOUNT, Keywords.ConnectRetryCount); - hash.Add(DbConnectionStringSynonyms.CONNECTRETRYINTERVAL, Keywords.ConnectRetryInterval); - hash.Add(DbConnectionStringSynonyms.TIMEOUT, Keywords.ConnectTimeout); - hash.Add(DbConnectionStringSynonyms.LANGUAGE, Keywords.CurrentLanguage); - hash.Add(DbConnectionStringSynonyms.ADDR, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.ADDRESS, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.MULTIPLEACTIVERESULTSETS, Keywords.MultipleActiveResultSets); - hash.Add(DbConnectionStringSynonyms.MULTISUBNETFAILOVER, Keywords.MultiSubnetFailover); - hash.Add(DbConnectionStringSynonyms.NETWORKADDRESS, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.POOLBLOCKINGPERIOD, Keywords.PoolBlockingPeriod); - hash.Add(DbConnectionStringSynonyms.SERVER, Keywords.DataSource); - hash.Add(DbConnectionStringSynonyms.DATABASE, Keywords.InitialCatalog); - hash.Add(DbConnectionStringSynonyms.TRUSTEDCONNECTION, Keywords.IntegratedSecurity); - hash.Add(DbConnectionStringSynonyms.ConnectionLifetime, Keywords.LoadBalanceTimeout); - hash.Add(DbConnectionStringSynonyms.NET, Keywords.NetworkLibrary); - hash.Add(DbConnectionStringSynonyms.NETWORK, Keywords.NetworkLibrary); - hash.Add(DbConnectionStringSynonyms.Pwd, Keywords.Password); - hash.Add(DbConnectionStringSynonyms.PERSISTSECURITYINFO, Keywords.PersistSecurityInfo); - hash.Add(DbConnectionStringSynonyms.TRANSPARENTNETWORKIPRESOLUTION, Keywords.TransparentNetworkIPResolution); - hash.Add(DbConnectionStringSynonyms.TRUSTSERVERCERTIFICATE, Keywords.TrustServerCertificate); - hash.Add(DbConnectionStringSynonyms.UID, Keywords.UserID); - hash.Add(DbConnectionStringSynonyms.User, Keywords.UserID); - hash.Add(DbConnectionStringSynonyms.WSID, Keywords.WorkstationID); - Debug.Assert((KeywordsCount + SqlConnectionString.SynonymCount) == hash.Count, "initial expected size is incorrect"); - _keywords = hash; - - } - - /// - public SqlConnectionStringBuilder() : this((string)null) - { - } - - /// - public SqlConnectionStringBuilder(string connectionString) : base() + { DbConnectionStringSynonyms.NET, Keywords.NetworkLibrary }, + { DbConnectionStringSynonyms.NETWORK, Keywords.NetworkLibrary }, + { DbConnectionStringSynonyms.TRANSPARENTNETWORKIPRESOLUTION, Keywords.TransparentNetworkIPResolution }, +#endif + { DbConnectionStringSynonyms.IPADDRESSPREFERENCE, Keywords.IPAddressPreference }, + { DbConnectionStringSynonyms.APP, Keywords.ApplicationName }, + { DbConnectionStringSynonyms.APPLICATIONINTENT, Keywords.ApplicationIntent }, + { DbConnectionStringSynonyms.EXTENDEDPROPERTIES, Keywords.AttachDBFilename }, + { DbConnectionStringSynonyms.INITIALFILENAME, Keywords.AttachDBFilename }, + { DbConnectionStringSynonyms.CONNECTIONTIMEOUT, Keywords.ConnectTimeout }, + { DbConnectionStringSynonyms.CONNECTRETRYCOUNT, Keywords.ConnectRetryCount }, + { DbConnectionStringSynonyms.CONNECTRETRYINTERVAL, Keywords.ConnectRetryInterval }, + { DbConnectionStringSynonyms.TIMEOUT, Keywords.ConnectTimeout }, + { DbConnectionStringSynonyms.LANGUAGE, Keywords.CurrentLanguage }, + { DbConnectionStringSynonyms.ADDR, Keywords.DataSource }, + { DbConnectionStringSynonyms.ADDRESS, Keywords.DataSource }, + { DbConnectionStringSynonyms.MULTIPLEACTIVERESULTSETS, Keywords.MultipleActiveResultSets }, + { DbConnectionStringSynonyms.MULTISUBNETFAILOVER, Keywords.MultiSubnetFailover }, + { DbConnectionStringSynonyms.NETWORKADDRESS, Keywords.DataSource }, + { DbConnectionStringSynonyms.POOLBLOCKINGPERIOD, Keywords.PoolBlockingPeriod }, + { DbConnectionStringSynonyms.SERVER, Keywords.DataSource }, + { DbConnectionStringSynonyms.DATABASE, Keywords.InitialCatalog }, + { DbConnectionStringSynonyms.TRUSTEDCONNECTION, Keywords.IntegratedSecurity }, + { DbConnectionStringSynonyms.TRUSTSERVERCERTIFICATE, Keywords.TrustServerCertificate }, + { DbConnectionStringSynonyms.ConnectionLifetime, Keywords.LoadBalanceTimeout }, + { DbConnectionStringSynonyms.Pwd, Keywords.Password }, + { DbConnectionStringSynonyms.PERSISTSECURITYINFO, Keywords.PersistSecurityInfo }, + { DbConnectionStringSynonyms.UID, Keywords.UserID }, + { DbConnectionStringSynonyms.User, Keywords.UserID }, + { DbConnectionStringSynonyms.WSID, Keywords.WorkstationID } + }; + Debug.Assert((KeywordsCount + SqlConnectionString.SynonymCount) == pairs.Count, "initial expected size is incorrect"); + return pairs; + } + + private static bool ConvertToBoolean(object value) => DbConnectionStringBuilderUtil.ConvertToBoolean(value); + + private static int ConvertToInt32(object value) => DbConnectionStringBuilderUtil.ConvertToInt32(value); + + private static bool ConvertToIntegratedSecurity(object value) => DbConnectionStringBuilderUtil.ConvertToIntegratedSecurity(value); + + private static SqlAuthenticationMethod ConvertToAuthenticationType(string keyword, object value) => DbConnectionStringBuilderUtil.ConvertToAuthenticationType(keyword, value); + + private static string ConvertToString(object value) => DbConnectionStringBuilderUtil.ConvertToString(value); + + private static ApplicationIntent ConvertToApplicationIntent(string keyword, object value) => DbConnectionStringBuilderUtil.ConvertToApplicationIntent(keyword, value); + + private static SqlConnectionColumnEncryptionSetting ConvertToColumnEncryptionSetting(string keyword, object value) + => DbConnectionStringBuilderUtil.ConvertToColumnEncryptionSetting(keyword, value); + + private static SqlConnectionAttestationProtocol ConvertToAttestationProtocol(string keyword, object value) + => DbConnectionStringBuilderUtil.ConvertToAttestationProtocol(keyword, value); + + private static SqlConnectionIPAddressPreference ConvertToIPAddressPreference(string keyword, object value) + => DbConnectionStringBuilderUtil.ConvertToIPAddressPreference(keyword, value); + + private static PoolBlockingPeriod ConvertToPoolBlockingPeriod(string keyword, object value) + => DbConnectionStringBuilderUtil.ConvertToPoolBlockingPeriod(keyword, value); + + private object GetAt(Keywords index) { - if (!ADP.IsEmpty(connectionString)) + switch (index) { - ConnectionString = connectionString; + case Keywords.ApplicationIntent: + return ApplicationIntent; + case Keywords.ApplicationName: + return ApplicationName; + case Keywords.AttachDBFilename: + return AttachDBFilename; + case Keywords.PoolBlockingPeriod: + return PoolBlockingPeriod; + case Keywords.CommandTimeout: + return CommandTimeout; + case Keywords.ConnectTimeout: + return ConnectTimeout; + case Keywords.CurrentLanguage: + return CurrentLanguage; + case Keywords.DataSource: + return DataSource; + case Keywords.Encrypt: + return Encrypt; + case Keywords.Enlist: + return Enlist; + case Keywords.FailoverPartner: + return FailoverPartner; + case Keywords.InitialCatalog: + return InitialCatalog; + case Keywords.IntegratedSecurity: + return IntegratedSecurity; + case Keywords.LoadBalanceTimeout: + return LoadBalanceTimeout; + case Keywords.MultipleActiveResultSets: + return MultipleActiveResultSets; + case Keywords.MaxPoolSize: + return MaxPoolSize; + case Keywords.MinPoolSize: + return MinPoolSize; + case Keywords.MultiSubnetFailover: + return MultiSubnetFailover; + // case Keywords.NamedConnection: return NamedConnection; + case Keywords.PacketSize: + return PacketSize; + case Keywords.Password: + return Password; + case Keywords.PersistSecurityInfo: + return PersistSecurityInfo; + case Keywords.Pooling: + return Pooling; + case Keywords.Replication: + return Replication; + case Keywords.TransactionBinding: + return TransactionBinding; + case Keywords.TrustServerCertificate: + return TrustServerCertificate; + case Keywords.TypeSystemVersion: + return TypeSystemVersion; + case Keywords.UserID: + return UserID; + case Keywords.UserInstance: + return UserInstance; + case Keywords.WorkstationID: + return WorkstationID; + case Keywords.ConnectRetryCount: + return ConnectRetryCount; + case Keywords.ConnectRetryInterval: + return ConnectRetryInterval; + case Keywords.Authentication: + return Authentication; + case Keywords.ColumnEncryptionSetting: + return ColumnEncryptionSetting; + case Keywords.EnclaveAttestationUrl: + return EnclaveAttestationUrl; + case Keywords.AttestationProtocol: + return AttestationProtocol; + case Keywords.IPAddressPreference: + return IPAddressPreference; + +#if NETFRAMEWORK +#pragma warning disable 618 // Obsolete properties + case Keywords.ConnectionReset: + return ConnectionReset; + case Keywords.ContextConnection: + return ContextConnection; +#pragma warning restore 618 + case Keywords.TransparentNetworkIPResolution: + return TransparentNetworkIPResolution; + case Keywords.NetworkLibrary: + return NetworkLibrary; +#if ADONET_CERT_AUTH + case Keywords.Certificate: return Certificate; +#endif +#endif + default: + Debug.Fail("unexpected keyword"); + throw UnsupportedKeyword(s_validKeywords[(int)index]); } } - /// - public override object this[string keyword] + private Keywords GetIndex(string keyword) { - get + ADP.CheckArgumentNull(keyword, nameof(keyword)); + if (s_keywords.TryGetValue(keyword, out Keywords index)) { - Keywords index = GetIndex(keyword); - return GetAt(index); + return index; } - set - { - if (null != value) - { - Keywords index = GetIndex(keyword); - switch (index) - { - case Keywords.ApplicationIntent: - this.ApplicationIntent = ConvertToApplicationIntent(keyword, value); - break; - case Keywords.ApplicationName: - ApplicationName = ConvertToString(value); - break; - case Keywords.AttachDBFilename: - AttachDBFilename = ConvertToString(value); - break; - case Keywords.CurrentLanguage: - CurrentLanguage = ConvertToString(value); - break; - case Keywords.DataSource: - DataSource = ConvertToString(value); - break; - case Keywords.FailoverPartner: - FailoverPartner = ConvertToString(value); - break; - case Keywords.InitialCatalog: - InitialCatalog = ConvertToString(value); - break; - // case Keywords.NamedConnection: NamedConnection = ConvertToString(value); break; - case Keywords.NetworkLibrary: - NetworkLibrary = ConvertToString(value); - break; - case Keywords.Password: - Password = ConvertToString(value); - break; - case Keywords.UserID: - UserID = ConvertToString(value); - break; - case Keywords.TransactionBinding: - TransactionBinding = ConvertToString(value); - break; - case Keywords.TypeSystemVersion: - TypeSystemVersion = ConvertToString(value); - break; - case Keywords.WorkstationID: - WorkstationID = ConvertToString(value); - break; - - case Keywords.CommandTimeout: - CommandTimeout = ConvertToInt32(value); - break; - case Keywords.ConnectTimeout: - ConnectTimeout = ConvertToInt32(value); - break; - case Keywords.LoadBalanceTimeout: - LoadBalanceTimeout = ConvertToInt32(value); - break; - case Keywords.MaxPoolSize: - MaxPoolSize = ConvertToInt32(value); - break; - case Keywords.MinPoolSize: - MinPoolSize = ConvertToInt32(value); - break; - case Keywords.PacketSize: - PacketSize = ConvertToInt32(value); - break; - case Keywords.IntegratedSecurity: - IntegratedSecurity = ConvertToIntegratedSecurity(value); - break; + throw UnsupportedKeyword(keyword); + } - case Keywords.Authentication: - Authentication = ConvertToAuthenticationType(keyword, value); - break; - case Keywords.ColumnEncryptionSetting: - ColumnEncryptionSetting = ConvertToColumnEncryptionSetting(keyword, value); - break; - case Keywords.EnclaveAttestationUrl: - EnclaveAttestationUrl = ConvertToString(value); - break; - case Keywords.AttestationProtocol: - AttestationProtocol = ConvertToAttestationProtocol(keyword, value); - break; - case Keywords.IPAddressPreference: - IPAddressPreference = ConvertToIPAddressPreference(keyword, value); - break; -#if ADONET_CERT_AUTH - case Keywords.Certificate: - Certificate = ConvertToString(value); - break; -#endif - case Keywords.PoolBlockingPeriod: - PoolBlockingPeriod = ConvertToPoolBlockingPeriod(keyword, value); - break; -#pragma warning disable 618 // Obsolete ConnectionReset - case Keywords.ConnectionReset: - ConnectionReset = ConvertToBoolean(value); - break; - // Obsolete ContextConnection - case Keywords.ContextConnection: - ContextConnection = ConvertToBoolean(value); - break; -#pragma warning restore 618 - case Keywords.Encrypt: - Encrypt = ConvertToBoolean(value); - break; - case Keywords.TrustServerCertificate: - TrustServerCertificate = ConvertToBoolean(value); - break; - case Keywords.Enlist: - Enlist = ConvertToBoolean(value); - break; - case Keywords.MultipleActiveResultSets: - MultipleActiveResultSets = ConvertToBoolean(value); - break; - case Keywords.MultiSubnetFailover: - MultiSubnetFailover = ConvertToBoolean(value); - break; - case Keywords.TransparentNetworkIPResolution: - TransparentNetworkIPResolution = ConvertToBoolean(value); - break; - case Keywords.PersistSecurityInfo: - PersistSecurityInfo = ConvertToBoolean(value); - break; - case Keywords.Pooling: - Pooling = ConvertToBoolean(value); - break; - case Keywords.Replication: - Replication = ConvertToBoolean(value); - break; - case Keywords.UserInstance: - UserInstance = ConvertToBoolean(value); - break; - case Keywords.ConnectRetryCount: - ConnectRetryCount = ConvertToInt32(value); - break; - case Keywords.ConnectRetryInterval: - ConnectRetryInterval = ConvertToInt32(value); - break; - - default: - Debug.Fail("unexpected keyword"); - throw ADP.KeywordNotSupported(keyword); - } - } - else - { - Remove(keyword); - } + private void Reset(Keywords index) + { + switch (index) + { + case Keywords.ApplicationIntent: + _applicationIntent = DbConnectionStringDefaults.ApplicationIntent; + break; + case Keywords.ApplicationName: + _applicationName = DbConnectionStringDefaults.ApplicationName; + break; + case Keywords.AttachDBFilename: + _attachDBFilename = DbConnectionStringDefaults.AttachDBFilename; + break; + case Keywords.Authentication: + _authentication = DbConnectionStringDefaults.Authentication; + break; + case Keywords.PoolBlockingPeriod: + _poolBlockingPeriod = DbConnectionStringDefaults.PoolBlockingPeriod; + break; + case Keywords.CommandTimeout: + _commandTimeout = DbConnectionStringDefaults.CommandTimeout; + break; + case Keywords.ConnectTimeout: + _connectTimeout = DbConnectionStringDefaults.ConnectTimeout; + break; + case Keywords.CurrentLanguage: + _currentLanguage = DbConnectionStringDefaults.CurrentLanguage; + break; + case Keywords.DataSource: + _dataSource = DbConnectionStringDefaults.DataSource; + break; + case Keywords.Encrypt: + _encrypt = DbConnectionStringDefaults.Encrypt; + break; + case Keywords.Enlist: + _enlist = DbConnectionStringDefaults.Enlist; + break; + case Keywords.FailoverPartner: + _failoverPartner = DbConnectionStringDefaults.FailoverPartner; + break; + case Keywords.InitialCatalog: + _initialCatalog = DbConnectionStringDefaults.InitialCatalog; + break; + case Keywords.IntegratedSecurity: + _integratedSecurity = DbConnectionStringDefaults.IntegratedSecurity; + break; + case Keywords.LoadBalanceTimeout: + _loadBalanceTimeout = DbConnectionStringDefaults.LoadBalanceTimeout; + break; + case Keywords.MultipleActiveResultSets: + _multipleActiveResultSets = DbConnectionStringDefaults.MultipleActiveResultSets; + break; + case Keywords.MaxPoolSize: + _maxPoolSize = DbConnectionStringDefaults.MaxPoolSize; + break; + case Keywords.MinPoolSize: + _minPoolSize = DbConnectionStringDefaults.MinPoolSize; + break; + case Keywords.MultiSubnetFailover: + _multiSubnetFailover = DbConnectionStringDefaults.MultiSubnetFailover; + break; + case Keywords.PacketSize: + _packetSize = DbConnectionStringDefaults.PacketSize; + break; + case Keywords.Password: + _password = DbConnectionStringDefaults.Password; + break; + case Keywords.PersistSecurityInfo: + _persistSecurityInfo = DbConnectionStringDefaults.PersistSecurityInfo; + break; + case Keywords.Pooling: + _pooling = DbConnectionStringDefaults.Pooling; + break; + case Keywords.ConnectRetryCount: + _connectRetryCount = DbConnectionStringDefaults.ConnectRetryCount; + break; + case Keywords.ConnectRetryInterval: + _connectRetryInterval = DbConnectionStringDefaults.ConnectRetryInterval; + break; + case Keywords.Replication: + _replication = DbConnectionStringDefaults.Replication; + break; + case Keywords.TransactionBinding: + _transactionBinding = DbConnectionStringDefaults.TransactionBinding; + break; + case Keywords.TrustServerCertificate: + _trustServerCertificate = DbConnectionStringDefaults.TrustServerCertificate; + break; + case Keywords.TypeSystemVersion: + _typeSystemVersion = DbConnectionStringDefaults.TypeSystemVersion; + break; + case Keywords.UserID: + _userID = DbConnectionStringDefaults.UserID; + break; + case Keywords.UserInstance: + _userInstance = DbConnectionStringDefaults.UserInstance; + break; + case Keywords.WorkstationID: + _workstationID = DbConnectionStringDefaults.WorkstationID; + break; + case Keywords.ColumnEncryptionSetting: + _columnEncryptionSetting = DbConnectionStringDefaults.ColumnEncryptionSetting; + break; + case Keywords.EnclaveAttestationUrl: + _enclaveAttestationUrl = DbConnectionStringDefaults.EnclaveAttestationUrl; + break; + case Keywords.AttestationProtocol: + _attestationProtocol = DbConnectionStringDefaults.AttestationProtocol; + break; + case Keywords.IPAddressPreference: + _ipAddressPreference = DbConnectionStringDefaults.IPAddressPreference; + break; +#if NETFRAMEWORK + case Keywords.ConnectionReset: + _connectionReset = DbConnectionStringDefaults.ConnectionReset; + break; + case Keywords.ContextConnection: + _contextConnection = DbConnectionStringDefaults.ContextConnection; + break; + case Keywords.TransparentNetworkIPResolution: + _transparentNetworkIPResolution = DbConnectionStringDefaults.TransparentNetworkIPResolution; + break; + case Keywords.NetworkLibrary: + _networkLibrary = DbConnectionStringDefaults.NetworkLibrary; + break; +#if ADONET_CERT_AUTH + case Keywords.Certificate: + _certificate = DbConnectionStringDefaults.Certificate; + break; +#endif +#endif + default: + Debug.Fail("unexpected keyword"); + throw UnsupportedKeyword(s_validKeywords[(int)index]); } } - /// - [DisplayName(DbConnectionStringKeywords.ApplicationIntent)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ApplicationIntent)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public ApplicationIntent ApplicationIntent - { - get { return _applicationIntent; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidApplicationIntentValue(value)) - { - throw ADP.InvalidEnumerationValue(typeof(ApplicationIntent), (int)value); - } + private void SetValue(string keyword, bool value) => base[keyword] = value.ToString(); - SetApplicationIntentValue(value); - _applicationIntent = value; - } + private void SetValue(string keyword, int value) => base[keyword] = value.ToString((System.IFormatProvider)null); + + private void SetValue(string keyword, string value) + { + ADP.CheckArgumentNull(value, keyword); + base[keyword] = value; } - /// - [DisplayName(DbConnectionStringKeywords.ApplicationName)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Context)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ApplicationName)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string ApplicationName + private void SetApplicationIntentValue(ApplicationIntent value) { - get { return _applicationName; } - set - { - SetValue(DbConnectionStringKeywords.ApplicationName, value); - _applicationName = value; - } + Debug.Assert(DbConnectionStringBuilderUtil.IsValidApplicationIntentValue(value), "invalid value for ApplicationIntent"); + base[DbConnectionStringKeywords.ApplicationIntent] = DbConnectionStringBuilderUtil.ApplicationIntentToString(value); } - /// - [DisplayName(DbConnectionStringKeywords.AttachDBFilename)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_AttachDBFilename)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - // TODO: hand off to VS, they derive from FileNameEditor and set the OpenDialogFilter to *.MDF - [Editor("System.Windows.Forms.Design.FileNameEditor, " + AssemblyRef.SystemDesign, "System.Drawing.Design.UITypeEditor, " + AssemblyRef.SystemDrawing)] - public string AttachDBFilename + private void SetColumnEncryptionSettingValue(SqlConnectionColumnEncryptionSetting value) { - get { return _attachDBFilename; } - set - { - SetValue(DbConnectionStringKeywords.AttachDBFilename, value); - _attachDBFilename = value; - } + Debug.Assert(DbConnectionStringBuilderUtil.IsValidColumnEncryptionSetting(value), "Invalid value for SqlConnectionColumnEncryptionSetting"); + base[DbConnectionStringKeywords.ColumnEncryptionSetting] = DbConnectionStringBuilderUtil.ColumnEncryptionSettingToString(value); } - /// - [DisplayName(DbConnectionStringKeywords.PoolBlockingPeriod)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_PoolBlockingPeriod)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public PoolBlockingPeriod PoolBlockingPeriod + private void SetAttestationProtocolValue(SqlConnectionAttestationProtocol value) { - get { return _poolBlockingPeriod; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidPoolBlockingPeriodValue(value)) - { - throw ADP.InvalidEnumerationValue(typeof(PoolBlockingPeriod), (int)value); - } + Debug.Assert(DbConnectionStringBuilderUtil.IsValidAttestationProtocol(value), "Invalid value for SqlConnectionAttestationProtocol"); + base[DbConnectionStringKeywords.AttestationProtocol] = DbConnectionStringBuilderUtil.AttestationProtocolToString(value); + } - SetPoolBlockingPeriodValue(value); - _poolBlockingPeriod = value; - } + private void SetIPAddressPreferenceValue(SqlConnectionIPAddressPreference value) + { + Debug.Assert(DbConnectionStringBuilderUtil.IsValidIPAddressPreference(value), "Invalid value for SqlConnectionIPAddressPreference"); + base[DbConnectionStringKeywords.IPAddressPreference] = DbConnectionStringBuilderUtil.IPAddressPreferenceToString(value); } - /// - [DisplayName(DbConnectionStringKeywords.CommandTimeout)] - [ResCategory(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescription(StringsHelper.ResourceNames.DbCommand_CommandTimeout)] - [RefreshProperties(RefreshProperties.All)] - public int CommandTimeout + private void SetAuthenticationValue(SqlAuthenticationMethod value) { - get { return _commandTimeout; } - set - { - if (value < 0) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.CommandTimeout); - } - SetValue(DbConnectionStringKeywords.CommandTimeout, value); - _commandTimeout = value; - } + Debug.Assert(DbConnectionStringBuilderUtil.IsValidAuthenticationTypeValue(value), "Invalid value for AuthenticationType"); + base[DbConnectionStringKeywords.Authentication] = DbConnectionStringBuilderUtil.AuthenticationTypeToString(value); } - /// - [Browsable(false)] - [DisplayName(DbConnectionStringKeywords.ConnectionReset)] - [Obsolete("ConnectionReset has been deprecated. SqlConnection will ignore the 'connection reset' keyword and always reset the connection.")] // SQLPT 41700 - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ConnectionReset)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool ConnectionReset + private void SetPoolBlockingPeriodValue(PoolBlockingPeriod value) { - get { return _connectionReset; } - set - { - SetValue(DbConnectionStringKeywords.ConnectionReset, value); - _connectionReset = value; - } + Debug.Assert(DbConnectionStringBuilderUtil.IsValidPoolBlockingPeriodValue(value), "Invalid value for PoolBlockingPeriod"); + base[DbConnectionStringKeywords.PoolBlockingPeriod] = DbConnectionStringBuilderUtil.PoolBlockingPeriodToString(value); } - /// - [DisplayName(DbConnectionStringKeywords.ContextConnection)] - [Obsolete("ContextConnection has been deprecated. SqlConnection will ignore the 'Context Connection' keyword.")] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ContextConnection)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool ContextConnection + private Exception UnsupportedKeyword(string keyword) { - get { return _contextConnection; } - set +#if !NETFRAMEWORK + if (s_notSupportedKeywords.Contains(keyword, StringComparer.OrdinalIgnoreCase)) { - SetValue(DbConnectionStringKeywords.ContextConnection, value); - _contextConnection = value; + return SQL.UnsupportedKeyword(keyword); + } + else if (s_notSupportedNetworkLibraryKeywords.Contains(keyword, StringComparer.OrdinalIgnoreCase)) + { + return SQL.NetworkLibraryKeywordNotSupported(); } + else +#endif + return ADP.KeywordNotSupported(keyword); } - /// - [DisplayName(DbConnectionStringKeywords.ConnectTimeout)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ConnectTimeout)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int ConnectTimeout + private sealed class SqlInitialCatalogConverter : StringConverter { - get { return _connectTimeout; } - set + // converter classes should have public ctor + public SqlInitialCatalogConverter() { } + + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => GetStandardValuesSupportedInternal(context); + + private bool GetStandardValuesSupportedInternal(ITypeDescriptorContext context) { - if (value < 0) + // Only say standard values are supported if the connection string has enough + // information set to instantiate a connection and retrieve a list of databases + bool flag = false; + if (context is not null) { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectTimeout); + SqlConnectionStringBuilder constr = (context.Instance as SqlConnectionStringBuilder); + if (constr is not null) + { + if ((0 < constr.DataSource.Length) && (constr.IntegratedSecurity || (0 < constr.UserID.Length))) + { + flag = true; + } + } } - SetValue(DbConnectionStringKeywords.ConnectTimeout, value); - _connectTimeout = value; + return flag; } - } - /// - [DisplayName(DbConnectionStringKeywords.CurrentLanguage)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Initialization)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_CurrentLanguage)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string CurrentLanguage - { - get { return _currentLanguage; } - set - { - SetValue(DbConnectionStringKeywords.CurrentLanguage, value); - _currentLanguage = value; - } - } + // Although theoretically this could be true, some people may want to just type in a name + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) => false; - /// - [DisplayName(DbConnectionStringKeywords.DataSource)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_DataSource)] - [RefreshProperties(RefreshProperties.All)] - [TypeConverter(typeof(SqlDataSourceConverter))] - public string DataSource - { - get { return _dataSource; } - set + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { - SetValue(DbConnectionStringKeywords.DataSource, value); - _dataSource = value; + // There can only be standard values if the connection string is in a state that might + // be able to instantiate a connection + if (GetStandardValuesSupportedInternal(context)) + { + // Create an array list to store the database names + List values = new List(); + + try + { + SqlConnectionStringBuilder constr = (SqlConnectionStringBuilder)context.Instance; + + // Create a connection + using (SqlConnection connection = new SqlConnection()) + { + // Create a basic connection string from current property values + connection.ConnectionString = constr.ConnectionString; + + // Try to open the connection + connection.Open(); + + DataTable databaseTable = connection.GetSchema("DATABASES"); + + foreach (DataRow row in databaseTable.Rows) + { + string dbName = (string)row["database_name"]; + values.Add(dbName); + } + } + } + catch (SqlException e) + { + ADP.TraceExceptionWithoutRethrow(e); + // silently fail + } + + // Return values as a StandardValuesCollection + return new StandardValuesCollection(values); + } + return null; } } - /// - [DisplayName(DbConnectionStringKeywords.Encrypt)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Encrypt)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Encrypt + internal sealed class SqlConnectionStringBuilderConverter : ExpandableObjectConverter { - get { return _encrypt; } - set + // converter classes should have public ctor + public SqlConnectionStringBuilderConverter() { } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { - SetValue(DbConnectionStringKeywords.Encrypt, value); - _encrypt = value; + if (typeof(InstanceDescriptor) == destinationType) + { + return true; + } + return base.CanConvertTo(context, destinationType); } - } - /// - [DisplayName(DbConnectionStringKeywords.ColumnEncryptionSetting)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_ColumnEncryptionSetting)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting - { - get { return _columnEncryptionSetting; } - set + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { - if (!DbConnectionStringBuilderUtil.IsValidColumnEncryptionSetting(value)) + if (destinationType is null) { - throw ADP.InvalidEnumerationValue(typeof(SqlConnectionColumnEncryptionSetting), (int)value); + throw ADP.ArgumentNull(nameof(destinationType)); + } + if (typeof(InstanceDescriptor) == destinationType) + { + SqlConnectionStringBuilder obj = (value as SqlConnectionStringBuilder); + if (obj is not null) + { + return ConvertToInstanceDescriptor(obj); + } } + return base.ConvertTo(context, culture, value, destinationType); + } - SetColumnEncryptionSettingValue(value); - _columnEncryptionSetting = value; + private InstanceDescriptor ConvertToInstanceDescriptor(SqlConnectionStringBuilder options) + { + Type[] ctorParams = new Type[] { typeof(string) }; + object[] ctorValues = new object[] { options.ConnectionString }; + ConstructorInfo ctor = typeof(SqlConnectionStringBuilder).GetConstructor(ctorParams); + return new InstanceDescriptor(ctor, ctorValues); } } - /// - [DisplayName(DbConnectionStringKeywords.EnclaveAttestationUrl)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_EnclaveAttestationUrl)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string EnclaveAttestationUrl +#if NETFRAMEWORK + private sealed class SqlDataSourceConverter : StringConverter { - get { return _enclaveAttestationUrl; } - set + private StandardValuesCollection _standardValues; + + // converter classes should have public ctor + public SqlDataSourceConverter() { } + + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => true; + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) => false; + + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { - SetValue(DbConnectionStringKeywords.EnclaveAttestationUrl, value); - _enclaveAttestationUrl = value; + StandardValuesCollection dataSourceNames = _standardValues; + if (_standardValues is null) + { + // Get the sources rowset for the SQLOLEDB enumerator + DataTable table = SqlClientFactory.Instance.CreateDataSourceEnumerator().GetDataSources(); + string ServerName = typeof(System.Data.Sql.SqlDataSourceEnumerator).GetField("ServerName", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null).ToString(); + string InstanceName = typeof(System.Data.Sql.SqlDataSourceEnumerator).GetField("InstanceName", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null).ToString(); + DataColumn serverName = table.Columns[ServerName]; + DataColumn instanceName = table.Columns[InstanceName]; + DataRowCollection rows = table.Rows; + + string[] serverNames = new string[rows.Count]; + for (int i = 0; i < serverNames.Length; ++i) + { + string server = rows[i][serverName] as string; + string instance = rows[i][instanceName] as string; + if ((instance is null) || (0 == instance.Length) || ("MSSQLSERVER" == instance)) + { + serverNames[i] = server; + } + else + { + serverNames[i] = server + @"\" + instance; + } + } + Array.Sort(serverNames); + + // Create the standard values collection that contains the sources + dataSourceNames = new StandardValuesCollection(serverNames); + _standardValues = dataSourceNames; + } + return dataSourceNames; } } - /// - [DisplayName(DbConnectionStringKeywords.AttestationProtocol)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_AttestationProtocol)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlConnectionAttestationProtocol AttestationProtocol + private sealed class NetworkLibraryConverter : TypeConverter { - get { return _attestationProtocol; } - set + // private const string AppleTalk = "Apple Talk (DBMSADSN)"; Invalid protocals + // private const string BanyanVines = "Banyan VINES (DBMSVINN)"; + // private const string IPXSPX = "NWLink IPX/SPX (DBMSSPXN)"; + // private const string Multiprotocol = "Multiprotocol (DBMSRPCN)"; + private const string NamedPipes = "Named Pipes (DBNMPNTW)"; // valid protocols + private const string SharedMemory = "Shared Memory (DBMSLPCN)"; + private const string TCPIP = "TCP/IP (DBMSSOCN)"; + private const string VIA = "VIA (DBMSGNET)"; + + // these are correctly non-static, property grid will cache an instance + private StandardValuesCollection _standardValues; + + // converter classes should have public ctor + public NetworkLibraryConverter() { } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + // Only know how to convert from a string + => (typeof(string) == sourceType) || base.CanConvertFrom(context, sourceType); + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - if (!DbConnectionStringBuilderUtil.IsValidAttestationProtocol(value)) + string svalue = (value as string); + if (svalue is not null) { - throw ADP.InvalidEnumerationValue(typeof(SqlConnectionAttestationProtocol), (int)value); + svalue = svalue.Trim(); + if (StringComparer.OrdinalIgnoreCase.Equals(svalue, NamedPipes)) + { + return SqlConnectionString.NETLIB.NamedPipes; + } + else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, SharedMemory)) + { + return SqlConnectionString.NETLIB.SharedMemory; + } + else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, TCPIP)) + { + return SqlConnectionString.NETLIB.TCPIP; + } + else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, VIA)) + { + return SqlConnectionString.NETLIB.VIA; + } + else + { + return svalue; + } } - - SetAttestationProtocolValue(value); - _attestationProtocol = value; + return base.ConvertFrom(context, culture, value); } - } - /// - [DisplayName(DbConnectionStringKeywords.IPAddressPreference)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.TCE_DbConnectionString_IPAddressPreference)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlConnectionIPAddressPreference IPAddressPreference - { - get => _ipAddressPreference; - set + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + => (typeof(string) == destinationType) || base.CanConvertTo(context, destinationType); + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { - if (!DbConnectionStringBuilderUtil.IsValidIPAddressPreference(value)) + if ((value is string svalue) && (destinationType == typeof(string))) { - throw ADP.InvalidEnumerationValue(typeof(SqlConnectionIPAddressPreference), (int)value); + return svalue.Trim().ToLower(CultureInfo.InvariantCulture) switch + { + SqlConnectionString.NETLIB.NamedPipes => NamedPipes, + SqlConnectionString.NETLIB.SharedMemory => SharedMemory, + SqlConnectionString.NETLIB.TCPIP => TCPIP, + SqlConnectionString.NETLIB.VIA => VIA, + _ => svalue, + }; } + return base.ConvertTo(context, culture, value, destinationType); + } - SetIPAddressPreferenceValue(value); - _ipAddressPreference = value; + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => true; + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) => false; + + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + { + StandardValuesCollection standardValues = _standardValues; + if (standardValues is null) + { + string[] names = new string[] { + NamedPipes, + SharedMemory, + TCPIP, + VIA, + }; + standardValues = new StandardValuesCollection(names); + _standardValues = standardValues; + } + return standardValues; } } +#else + private static readonly string[] s_notSupportedKeywords = new string[DeprecatedKeywordsCount] { + DbConnectionStringKeywords.ConnectionReset, + DbConnectionStringKeywords.ContextConnection, + DbConnectionStringKeywords.TransactionBinding, + }; - /// - [DisplayName(DbConnectionStringKeywords.TrustServerCertificate)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_TrustServerCertificate)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool TrustServerCertificate + private static readonly string[] s_notSupportedNetworkLibraryKeywords = new string[] { + DbConnectionStringKeywords.NetworkLibrary, + + DbConnectionStringSynonyms.NET, + DbConnectionStringSynonyms.NETWORK + }; +#endif + #endregion //Private Methods + + #region Public APIs + /// + public SqlConnectionStringBuilder() : this(null) { - get { return _trustServerCertificate; } - set - { - SetValue(DbConnectionStringKeywords.TrustServerCertificate, value); - _trustServerCertificate = value; - } } - /// - [DisplayName(DbConnectionStringKeywords.Enlist)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Enlist)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Enlist + /// + public SqlConnectionStringBuilder(string connectionString) : base() { - get { return _enlist; } - set + if (!string.IsNullOrEmpty(connectionString)) { - SetValue(DbConnectionStringKeywords.Enlist, value); - _enlist = value; + ConnectionString = connectionString; } } - /// - [DisplayName(DbConnectionStringKeywords.FailoverPartner)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_FailoverPartner)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - [TypeConverter(typeof(SqlDataSourceConverter))] - public string FailoverPartner + /// + public override object this[string keyword] { - get { return _failoverPartner; } + get => GetAt(GetIndex(keyword)); set { - SetValue(DbConnectionStringKeywords.FailoverPartner, value); - _failoverPartner = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.InitialCatalog)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_InitialCatalog)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - [TypeConverter(typeof(SqlInitialCatalogConverter))] - public string InitialCatalog - { - get { return _initialCatalog; } - set - { - SetValue(DbConnectionStringKeywords.InitialCatalog, value); - _initialCatalog = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.IntegratedSecurity)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_IntegratedSecurity)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool IntegratedSecurity - { - get { return _integratedSecurity; } - set - { - SetValue(DbConnectionStringKeywords.IntegratedSecurity, value); - _integratedSecurity = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.Authentication)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Authentication)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public SqlAuthenticationMethod Authentication - { - get { return _authentication; } - set - { - if (!DbConnectionStringBuilderUtil.IsValidAuthenticationTypeValue(value)) + if (value is not null) { - throw ADP.InvalidEnumerationValue(typeof(SqlAuthenticationMethod), (int)value); - } + Keywords index = GetIndex(keyword); + switch (index) + { + case Keywords.ApplicationIntent: + ApplicationIntent = ConvertToApplicationIntent(keyword, value); + break; + case Keywords.ApplicationName: + ApplicationName = ConvertToString(value); + break; + case Keywords.AttachDBFilename: + AttachDBFilename = ConvertToString(value); + break; + case Keywords.CurrentLanguage: + CurrentLanguage = ConvertToString(value); + break; + case Keywords.DataSource: + DataSource = ConvertToString(value); + break; + case Keywords.FailoverPartner: + FailoverPartner = ConvertToString(value); + break; + case Keywords.InitialCatalog: + InitialCatalog = ConvertToString(value); + break; + case Keywords.Password: + Password = ConvertToString(value); + break; + case Keywords.UserID: + UserID = ConvertToString(value); + break; + case Keywords.TransactionBinding: + TransactionBinding = ConvertToString(value); + break; + case Keywords.TypeSystemVersion: + TypeSystemVersion = ConvertToString(value); + break; + case Keywords.WorkstationID: + WorkstationID = ConvertToString(value); + break; - SetAuthenticationValue(value); - _authentication = value; - } - } + case Keywords.CommandTimeout: + CommandTimeout = ConvertToInt32(value); + break; + case Keywords.ConnectTimeout: + ConnectTimeout = ConvertToInt32(value); + break; + case Keywords.LoadBalanceTimeout: + LoadBalanceTimeout = ConvertToInt32(value); + break; + case Keywords.MaxPoolSize: + MaxPoolSize = ConvertToInt32(value); + break; + case Keywords.MinPoolSize: + MinPoolSize = ConvertToInt32(value); + break; + case Keywords.PacketSize: + PacketSize = ConvertToInt32(value); + break; + case Keywords.IntegratedSecurity: + IntegratedSecurity = ConvertToIntegratedSecurity(value); + break; + case Keywords.Authentication: + Authentication = ConvertToAuthenticationType(keyword, value); + break; + case Keywords.ColumnEncryptionSetting: + ColumnEncryptionSetting = ConvertToColumnEncryptionSetting(keyword, value); + break; + case Keywords.EnclaveAttestationUrl: + EnclaveAttestationUrl = ConvertToString(value); + break; + case Keywords.AttestationProtocol: + AttestationProtocol = ConvertToAttestationProtocol(keyword, value); + break; + case Keywords.IPAddressPreference: + IPAddressPreference = ConvertToIPAddressPreference(keyword, value); + break; + case Keywords.PoolBlockingPeriod: + PoolBlockingPeriod = ConvertToPoolBlockingPeriod(keyword, value); + break; + case Keywords.Encrypt: + Encrypt = ConvertToBoolean(value); + break; + case Keywords.TrustServerCertificate: + TrustServerCertificate = ConvertToBoolean(value); + break; + case Keywords.Enlist: + Enlist = ConvertToBoolean(value); + break; + case Keywords.MultipleActiveResultSets: + MultipleActiveResultSets = ConvertToBoolean(value); + break; + case Keywords.MultiSubnetFailover: + MultiSubnetFailover = ConvertToBoolean(value); + break; + case Keywords.PersistSecurityInfo: + PersistSecurityInfo = ConvertToBoolean(value); + break; + case Keywords.Pooling: + Pooling = ConvertToBoolean(value); + break; + case Keywords.Replication: + Replication = ConvertToBoolean(value); + break; + case Keywords.UserInstance: + UserInstance = ConvertToBoolean(value); + break; + case Keywords.ConnectRetryCount: + ConnectRetryCount = ConvertToInt32(value); + break; + case Keywords.ConnectRetryInterval: + ConnectRetryInterval = ConvertToInt32(value); + break; +#if NETFRAMEWORK +#pragma warning disable 618 // Obsolete properties + case Keywords.ConnectionReset: + ConnectionReset = ConvertToBoolean(value); + break; + case Keywords.ContextConnection: + ContextConnection = ConvertToBoolean(value); + break; +#pragma warning restore 618 + case Keywords.NetworkLibrary: + NetworkLibrary = ConvertToString(value); + break; + case Keywords.TransparentNetworkIPResolution: + TransparentNetworkIPResolution = ConvertToBoolean(value); + break; #if ADONET_CERT_AUTH - [DisplayName(DbConnectionStringKeywords.Certificate)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Certificate)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string Certificate { - get { return _certificate; } - set { - if (!DbConnectionStringBuilderUtil.IsValidCertificateValue(value)) { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.Certificate); + case Keywords.Certificate: + Certificate = ConvertToString(value); + break; +#endif +#endif + default: + Debug.Fail("unexpected keyword"); + throw UnsupportedKeyword(keyword); + } + } + else + { + Remove(keyword); } - - SetValue(DbConnectionStringKeywords.Certificate, value); - _certificate = value; } } -#else - internal string Certificate - { - get { return null; } - } -#endif - /// - [DisplayName(DbConnectionStringKeywords.LoadBalanceTimeout)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_LoadBalanceTimeout)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int LoadBalanceTimeout + /// + [DisplayName(DbConnectionStringKeywords.ApplicationIntent)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Initialization)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_ApplicationIntent)] + [RefreshProperties(RefreshProperties.All)] + public ApplicationIntent ApplicationIntent { - get { return _loadBalanceTimeout; } + get => _applicationIntent; set { - if (value < 0) + if (!DbConnectionStringBuilderUtil.IsValidApplicationIntentValue(value)) { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.LoadBalanceTimeout); + throw ADP.InvalidEnumerationValue(typeof(ApplicationIntent), (int)value); } - SetValue(DbConnectionStringKeywords.LoadBalanceTimeout, value); - _loadBalanceTimeout = value; + + SetApplicationIntentValue(value); + _applicationIntent = value; } } - /// - [DisplayName(DbConnectionStringKeywords.MaxPoolSize)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MaxPoolSize)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int MaxPoolSize + /// + [DisplayName(DbConnectionStringKeywords.ApplicationName)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Context)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_ApplicationName)] + [RefreshProperties(RefreshProperties.All)] + public string ApplicationName { - get { return _maxPoolSize; } + get => _applicationName; set { - if (value < 1) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.MaxPoolSize); - } - SetValue(DbConnectionStringKeywords.MaxPoolSize, value); - _maxPoolSize = value; + SetValue(DbConnectionStringKeywords.ApplicationName, value); + _applicationName = value; } } - /// - [DisplayName(DbConnectionStringKeywords.ConnectRetryCount)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_ConnectionResilency)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ConnectRetryCount)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int ConnectRetryCount + /// + [DisplayName(DbConnectionStringKeywords.AttachDBFilename)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_AttachDBFilename)] + [Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [RefreshProperties(RefreshProperties.All)] + public string AttachDBFilename { - get { return _connectRetryCount; } + get => _attachDBFilename; set { - if ((value < 0) || (value > 255)) - { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectRetryCount); - } - SetValue(DbConnectionStringKeywords.ConnectRetryCount, value); - _connectRetryCount = value; + SetValue(DbConnectionStringKeywords.AttachDBFilename, value); + _attachDBFilename = value; } } - /// - [DisplayName(DbConnectionStringKeywords.ConnectRetryInterval)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_ConnectionResilency)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_ConnectRetryInterval)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int ConnectRetryInterval + /// + [DisplayName(DbConnectionStringKeywords.CommandTimeout)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Initialization)] + [ResDescription(StringsHelper.ResourceNames.DbCommand_CommandTimeout)] + [RefreshProperties(RefreshProperties.All)] + public int CommandTimeout { - get { return _connectRetryInterval; } + get => _commandTimeout; set { - if ((value < 1) || (value > 60)) + if (value < 0) { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectRetryInterval); + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.CommandTimeout); } - SetValue(DbConnectionStringKeywords.ConnectRetryInterval, value); - _connectRetryInterval = value; + SetValue(DbConnectionStringKeywords.CommandTimeout, value); + _commandTimeout = value; } } - - /// - [DisplayName(DbConnectionStringKeywords.MinPoolSize)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MinPoolSize)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int MinPoolSize + /// + [DisplayName(DbConnectionStringKeywords.ConnectTimeout)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Initialization)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_ConnectTimeout)] + [RefreshProperties(RefreshProperties.All)] + public int ConnectTimeout { - get { return _minPoolSize; } + get => _connectTimeout; set { if (value < 0) { - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.MinPoolSize); + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectTimeout); } - SetValue(DbConnectionStringKeywords.MinPoolSize, value); - _minPoolSize = value; + SetValue(DbConnectionStringKeywords.ConnectTimeout, value); + _connectTimeout = value; } } - /// - [DisplayName(DbConnectionStringKeywords.MultipleActiveResultSets)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MultipleActiveResultSets)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool MultipleActiveResultSets + /// + [DisplayName(DbConnectionStringKeywords.CurrentLanguage)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Initialization)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_CurrentLanguage)] + [RefreshProperties(RefreshProperties.All)] + public string CurrentLanguage { - get { return _multipleActiveResultSets; } + get => _currentLanguage; set { - SetValue(DbConnectionStringKeywords.MultipleActiveResultSets, value); - _multipleActiveResultSets = value; + SetValue(DbConnectionStringKeywords.CurrentLanguage, value); + _currentLanguage = value; } } - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Justification = "Reviewed and Approved by UE")] - [DisplayName(DbConnectionStringKeywords.MultiSubnetFailover)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_MultiSubnetFailover)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool MultiSubnetFailover + /// + [DisplayName(DbConnectionStringKeywords.DataSource)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_DataSource)] + [RefreshProperties(RefreshProperties.All)] +#if NETFRAMEWORK + [TypeConverter(typeof(SqlDataSourceConverter))] +#endif + public string DataSource { - get { return _multiSubnetFailover; } + get => _dataSource; set { - SetValue(DbConnectionStringKeywords.MultiSubnetFailover, value); - _multiSubnetFailover = value; + SetValue(DbConnectionStringKeywords.DataSource, value); + _dataSource = value; } } - /// - [DisplayName(DbConnectionStringKeywords.TransparentNetworkIPResolution)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_TransparentNetworkIPResolution)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool TransparentNetworkIPResolution - { - get { return _transparentNetworkIPResolution; } - set - { - SetValue(DbConnectionStringKeywords.TransparentNetworkIPResolution, value); - _transparentNetworkIPResolution = value; - } - } - /* - [DisplayName(DbConnectionStringKeywords.NamedConnection)] - [ResCategoryAttribute(ResHelper.ResourceNames.DataCategory_NamedConnectionString)] - [ResDescriptionAttribute(ResHelper.ResourceNames.DbConnectionString_NamedConnection)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - [TypeConverter(typeof(NamedConnectionStringConverter))] - public string NamedConnection { - get { return _namedConnection; } - set { - SetValue(DbConnectionStringKeywords.NamedConnection, value); - _namedConnection = value; - } - } - */ - /// - [DisplayName(DbConnectionStringKeywords.NetworkLibrary)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_NetworkLibrary)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - [TypeConverter(typeof(NetworkLibraryConverter))] - public string NetworkLibrary + /// + [DisplayName(DbConnectionStringKeywords.Encrypt)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_Encrypt)] + [RefreshProperties(RefreshProperties.All)] + public bool Encrypt { - get { return _networkLibrary; } + get => _encrypt; set { - if (null != value) - { - switch (value.Trim().ToLower(CultureInfo.InvariantCulture)) - { - case SqlConnectionString.NETLIB.AppleTalk: - value = SqlConnectionString.NETLIB.AppleTalk; - break; - case SqlConnectionString.NETLIB.BanyanVines: - value = SqlConnectionString.NETLIB.BanyanVines; - break; - case SqlConnectionString.NETLIB.IPXSPX: - value = SqlConnectionString.NETLIB.IPXSPX; - break; - case SqlConnectionString.NETLIB.Multiprotocol: - value = SqlConnectionString.NETLIB.Multiprotocol; - break; - case SqlConnectionString.NETLIB.NamedPipes: - value = SqlConnectionString.NETLIB.NamedPipes; - break; - case SqlConnectionString.NETLIB.SharedMemory: - value = SqlConnectionString.NETLIB.SharedMemory; - break; - case SqlConnectionString.NETLIB.TCPIP: - value = SqlConnectionString.NETLIB.TCPIP; - break; - case SqlConnectionString.NETLIB.VIA: - value = SqlConnectionString.NETLIB.VIA; - break; - default: - throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.NetworkLibrary); - } - } - SetValue(DbConnectionStringKeywords.NetworkLibrary, value); - _networkLibrary = value; + SetValue(DbConnectionStringKeywords.Encrypt, value); + _encrypt = value; } } - /// - [DisplayName(DbConnectionStringKeywords.PacketSize)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_PacketSize)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public int PacketSize + /// + [DisplayName(DbConnectionStringKeywords.ColumnEncryptionSetting)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.TCE_DbConnectionString_ColumnEncryptionSetting)] + [RefreshProperties(RefreshProperties.All)] + public SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting { - get { return _packetSize; } + get => _columnEncryptionSetting; set { - if ((value < TdsEnums.MIN_PACKET_SIZE) || (TdsEnums.MAX_PACKET_SIZE < value)) + if (!DbConnectionStringBuilderUtil.IsValidColumnEncryptionSetting(value)) { - throw SQL.InvalidPacketSizeValue(); + throw ADP.InvalidEnumerationValue(typeof(SqlConnectionColumnEncryptionSetting), (int)value); } - SetValue(DbConnectionStringKeywords.PacketSize, value); - _packetSize = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.Password)] - [PasswordPropertyTextAttribute(true)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Password)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string Password - { - get { return _password; } - set - { - SetValue(DbConnectionStringKeywords.Password, value); - _password = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.PersistSecurityInfo)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_PersistSecurityInfo)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool PersistSecurityInfo - { - get { return _persistSecurityInfo; } - set - { - SetValue(DbConnectionStringKeywords.PersistSecurityInfo, value); - _persistSecurityInfo = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.Pooling)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Pooling)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Pooling)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Pooling - { - get { return _pooling; } - set - { - SetValue(DbConnectionStringKeywords.Pooling, value); - _pooling = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.Replication)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Replication)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_Replication)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool Replication - { - get { return _replication; } - set - { - SetValue(DbConnectionStringKeywords.Replication, value); - _replication = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.TransactionBinding)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_TransactionBinding)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string TransactionBinding - { - get { return _transactionBinding; } - set - { - SetValue(DbConnectionStringKeywords.TransactionBinding, value); - _transactionBinding = value; - } - } - - /// - [DisplayName(DbConnectionStringKeywords.TypeSystemVersion)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Advanced)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_TypeSystemVersion)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string TypeSystemVersion - { - get { return _typeSystemVersion; } - set - { - SetValue(DbConnectionStringKeywords.TypeSystemVersion, value); - _typeSystemVersion = value; - } - } - /// - [DisplayName(DbConnectionStringKeywords.UserID)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Security)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_UserID)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string UserID - { - get { return _userID; } - set - { - SetValue(DbConnectionStringKeywords.UserID, value); - _userID = value; + SetColumnEncryptionSettingValue(value); + _columnEncryptionSetting = value; } } - /// - [DisplayName(DbConnectionStringKeywords.UserInstance)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Source)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_UserInstance)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public bool UserInstance + /// + [DisplayName(DbConnectionStringKeywords.EnclaveAttestationUrl)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.TCE_DbConnectionString_EnclaveAttestationUrl)] + [RefreshProperties(RefreshProperties.All)] + public string EnclaveAttestationUrl { - get { return _userInstance; } + get => _enclaveAttestationUrl; set { - SetValue(DbConnectionStringKeywords.UserInstance, value); - _userInstance = value; + SetValue(DbConnectionStringKeywords.EnclaveAttestationUrl, value); + _enclaveAttestationUrl = value; } } - /// - [DisplayName(DbConnectionStringKeywords.WorkstationID)] - [ResCategoryAttribute(StringsHelper.ResourceNames.DataCategory_Context)] - [ResDescriptionAttribute(StringsHelper.ResourceNames.DbConnectionString_WorkstationID)] - [RefreshPropertiesAttribute(RefreshProperties.All)] - public string WorkstationID + /// + [DisplayName(DbConnectionStringKeywords.AttestationProtocol)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.TCE_DbConnectionString_AttestationProtocol)] + [RefreshProperties(RefreshProperties.All)] + public SqlConnectionAttestationProtocol AttestationProtocol { - get { return _workstationID; } + get => _attestationProtocol; set { - SetValue(DbConnectionStringKeywords.WorkstationID, value); - _workstationID = value; - } - } - - /// - public override bool IsFixedSize - { - get - { - return true; - } - } - - /// - public override ICollection Keys => new ReadOnlyCollection(_validKeywords); - - /// - public override ICollection Values - { - get - { - // written this way so if the ordering of Keywords & _validKeywords changes - // this is one less place to maintain - object[] values = new object[_validKeywords.Length]; - for (int i = 0; i < values.Length; ++i) + if (!DbConnectionStringBuilderUtil.IsValidAttestationProtocol(value)) { - values[i] = GetAt((Keywords)i); + throw ADP.InvalidEnumerationValue(typeof(SqlConnectionAttestationProtocol), (int)value); } - return new ReadOnlyCollection(values); - } - } - /// - public override void Clear() - { - base.Clear(); - for (int i = 0; i < _validKeywords.Length; ++i) - { - Reset((Keywords)i); - } - } - - /// - public override bool ContainsKey(string keyword) - { - ADP.CheckArgumentNull(keyword, "keyword"); - return _keywords.ContainsKey(keyword); - } - - private static bool ConvertToBoolean(object value) - { - return DbConnectionStringBuilderUtil.ConvertToBoolean(value); - } - private static int ConvertToInt32(object value) - { - return DbConnectionStringBuilderUtil.ConvertToInt32(value); - } - private static bool ConvertToIntegratedSecurity(object value) - { - return DbConnectionStringBuilderUtil.ConvertToIntegratedSecurity(value); - } - private static string ConvertToString(object value) - { - return DbConnectionStringBuilderUtil.ConvertToString(value); - } - private static ApplicationIntent ConvertToApplicationIntent(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToApplicationIntent(keyword, value); - } - private static SqlAuthenticationMethod ConvertToAuthenticationType(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToAuthenticationType(keyword, value); - } - private static PoolBlockingPeriod ConvertToPoolBlockingPeriod(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToPoolBlockingPeriod(keyword, value); - } - - /// - /// Convert to SqlConnectionColumnEncryptionSetting. - /// - /// - /// - private static SqlConnectionColumnEncryptionSetting ConvertToColumnEncryptionSetting(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToColumnEncryptionSetting(keyword, value); - } - - /// - /// Convert to SqlConnectionAttestationProtocol - /// - /// - /// - /// - private static SqlConnectionAttestationProtocol ConvertToAttestationProtocol(string keyword, object value) - { - return DbConnectionStringBuilderUtil.ConvertToAttestationProtocol(keyword, value); - } - - /// - /// Convert to SqlConnectionIPAddressPreference - /// - /// - /// - private static SqlConnectionIPAddressPreference ConvertToIPAddressPreference(string keyword, object value) - => DbConnectionStringBuilderUtil.ConvertToIPAddressPreference(keyword, value); - - private object GetAt(Keywords index) - { - switch (index) - { - case Keywords.ApplicationIntent: - return this.ApplicationIntent; - case Keywords.ApplicationName: - return ApplicationName; - case Keywords.AttachDBFilename: - return AttachDBFilename; - case Keywords.PoolBlockingPeriod: - return PoolBlockingPeriod; - case Keywords.ConnectTimeout: - return ConnectTimeout; - case Keywords.CommandTimeout: - return CommandTimeout; -#pragma warning disable 618 // Obsolete ConnectionReset - case Keywords.ConnectionReset: - return ConnectionReset; - // Obsolete ConnectionReset - case Keywords.ContextConnection: - return ContextConnection; -#pragma warning restore 618 - case Keywords.CurrentLanguage: - return CurrentLanguage; - case Keywords.DataSource: - return DataSource; - case Keywords.Encrypt: - return Encrypt; - case Keywords.Enlist: - return Enlist; - case Keywords.FailoverPartner: - return FailoverPartner; - case Keywords.InitialCatalog: - return InitialCatalog; - case Keywords.IntegratedSecurity: - return IntegratedSecurity; - case Keywords.LoadBalanceTimeout: - return LoadBalanceTimeout; - case Keywords.MultipleActiveResultSets: - return MultipleActiveResultSets; - case Keywords.MaxPoolSize: - return MaxPoolSize; - case Keywords.MinPoolSize: - return MinPoolSize; - case Keywords.MultiSubnetFailover: - return MultiSubnetFailover; - case Keywords.TransparentNetworkIPResolution: - return TransparentNetworkIPResolution; - // case Keywords.NamedConnection: return NamedConnection; - case Keywords.NetworkLibrary: - return NetworkLibrary; - case Keywords.PacketSize: - return PacketSize; - case Keywords.Password: - return Password; - case Keywords.PersistSecurityInfo: - return PersistSecurityInfo; - case Keywords.Pooling: - return Pooling; - case Keywords.Replication: - return Replication; - case Keywords.TransactionBinding: - return TransactionBinding; - case Keywords.TrustServerCertificate: - return TrustServerCertificate; - case Keywords.TypeSystemVersion: - return TypeSystemVersion; - case Keywords.UserID: - return UserID; - case Keywords.UserInstance: - return UserInstance; - case Keywords.WorkstationID: - return WorkstationID; - case Keywords.ConnectRetryCount: - return ConnectRetryCount; - case Keywords.ConnectRetryInterval: - return ConnectRetryInterval; - case Keywords.Authentication: - return Authentication; - case Keywords.ColumnEncryptionSetting: - return ColumnEncryptionSetting; - case Keywords.EnclaveAttestationUrl: - return EnclaveAttestationUrl; - case Keywords.AttestationProtocol: - return AttestationProtocol; - case Keywords.IPAddressPreference: - return IPAddressPreference; -#if ADONET_CERT_AUTH - case Keywords.Certificate: return Certificate; -#endif - default: - Debug.Fail("unexpected keyword"); - throw ADP.KeywordNotSupported(_validKeywords[(int)index]); + SetAttestationProtocolValue(value); + _attestationProtocol = value; } } - private Keywords GetIndex(string keyword) - { - ADP.CheckArgumentNull(keyword, "keyword"); - Keywords index; - if (_keywords.TryGetValue(keyword, out index)) - { - return index; - } - throw ADP.KeywordNotSupported(keyword); - } - /* - protected override void GetProperties(Hashtable propertyDescriptors) { - foreach(PropertyDescriptor reflected in TypeDescriptor.GetProperties(this, true)) { - bool refreshOnChange = false; - bool isReadonly = false; - string displayName = reflected.DisplayName; - - // 'Password' & 'User ID' will be readonly if 'Integrated Security' is true - if (DbConnectionStringKeywords.IntegratedSecurity == displayName) { - refreshOnChange = true; - isReadonly = reflected.IsReadOnly; - } - else if ((DbConnectionStringKeywords.Password == displayName) || - (DbConnectionStringKeywords.UserID == displayName)) { - isReadonly = IntegratedSecurity; - } - else { - continue; - } - Attribute[] attributes = GetAttributesFromCollection(reflected.Attributes); - DbConnectionStringBuilderDescriptor descriptor = new DbConnectionStringBuilderDescriptor(reflected.Name, - reflected.ComponentType, reflected.PropertyType, isReadonly, attributes); - descriptor.RefreshOnChange = refreshOnChange; - propertyDescriptors[displayName] = descriptor; - } - base.GetProperties(propertyDescriptors); - } - */ - /// - public override bool Remove(string keyword) + /// + [DisplayName(DbConnectionStringKeywords.IPAddressPreference)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.TCE_DbConnectionString_IPAddressPreference)] + [RefreshProperties(RefreshProperties.All)] + public SqlConnectionIPAddressPreference IPAddressPreference { - ADP.CheckArgumentNull(keyword, "keyword"); - Keywords index; - if (_keywords.TryGetValue(keyword, out index)) + get => _ipAddressPreference; + set { - if (base.Remove(_validKeywords[(int)index])) + if (!DbConnectionStringBuilderUtil.IsValidIPAddressPreference(value)) { - Reset(index); - return true; + throw ADP.InvalidEnumerationValue(typeof(SqlConnectionIPAddressPreference), (int)value); } - } - return false; - } - private void Reset(Keywords index) - { - switch (index) - { - case Keywords.ApplicationIntent: - _applicationIntent = DbConnectionStringDefaults.ApplicationIntent; - break; - case Keywords.ApplicationName: - _applicationName = DbConnectionStringDefaults.ApplicationName; - break; - case Keywords.AttachDBFilename: - _attachDBFilename = DbConnectionStringDefaults.AttachDBFilename; - break; - case Keywords.Authentication: - _authentication = DbConnectionStringDefaults.Authentication; - break; - case Keywords.PoolBlockingPeriod: - _poolBlockingPeriod = DbConnectionStringDefaults.PoolBlockingPeriod; - break; -#if ADONET_CERT_AUTH - case Keywords.Certificate: - _certificate = DbConnectionStringDefaults.Certificate; - break; -#endif - case Keywords.ConnectTimeout: - _connectTimeout = DbConnectionStringDefaults.ConnectTimeout; - break; - case Keywords.CommandTimeout: - _commandTimeout = DbConnectionStringDefaults.CommandTimeout; - break; - case Keywords.ConnectionReset: - _connectionReset = DbConnectionStringDefaults.ConnectionReset; - break; - case Keywords.ContextConnection: - _contextConnection = DbConnectionStringDefaults.ContextConnection; - break; - case Keywords.CurrentLanguage: - _currentLanguage = DbConnectionStringDefaults.CurrentLanguage; - break; - case Keywords.DataSource: - _dataSource = DbConnectionStringDefaults.DataSource; - break; - case Keywords.Encrypt: - _encrypt = DbConnectionStringDefaults.Encrypt; - break; - case Keywords.Enlist: - _enlist = DbConnectionStringDefaults.Enlist; - break; - case Keywords.FailoverPartner: - _failoverPartner = DbConnectionStringDefaults.FailoverPartner; - break; - case Keywords.InitialCatalog: - _initialCatalog = DbConnectionStringDefaults.InitialCatalog; - break; - case Keywords.IntegratedSecurity: - _integratedSecurity = DbConnectionStringDefaults.IntegratedSecurity; - break; - case Keywords.LoadBalanceTimeout: - _loadBalanceTimeout = DbConnectionStringDefaults.LoadBalanceTimeout; - break; - case Keywords.MultipleActiveResultSets: - _multipleActiveResultSets = DbConnectionStringDefaults.MultipleActiveResultSets; - break; - case Keywords.MaxPoolSize: - _maxPoolSize = DbConnectionStringDefaults.MaxPoolSize; - break; - case Keywords.MinPoolSize: - _minPoolSize = DbConnectionStringDefaults.MinPoolSize; - break; - case Keywords.MultiSubnetFailover: - _multiSubnetFailover = DbConnectionStringDefaults.MultiSubnetFailover; - break; - case Keywords.TransparentNetworkIPResolution: - _transparentNetworkIPResolution = DbConnectionStringDefaults.TransparentNetworkIPResolution; - break; - // case Keywords.NamedConnection: - // _namedConnection = DbConnectionStringDefaults.NamedConnection; - // break; - case Keywords.NetworkLibrary: - _networkLibrary = DbConnectionStringDefaults.NetworkLibrary; - break; - case Keywords.PacketSize: - _packetSize = DbConnectionStringDefaults.PacketSize; - break; - case Keywords.Password: - _password = DbConnectionStringDefaults.Password; - break; - case Keywords.PersistSecurityInfo: - _persistSecurityInfo = DbConnectionStringDefaults.PersistSecurityInfo; - break; - case Keywords.Pooling: - _pooling = DbConnectionStringDefaults.Pooling; - break; - case Keywords.ConnectRetryCount: - _connectRetryCount = DbConnectionStringDefaults.ConnectRetryCount; - break; - case Keywords.ConnectRetryInterval: - _connectRetryInterval = DbConnectionStringDefaults.ConnectRetryInterval; - break; - case Keywords.Replication: - _replication = DbConnectionStringDefaults.Replication; - break; - case Keywords.TransactionBinding: - _transactionBinding = DbConnectionStringDefaults.TransactionBinding; - break; - case Keywords.TrustServerCertificate: - _trustServerCertificate = DbConnectionStringDefaults.TrustServerCertificate; - break; - case Keywords.TypeSystemVersion: - _typeSystemVersion = DbConnectionStringDefaults.TypeSystemVersion; - break; - case Keywords.UserID: - _userID = DbConnectionStringDefaults.UserID; - break; - case Keywords.UserInstance: - _userInstance = DbConnectionStringDefaults.UserInstance; - break; - case Keywords.WorkstationID: - _workstationID = DbConnectionStringDefaults.WorkstationID; - break; - case Keywords.ColumnEncryptionSetting: - _columnEncryptionSetting = DbConnectionStringDefaults.ColumnEncryptionSetting; - break; - case Keywords.EnclaveAttestationUrl: - _enclaveAttestationUrl = DbConnectionStringDefaults.EnclaveAttestationUrl; - break; - case Keywords.AttestationProtocol: - _attestationProtocol = DbConnectionStringDefaults.AttestationProtocol; - break; - case Keywords.IPAddressPreference: - _ipAddressPreference = DbConnectionStringDefaults.IPAddressPreference; - break; - default: - Debug.Fail("unexpected keyword"); - throw ADP.KeywordNotSupported(_validKeywords[(int)index]); + SetIPAddressPreferenceValue(value); + _ipAddressPreference = value; } } - private void SetValue(string keyword, bool value) + /// + [DisplayName(DbConnectionStringKeywords.TrustServerCertificate)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_TrustServerCertificate)] + [RefreshProperties(RefreshProperties.All)] + public bool TrustServerCertificate { - base[keyword] = value.ToString((System.IFormatProvider)null); + get => _trustServerCertificate; + set + { + SetValue(DbConnectionStringKeywords.TrustServerCertificate, value); + _trustServerCertificate = value; + } } - private void SetValue(string keyword, int value) + + /// + [DisplayName(DbConnectionStringKeywords.Enlist)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Pooling)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_Enlist)] + [RefreshProperties(RefreshProperties.All)] + public bool Enlist { - base[keyword] = value.ToString((System.IFormatProvider)null); + get => _enlist; + set + { + SetValue(DbConnectionStringKeywords.Enlist, value); + _enlist = value; + } } - private void SetValue(string keyword, string value) + + /// + [DisplayName(DbConnectionStringKeywords.FailoverPartner)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_FailoverPartner)] + [RefreshProperties(RefreshProperties.All)] +#if NETFRAMEWORK + [TypeConverter(typeof(SqlDataSourceConverter))] +#endif + public string FailoverPartner { - ADP.CheckArgumentNull(value, keyword); - base[keyword] = value; + get => _failoverPartner; + set + { + SetValue(DbConnectionStringKeywords.FailoverPartner, value); + _failoverPartner = value; + } } - private void SetApplicationIntentValue(ApplicationIntent value) + + /// + [DisplayName(DbConnectionStringKeywords.InitialCatalog)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_InitialCatalog)] + [RefreshProperties(RefreshProperties.All)] + [TypeConverter(typeof(SqlInitialCatalogConverter))] + public string InitialCatalog { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidApplicationIntentValue(value), "Invalid value for ApplicationIntent"); - base[DbConnectionStringKeywords.ApplicationIntent] = DbConnectionStringBuilderUtil.ApplicationIntentToString(value); + get => _initialCatalog; + set + { + SetValue(DbConnectionStringKeywords.InitialCatalog, value); + _initialCatalog = value; + } } - private void SetPoolBlockingPeriodValue(PoolBlockingPeriod value) + + /// + [DisplayName(DbConnectionStringKeywords.IntegratedSecurity)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_IntegratedSecurity)] + [RefreshProperties(RefreshProperties.All)] + public bool IntegratedSecurity { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidPoolBlockingPeriodValue(value), "Invalid value for PoolBlockingPeriod"); - base[DbConnectionStringKeywords.PoolBlockingPeriod] = DbConnectionStringBuilderUtil.PoolBlockingPeriodToString(value); + get => _integratedSecurity; + set + { + SetValue(DbConnectionStringKeywords.IntegratedSecurity, value); + _integratedSecurity = value; + } } - private void SetAuthenticationValue(SqlAuthenticationMethod value) + + /// + [DisplayName(DbConnectionStringKeywords.Authentication)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_Authentication)] + [RefreshProperties(RefreshProperties.All)] + public SqlAuthenticationMethod Authentication { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidAuthenticationTypeValue(value), "Invalid value for AuthenticationType"); - base[DbConnectionStringKeywords.Authentication] = DbConnectionStringBuilderUtil.AuthenticationTypeToString(value); + get => _authentication; + set + { + if (!DbConnectionStringBuilderUtil.IsValidAuthenticationTypeValue(value)) + { + throw ADP.InvalidEnumerationValue(typeof(SqlAuthenticationMethod), (int)value); + } + + SetAuthenticationValue(value); + _authentication = value; + } } - private void SetColumnEncryptionSettingValue(SqlConnectionColumnEncryptionSetting value) + + /// + [DisplayName(DbConnectionStringKeywords.LoadBalanceTimeout)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Pooling)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_LoadBalanceTimeout)] + [RefreshProperties(RefreshProperties.All)] + public int LoadBalanceTimeout { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidColumnEncryptionSetting(value), "Invalid value for SqlConnectionColumnEncryptionSetting"); - base[DbConnectionStringKeywords.ColumnEncryptionSetting] = DbConnectionStringBuilderUtil.ColumnEncryptionSettingToString(value); + get => _loadBalanceTimeout; + set + { + if (value < 0) + { + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.LoadBalanceTimeout); + } + SetValue(DbConnectionStringKeywords.LoadBalanceTimeout, value); + _loadBalanceTimeout = value; + } } - private void SetAttestationProtocolValue(SqlConnectionAttestationProtocol value) + /// + [DisplayName(DbConnectionStringKeywords.MaxPoolSize)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Pooling)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_MaxPoolSize)] + [RefreshProperties(RefreshProperties.All)] + public int MaxPoolSize { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidAttestationProtocol(value), "Invalid value for SqlConnectionAttestationProtocol"); - base[DbConnectionStringKeywords.AttestationProtocol] = DbConnectionStringBuilderUtil.AttestationProtocolToString(value); + get => _maxPoolSize; + set + { + if (value < 1) + { + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.MaxPoolSize); + } + SetValue(DbConnectionStringKeywords.MaxPoolSize, value); + _maxPoolSize = value; + } } - private void SetIPAddressPreferenceValue(SqlConnectionIPAddressPreference value) + /// + [DisplayName(DbConnectionStringKeywords.ConnectRetryCount)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_ConnectionResilency)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_ConnectRetryCount)] + [RefreshProperties(RefreshProperties.All)] + public int ConnectRetryCount { - Debug.Assert(DbConnectionStringBuilderUtil.IsValidIPAddressPreference(value), "Invalid value for SqlConnectionIPAddressPreference"); - base[DbConnectionStringKeywords.IPAddressPreference] = DbConnectionStringBuilderUtil.IPAddressPreferenceToString(value); + get => _connectRetryCount; + set + { + if ((value < 0) || (value > 255)) + { + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectRetryCount); + } + SetValue(DbConnectionStringKeywords.ConnectRetryCount, value); + _connectRetryCount = value; + } } - - /// - public override bool ShouldSerialize(string keyword) + /// + [DisplayName(DbConnectionStringKeywords.ConnectRetryInterval)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_ConnectionResilency)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_ConnectRetryInterval)] + [RefreshProperties(RefreshProperties.All)] + public int ConnectRetryInterval { - ADP.CheckArgumentNull(keyword, "keyword"); - Keywords index; - return _keywords.TryGetValue(keyword, out index) && base.ShouldSerialize(_validKeywords[(int)index]); + get => _connectRetryInterval; + set + { + if ((value < 1) || (value > 60)) + { + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.ConnectRetryInterval); + } + SetValue(DbConnectionStringKeywords.ConnectRetryInterval, value); + _connectRetryInterval = value; + } } - /// - public override bool TryGetValue(string keyword, out object value) + + /// + [DisplayName(DbConnectionStringKeywords.MinPoolSize)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Pooling)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_MinPoolSize)] + [RefreshProperties(RefreshProperties.All)] + public int MinPoolSize { - Keywords index; - if (_keywords.TryGetValue(keyword, out index)) + get => _minPoolSize; + set { - value = GetAt(index); - return true; + if (value < 0) + { + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.MinPoolSize); + } + SetValue(DbConnectionStringKeywords.MinPoolSize, value); + _minPoolSize = value; } - value = null; - return false; } - private sealed class NetworkLibraryConverter : TypeConverter + /// + [DisplayName(DbConnectionStringKeywords.MultipleActiveResultSets)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Advanced)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_MultipleActiveResultSets)] + [RefreshProperties(RefreshProperties.All)] + public bool MultipleActiveResultSets { - // private const string AppleTalk = "Apple Talk (DBMSADSN)"; Invalid protocals - // private const string BanyanVines = "Banyan VINES (DBMSVINN)"; - // private const string IPXSPX = "NWLink IPX/SPX (DBMSSPXN)"; - // private const string Multiprotocol = "Multiprotocol (DBMSRPCN)"; - private const string NamedPipes = "Named Pipes (DBNMPNTW)"; // valid protocols - private const string SharedMemory = "Shared Memory (DBMSLPCN)"; - private const string TCPIP = "TCP/IP (DBMSSOCN)"; - private const string VIA = "VIA (DBMSGNET)"; - - // these are correctly non-static, property grid will cache an instance - private StandardValuesCollection _standardValues; - - // converter classes should have public ctor - public NetworkLibraryConverter() + get => _multipleActiveResultSets; + set { + SetValue(DbConnectionStringKeywords.MultipleActiveResultSets, value); + _multipleActiveResultSets = value; } + } - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + /// + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Justification = "Reviewed and Approved by UE")] + [DisplayName(DbConnectionStringKeywords.MultiSubnetFailover)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_MultiSubnetFailover)] + [RefreshProperties(RefreshProperties.All)] + public bool MultiSubnetFailover + { + get => _multiSubnetFailover; + set { - // Only know how to convert from a string - return ((typeof(string) == sourceType) || base.CanConvertFrom(context, sourceType)); + SetValue(DbConnectionStringKeywords.MultiSubnetFailover, value); + _multiSubnetFailover = value; } + } - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + /// + [DisplayName(DbConnectionStringKeywords.PacketSize)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Advanced)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_PacketSize)] + [RefreshProperties(RefreshProperties.All)] + public int PacketSize + { + get => _packetSize; + set { - string svalue = (value as string); - if (null != svalue) + if ((value < TdsEnums.MIN_PACKET_SIZE) || (TdsEnums.MAX_PACKET_SIZE < value)) { - svalue = svalue.Trim(); - if (StringComparer.OrdinalIgnoreCase.Equals(svalue, NamedPipes)) - { - return SqlConnectionString.NETLIB.NamedPipes; - } - else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, SharedMemory)) - { - return SqlConnectionString.NETLIB.SharedMemory; - } - else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, TCPIP)) - { - return SqlConnectionString.NETLIB.TCPIP; - } - else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, VIA)) - { - return SqlConnectionString.NETLIB.VIA; - } - else - { - return svalue; - } + throw SQL.InvalidPacketSizeValue(); } - return base.ConvertFrom(context, culture, value); + SetValue(DbConnectionStringKeywords.PacketSize, value); + _packetSize = value; } + } - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + /// + [DisplayName(DbConnectionStringKeywords.Password)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_Password)] + [PasswordPropertyText(true)] + [RefreshProperties(RefreshProperties.All)] + public string Password + { + get => _password; + set { - return ((typeof(string) == destinationType) || base.CanConvertTo(context, destinationType)); + SetValue(DbConnectionStringKeywords.Password, value); + _password = value; } + } - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) + /// + [DisplayName(DbConnectionStringKeywords.PersistSecurityInfo)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_PersistSecurityInfo)] + [RefreshProperties(RefreshProperties.All)] + public bool PersistSecurityInfo + { + get => _persistSecurityInfo; + set { - string svalue = (value as string); - if ((null != svalue) && (destinationType == typeof(string))) + SetValue(DbConnectionStringKeywords.PersistSecurityInfo, value); + _persistSecurityInfo = value; + } + } + + /// + [DisplayName(DbConnectionStringKeywords.PoolBlockingPeriod)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Pooling)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_PoolBlockingPeriod)] + [RefreshProperties(RefreshProperties.All)] + public PoolBlockingPeriod PoolBlockingPeriod + { + get => _poolBlockingPeriod; + set + { + if (!DbConnectionStringBuilderUtil.IsValidPoolBlockingPeriodValue(value)) { - switch (svalue.Trim().ToLower(CultureInfo.InvariantCulture)) - { - case SqlConnectionString.NETLIB.NamedPipes: - return NamedPipes; - case SqlConnectionString.NETLIB.SharedMemory: - return SharedMemory; - case SqlConnectionString.NETLIB.TCPIP: - return TCPIP; - case SqlConnectionString.NETLIB.VIA: - return VIA; - default: - return svalue; - } + throw ADP.InvalidEnumerationValue(typeof(PoolBlockingPeriod), (int)value); } - return base.ConvertTo(context, culture, value, destinationType); + + SetPoolBlockingPeriodValue(value); + _poolBlockingPeriod = value; + } + } + + /// + [DisplayName(DbConnectionStringKeywords.Pooling)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Pooling)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_Pooling)] + [RefreshProperties(RefreshProperties.All)] + public bool Pooling + { + get => _pooling; + set + { + SetValue(DbConnectionStringKeywords.Pooling, value); + _pooling = value; } + } - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + /// + [DisplayName(DbConnectionStringKeywords.Replication)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Replication)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_Replication)] + [RefreshProperties(RefreshProperties.All)] + public bool Replication + { + get => _replication; + set { - return true; + SetValue(DbConnectionStringKeywords.Replication, value); + _replication = value; } + } - public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + /// + [DisplayName(DbConnectionStringKeywords.TransactionBinding)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Advanced)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_TransactionBinding)] + [RefreshProperties(RefreshProperties.All)] + public string TransactionBinding + { + get => _transactionBinding; + set { - return false; + SetValue(DbConnectionStringKeywords.TransactionBinding, value); + _transactionBinding = value; } + } - public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + /// + [DisplayName(DbConnectionStringKeywords.TypeSystemVersion)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Advanced)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_TypeSystemVersion)] + [RefreshProperties(RefreshProperties.All)] + public string TypeSystemVersion + { + get => _typeSystemVersion; + set { - - SqlConnectionStringBuilder constr = null; - if (null != context) - { - constr = (context.Instance as SqlConnectionStringBuilder); - } - - StandardValuesCollection standardValues = _standardValues; - if (null == standardValues) - { - string[] names = new string[] { - NamedPipes, - SharedMemory, - TCPIP, - VIA, - }; - standardValues = new StandardValuesCollection(names); - _standardValues = standardValues; - } - return standardValues; + SetValue(DbConnectionStringKeywords.TypeSystemVersion, value); + _typeSystemVersion = value; } } - private sealed class SqlDataSourceConverter : StringConverter + /// + [DisplayName(DbConnectionStringKeywords.UserID)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_UserID)] + [RefreshProperties(RefreshProperties.All)] + public string UserID { - - private StandardValuesCollection _standardValues; - - // converter classes should have public ctor - public SqlDataSourceConverter() + get => _userID; + set { + SetValue(DbConnectionStringKeywords.UserID, value); + _userID = value; } + } - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + /// + [DisplayName(DbConnectionStringKeywords.UserInstance)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_UserInstance)] + [RefreshProperties(RefreshProperties.All)] + public bool UserInstance + { + get => _userInstance; + set { - return true; + SetValue(DbConnectionStringKeywords.UserInstance, value); + _userInstance = value; } + } - public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + /// + [DisplayName(DbConnectionStringKeywords.WorkstationID)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Context)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_WorkstationID)] + [RefreshProperties(RefreshProperties.All)] + public string WorkstationID + { + get => _workstationID; + set { - return false; + SetValue(DbConnectionStringKeywords.WorkstationID, value); + _workstationID = value; } + } - public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) - { - StandardValuesCollection dataSourceNames = _standardValues; - if (null == _standardValues) - { - // Get the sources rowset for the SQLOLEDB enumerator - DataTable table = SqlClientFactory.Instance.CreateDataSourceEnumerator().GetDataSources(); - string ServerName = typeof(System.Data.Sql.SqlDataSourceEnumerator).GetField("ServerName", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null).ToString(); - string InstanceName = typeof(System.Data.Sql.SqlDataSourceEnumerator).GetField("InstanceName", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null).ToString(); - DataColumn serverName = table.Columns[ServerName]; - DataColumn instanceName = table.Columns[InstanceName]; - DataRowCollection rows = table.Rows; + /// + public override bool IsFixedSize => true; - string[] serverNames = new string[rows.Count]; - for (int i = 0; i < serverNames.Length; ++i) - { - string server = rows[i][serverName] as string; - string instance = rows[i][instanceName] as string; - if ((null == instance) || (0 == instance.Length) || ("MSSQLSERVER" == instance)) - { - serverNames[i] = server; - } - else - { - serverNames[i] = server + @"\" + instance; - } - } - Array.Sort(serverNames); + /// + public override ICollection Keys => new ReadOnlyCollection(s_validKeywords); - // Create the standard values collection that contains the sources - dataSourceNames = new StandardValuesCollection(serverNames); - _standardValues = dataSourceNames; + /// + public override ICollection Values + { + get + { + // written this way so if the ordering of Keywords & _validKeywords changes + // this is one less place to maintain + object[] values = new object[s_validKeywords.Length]; + for (int i = 0; i < values.Length; ++i) + { + values[i] = GetAt((Keywords)i); } - return dataSourceNames; + return new ReadOnlyCollection(values); } } - private sealed class SqlInitialCatalogConverter : StringConverter + /// + public override void Clear() { - - // converter classes should have public ctor - public SqlInitialCatalogConverter() + base.Clear(); + for (int i = 0; i < s_validKeywords.Length; ++i) { + Reset((Keywords)i); } + } - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) - { - return GetStandardValuesSupportedInternal(context); - } + /// + public override bool ContainsKey(string keyword) + { + ADP.CheckArgumentNull(keyword, nameof(keyword)); + return s_keywords.ContainsKey(keyword); + } - private bool GetStandardValuesSupportedInternal(ITypeDescriptorContext context) + /// + public override bool Remove(string keyword) + { + ADP.CheckArgumentNull(keyword, nameof(keyword)); + if (s_keywords.TryGetValue(keyword, out Keywords index)) { - // Only say standard values are supported if the connection string has enough - // information set to instantiate a connection and retrieve a list of databases - bool flag = false; - if (null != context) + if (base.Remove(s_validKeywords[(int)index])) { - SqlConnectionStringBuilder constr = (context.Instance as SqlConnectionStringBuilder); - if (null != constr) - { - if ((0 < constr.DataSource.Length) && (constr.IntegratedSecurity || (0 < constr.UserID.Length))) - { - flag = true; - } - } + Reset(index); + return true; } - return flag; } + return false; + } + + /// + public override bool ShouldSerialize(string keyword) + { + ADP.CheckArgumentNull(keyword, nameof(keyword)); + return s_keywords.TryGetValue(keyword, out Keywords index) && base.ShouldSerialize(s_validKeywords[(int)index]); + } - public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + /// + public override bool TryGetValue(string keyword, out object value) + { + if (s_keywords.TryGetValue(keyword, out Keywords index)) { - // Although theoretically this could be true, some people may want to just type in a name - return false; + value = GetAt(index); + return true; } + value = null; + return false; + } - public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) +#if NETFRAMEWORK + /// + [Browsable(false)] + [DisplayName(DbConnectionStringKeywords.ConnectionReset)] + [Obsolete("ConnectionReset has been deprecated. SqlConnection will ignore the 'connection reset' keyword and always reset the connection.")] // SQLPT 41700 + [ResCategory(StringsHelper.ResourceNames.DataCategory_Pooling)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_ConnectionReset)] + [RefreshProperties(RefreshProperties.All)] + public bool ConnectionReset + { + get => _connectionReset; + set { - // There can only be standard values if the connection string is in a state that might - // be able to instantiate a connection - if (GetStandardValuesSupportedInternal(context)) - { - - // Create an array list to store the database names - List values = new List(); - - try - { - SqlConnectionStringBuilder constr = (SqlConnectionStringBuilder)context.Instance; - - // Create a connection - using (SqlConnection connection = new SqlConnection()) - { - - // Create a basic connection string from current property values - connection.ConnectionString = constr.ConnectionString; - - // Try to open the connection - connection.Open(); - - DataTable databaseTable = connection.GetSchema("DATABASES"); - - foreach (DataRow row in databaseTable.Rows) - { - string dbName = (string)row["database_name"]; - values.Add(dbName); - } - } - } - catch (SqlException e) - { - ADP.TraceExceptionWithoutRethrow(e); - // silently fail - } - - // Return values as a StandardValuesCollection - return new StandardValuesCollection(values); - } - return null; + SetValue(DbConnectionStringKeywords.ConnectionReset, value); + _connectionReset = value; } } - sealed internal class SqlConnectionStringBuilderConverter : ExpandableObjectConverter + /// + [DisplayName(DbConnectionStringKeywords.ContextConnection)] + [Obsolete("ContextConnection has been deprecated. SqlConnection will ignore the 'Context Connection' keyword.")] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_ContextConnection)] + [RefreshProperties(RefreshProperties.All)] + public bool ContextConnection { - - // converter classes should have public ctor - public SqlConnectionStringBuilderConverter() + get => _contextConnection; + set { + SetValue(DbConnectionStringKeywords.ContextConnection, value); + _contextConnection = value; } + } - override public bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + /// + [DisplayName(DbConnectionStringKeywords.TransparentNetworkIPResolution)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Source)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_TransparentNetworkIPResolution)] + [RefreshProperties(RefreshProperties.All)] + public bool TransparentNetworkIPResolution + { + get => _transparentNetworkIPResolution; + set { - if (typeof(System.ComponentModel.Design.Serialization.InstanceDescriptor) == destinationType) - { - return true; - } - return base.CanConvertTo(context, destinationType); + SetValue(DbConnectionStringKeywords.TransparentNetworkIPResolution, value); + _transparentNetworkIPResolution = value; } + } - override public object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + /// + [DisplayName(DbConnectionStringKeywords.NetworkLibrary)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Advanced)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_NetworkLibrary)] + [RefreshProperties(RefreshProperties.All)] + [TypeConverter(typeof(NetworkLibraryConverter))] + public string NetworkLibrary + { + get => _networkLibrary; + set { - if (destinationType == null) - { - throw ADP.ArgumentNull("destinationType"); - } - if (typeof(System.ComponentModel.Design.Serialization.InstanceDescriptor) == destinationType) + if (value is not null) { - SqlConnectionStringBuilder obj = (value as SqlConnectionStringBuilder); - if (null != obj) + value = value.Trim().ToLower(CultureInfo.InvariantCulture) switch { - return ConvertToInstanceDescriptor(obj); - } + SqlConnectionString.NETLIB.AppleTalk => SqlConnectionString.NETLIB.AppleTalk, + SqlConnectionString.NETLIB.BanyanVines => SqlConnectionString.NETLIB.BanyanVines, + SqlConnectionString.NETLIB.IPXSPX => SqlConnectionString.NETLIB.IPXSPX, + SqlConnectionString.NETLIB.Multiprotocol => SqlConnectionString.NETLIB.Multiprotocol, + SqlConnectionString.NETLIB.NamedPipes => SqlConnectionString.NETLIB.NamedPipes, + SqlConnectionString.NETLIB.SharedMemory => SqlConnectionString.NETLIB.SharedMemory, + SqlConnectionString.NETLIB.TCPIP => SqlConnectionString.NETLIB.TCPIP, + SqlConnectionString.NETLIB.VIA => SqlConnectionString.NETLIB.VIA, + _ => throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.NetworkLibrary), + }; } - return base.ConvertTo(context, culture, value, destinationType); + SetValue(DbConnectionStringKeywords.NetworkLibrary, value); + _networkLibrary = value; } + } - private System.ComponentModel.Design.Serialization.InstanceDescriptor ConvertToInstanceDescriptor(SqlConnectionStringBuilder options) - { - Type[] ctorParams = new Type[] { typeof(string) }; - object[] ctorValues = new object[] { options.ConnectionString }; - System.Reflection.ConstructorInfo ctor = typeof(SqlConnectionStringBuilder).GetConstructor(ctorParams); - return new System.ComponentModel.Design.Serialization.InstanceDescriptor(ctor, ctorValues); +#if ADONET_CERT_AUTH + [DisplayName(DbConnectionStringKeywords.Certificate)] + [ResCategory(StringsHelper.ResourceNames.DataCategory_Security)] + [ResDescription(StringsHelper.ResourceNames.DbConnectionString_Certificate)] + [RefreshProperties(RefreshProperties.All)] + public string Certificate { + get => _certificate; + set { + if (!DbConnectionStringBuilderUtil.IsValidCertificateValue(value)) { + throw ADP.InvalidConnectionOptionValue(DbConnectionStringKeywords.Certificate); + } + + SetValue(DbConnectionStringKeywords.Certificate, value); + _certificate = value; } } +#endif +#endif + #endregion // Public APIs } - }