1 //------------------------------------------------------------------------------
2 // <copyright file="DbConnectionStringBuilder.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">[....]</owner>
6 // <owner current="true" primary="false">[....]</owner>
7 //------------------------------------------------------------------------------
10 using System.Collections;
11 using System.Collections.Generic;
12 using System.ComponentModel;
14 using System.Data.Common;
15 using System.Diagnostics;
16 using System.Globalization;
17 using System.Runtime.Serialization;
18 using System.Security.Permissions;
20 using System.Text.RegularExpressions;
21 using System.Data.SqlClient;
23 namespace System.Data.Common {
26 internal sealed class NamedConnectionStringConverter : StringConverter {
28 public NamedConnectionStringConverter() {
31 public override bool GetStandardValuesSupported(ITypeDescriptorContext context) {
35 public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) {
36 // Although theoretically this could be true, some people may want to just type in a name
40 public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) {
41 StandardValuesCollection standardValues = null;
42 if (null != context) {
43 DbConnectionStringBuilder instance = (context.Instance as DbConnectionStringBuilder);
44 if (null != instance) {
45 string myProviderName = instance.GetType().Namespace;
47 List<string> myConnectionNames = new List<string>();
48 foreach(System.Configuration.ConnectionStringSetting setting in System.Configuration.ConfigurationManager.ConnectionStrings) {
49 if (myProviderName.EndsWith(setting.ProviderName)) {
50 myConnectionNames.Add(setting.ConnectionName);
53 standardValues = new StandardValuesCollection(myConnectionNames);
56 return standardValues;
61 internal class DbConnectionStringBuilderDescriptor : PropertyDescriptor {
62 private Type _componentType;
63 private Type _propertyType;
64 private bool _isReadOnly;
65 private bool _refreshOnChange;
67 internal DbConnectionStringBuilderDescriptor(string propertyName, Type componentType, Type propertyType, bool isReadOnly, Attribute[] attributes) : base(propertyName, attributes) {
68 //Bid.Trace("<comm.DbConnectionStringBuilderDescriptor|INFO> propertyName='%ls', propertyType='%ls'\n", propertyName, propertyType.Name);
69 _componentType = componentType;
70 _propertyType = propertyType;
71 _isReadOnly = isReadOnly;
74 internal bool RefreshOnChange {
76 return _refreshOnChange;
79 _refreshOnChange = value;
83 public override Type ComponentType {
85 return _componentType;
88 public override bool IsReadOnly {
93 public override Type PropertyType {
98 public override bool CanResetValue(object component) {
99 DbConnectionStringBuilder builder = (component as DbConnectionStringBuilder);
100 return ((null != builder) && builder.ShouldSerialize(DisplayName));
102 public override object GetValue(object component) {
103 DbConnectionStringBuilder builder = (component as DbConnectionStringBuilder);
104 if (null != builder) {
106 if (builder.TryGetValue(DisplayName, out value)) {
112 public override void ResetValue(object component) {
113 DbConnectionStringBuilder builder = (component as DbConnectionStringBuilder);
114 if (null != builder) {
115 builder.Remove(DisplayName);
117 if (RefreshOnChange) {
118 builder.ClearPropertyDescriptors();
122 public override void SetValue(object component, object value) {
123 DbConnectionStringBuilder builder = (component as DbConnectionStringBuilder);
124 if (null != builder) {
125 // via the editor, empty string does a defacto Reset
126 if ((typeof(string) == PropertyType) && String.Empty.Equals(value)) {
129 builder[DisplayName] = value;
131 if (RefreshOnChange) {
132 builder.ClearPropertyDescriptors();
136 public override bool ShouldSerializeValue(object component) {
137 DbConnectionStringBuilder builder = (component as DbConnectionStringBuilder);
138 return ((null != builder) && builder.ShouldSerialize(DisplayName));
143 internal sealed class ReadOnlyCollection<T> : System.Collections.ICollection, ICollection<T> {
146 internal ReadOnlyCollection(T[] items) {
149 for(int i = 0; i < items.Length; ++i) {
150 Debug.Assert(null != items[i], "null item");
155 public void CopyTo(T[] array, int arrayIndex) {
156 Array.Copy(_items, 0, array, arrayIndex, _items.Length);
159 void System.Collections.ICollection.CopyTo(Array array, int arrayIndex) {
160 Array.Copy(_items, 0, array, arrayIndex, _items.Length);
164 IEnumerator<T> IEnumerable<T>.GetEnumerator() {
165 return new Enumerator<T>(_items);
168 public System.Collections.IEnumerator GetEnumerator() {
169 return new Enumerator<T>(_items);
172 bool System.Collections.ICollection.IsSynchronized {
173 get { return false; }
176 Object System.Collections.ICollection.SyncRoot {
177 get { return _items; }
180 bool ICollection<T>.IsReadOnly {
184 void ICollection<T>.Add(T value) {
185 throw new NotSupportedException();
188 void ICollection<T>.Clear() {
189 throw new NotSupportedException();
192 bool ICollection<T>.Contains(T value) {
193 return Array.IndexOf(_items, value) >= 0;
196 bool ICollection<T>.Remove(T value) {
197 throw new NotSupportedException();
201 get { return _items.Length; }
205 internal struct Enumerator<K> : IEnumerator<K>, System.Collections.IEnumerator { // based on List<T>.Enumerator
209 internal Enumerator(K[] items) {
214 public void Dispose() {
217 public bool MoveNext() {
218 return (++_index < _items.Length);
223 return _items[_index];
227 Object System.Collections.IEnumerator.Current {
229 return _items[_index];
233 void System.Collections.IEnumerator.Reset() {
239 internal static class DbConnectionStringBuilderUtil
242 internal static bool ConvertToBoolean(object value)
244 Debug.Assert(null != value, "ConvertToBoolean(null)");
245 string svalue = (value as string);
248 if (StringComparer.OrdinalIgnoreCase.Equals(svalue, "true") || StringComparer.OrdinalIgnoreCase.Equals(svalue, "yes"))
250 else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, "false") || StringComparer.OrdinalIgnoreCase.Equals(svalue, "no"))
254 string tmp = svalue.Trim(); // Remove leading & trailing white space.
255 if (StringComparer.OrdinalIgnoreCase.Equals(tmp, "true") || StringComparer.OrdinalIgnoreCase.Equals(tmp, "yes"))
257 else if (StringComparer.OrdinalIgnoreCase.Equals(tmp, "false") || StringComparer.OrdinalIgnoreCase.Equals(tmp, "no"))
260 return Boolean.Parse(svalue);
264 return ((IConvertible)value).ToBoolean(CultureInfo.InvariantCulture);
266 catch (InvalidCastException e)
268 throw ADP.ConvertFailed(value.GetType(), typeof(Boolean), e);
272 internal static bool ConvertToIntegratedSecurity(object value)
274 Debug.Assert(null != value, "ConvertToIntegratedSecurity(null)");
275 string svalue = (value as string);
278 if (StringComparer.OrdinalIgnoreCase.Equals(svalue, "sspi") || StringComparer.OrdinalIgnoreCase.Equals(svalue, "true") || StringComparer.OrdinalIgnoreCase.Equals(svalue, "yes"))
280 else if (StringComparer.OrdinalIgnoreCase.Equals(svalue, "false") || StringComparer.OrdinalIgnoreCase.Equals(svalue, "no"))
284 string tmp = svalue.Trim(); // Remove leading & trailing white space.
285 if (StringComparer.OrdinalIgnoreCase.Equals(tmp, "sspi") || StringComparer.OrdinalIgnoreCase.Equals(tmp, "true") || StringComparer.OrdinalIgnoreCase.Equals(tmp, "yes"))
287 else if (StringComparer.OrdinalIgnoreCase.Equals(tmp, "false") || StringComparer.OrdinalIgnoreCase.Equals(tmp, "no"))
290 return Boolean.Parse(svalue);
294 return ((IConvertible)value).ToBoolean(CultureInfo.InvariantCulture);
296 catch (InvalidCastException e)
298 throw ADP.ConvertFailed(value.GetType(), typeof(Boolean), e);
302 internal static int ConvertToInt32(object value)
306 return ((IConvertible)value).ToInt32(CultureInfo.InvariantCulture);
308 catch (InvalidCastException e)
310 throw ADP.ConvertFailed(value.GetType(), typeof(Int32), e);
314 internal static string ConvertToString(object value)
318 return ((IConvertible)value).ToString(CultureInfo.InvariantCulture);
320 catch (InvalidCastException e)
322 throw ADP.ConvertFailed(value.GetType(), typeof(String), e);
326 const string ApplicationIntentReadWriteString = "ReadWrite";
327 const string ApplicationIntentReadOnlyString = "ReadOnly";
329 internal static bool TryConvertToApplicationIntent(string value, out ApplicationIntent result)
331 Debug.Assert(Enum.GetNames(typeof(ApplicationIntent)).Length == 2, "ApplicationIntent enum has changed, update needed");
332 Debug.Assert(null != value, "TryConvertToApplicationIntent(null,...)");
334 if (StringComparer.OrdinalIgnoreCase.Equals(value, ApplicationIntentReadOnlyString))
336 result = ApplicationIntent.ReadOnly;
339 else if (StringComparer.OrdinalIgnoreCase.Equals(value, ApplicationIntentReadWriteString))
341 result = ApplicationIntent.ReadWrite;
346 result = DbConnectionStringDefaults.ApplicationIntent;
351 internal static bool IsValidApplicationIntentValue(ApplicationIntent value)
353 Debug.Assert(Enum.GetNames(typeof(ApplicationIntent)).Length == 2, "ApplicationIntent enum has changed, update needed");
354 return value == ApplicationIntent.ReadOnly || value == ApplicationIntent.ReadWrite;
357 internal static string ApplicationIntentToString(ApplicationIntent value)
359 Debug.Assert(IsValidApplicationIntentValue(value));
360 if (value == ApplicationIntent.ReadOnly)
362 return ApplicationIntentReadOnlyString;
366 return ApplicationIntentReadWriteString;
371 /// This method attempts to convert the given value tp ApplicationIntent enum. The algorithm is:
372 /// * if the value is from type string, it will be matched against ApplicationIntent enum names only, using ordinal, case-insensitive comparer
373 /// * if the value is from type ApplicationIntent, it will be used as is
374 /// * if the value is from integral type (SByte, Int16, Int32, Int64, Byte, UInt16, UInt32, or UInt64), it will be converted to enum
375 /// * if the value is another enum or any other type, it will be blocked with an appropriate ArgumentException
377 /// in any case above, if the conerted value is out of valid range, the method raises ArgumentOutOfRangeException.
379 /// <returns>applicaiton intent value in the valid range</returns>
380 internal static ApplicationIntent ConvertToApplicationIntent(string keyword, object value)
382 Debug.Assert(null != value, "ConvertToApplicationIntent(null)");
383 string sValue = (value as string);
384 ApplicationIntent result;
387 // We could use Enum.TryParse<ApplicationIntent> here, but it accepts value combinations like
388 // "ReadOnly, ReadWrite" which are unwelcome here
389 // Also, Enum.TryParse is 100x slower than plain StringComparer.OrdinalIgnoreCase.Equals method.
391 if (TryConvertToApplicationIntent(sValue, out result))
396 // try again after remove leading & trailing whitespaces.
397 sValue = sValue.Trim();
398 if (TryConvertToApplicationIntent(sValue, out result))
403 // string values must be valid
404 throw ADP.InvalidConnectionOptionValue(keyword);
408 // the value is not string, try other options
409 ApplicationIntent eValue;
411 if (value is ApplicationIntent)
413 // quick path for the most common case
414 eValue = (ApplicationIntent)value;
416 else if (value.GetType().IsEnum)
418 // explicitly block scenarios in which user tries to use wrong enum types, like:
419 // builder["ApplicationIntent"] = EnvironmentVariableTarget.Process;
420 // workaround: explicitly cast non-ApplicationIntent enums to int
421 throw ADP.ConvertFailed(value.GetType(), typeof(ApplicationIntent), null);
427 // Enum.ToObject allows only integral and enum values (enums are blocked above), rasing ArgumentException for the rest
428 eValue = (ApplicationIntent)Enum.ToObject(typeof(ApplicationIntent), value);
430 catch (ArgumentException e)
432 // to be consistent with the messages we send in case of wrong type usage, replace
433 // the error with our exception, and keep the original one as inner one for troubleshooting
434 throw ADP.ConvertFailed(value.GetType(), typeof(ApplicationIntent), e);
438 // ensure value is in valid range
439 if (IsValidApplicationIntentValue(eValue))
445 throw ADP.InvalidEnumerationValue(typeof(ApplicationIntent), (int)eValue);
450 const string SqlPasswordString = "Sql Password";
451 const string ActiveDirectoryPasswordString = "Active Directory Password";
452 const string ActiveDirectoryIntegratedString = "Active Directory Integrated";
454 internal static bool TryConvertToAuthenticationType(string value, out SqlAuthenticationMethod result)
456 Debug.Assert(Enum.GetNames(typeof(SqlAuthenticationMethod)).Length == 4, "SqlAuthenticationMethod enum has changed, update needed");
458 bool isSuccess = false;
460 if (StringComparer.InvariantCultureIgnoreCase.Equals(value, SqlPasswordString))
462 result = SqlAuthenticationMethod.SqlPassword;
465 else if (StringComparer.InvariantCultureIgnoreCase.Equals(value, ActiveDirectoryPasswordString))
467 result = SqlAuthenticationMethod.ActiveDirectoryPassword;
470 else if (StringComparer.InvariantCultureIgnoreCase.Equals(value, ActiveDirectoryIntegratedString))
472 result = SqlAuthenticationMethod.ActiveDirectoryIntegrated;
477 result = DbConnectionStringDefaults.Authentication;
483 /// Column Encryption Setting.
485 const string ColumnEncryptionSettingEnabledString = "Enabled";
486 const string ColumnEncryptionSettingDisabledString = "Disabled";
489 /// Convert a string value to the corresponding SqlConnectionColumnEncryptionSetting.
491 /// <param name="value"></param>
492 /// <param name="result"></param>
493 /// <returns></returns>
494 internal static bool TryConvertToColumnEncryptionSetting(string value, out SqlConnectionColumnEncryptionSetting result) {
495 bool isSuccess = false;
497 if (StringComparer.InvariantCultureIgnoreCase.Equals(value, ColumnEncryptionSettingEnabledString)) {
498 result = SqlConnectionColumnEncryptionSetting.Enabled;
501 else if (StringComparer.InvariantCultureIgnoreCase.Equals(value, ColumnEncryptionSettingDisabledString)) {
502 result = SqlConnectionColumnEncryptionSetting.Disabled;
506 result = DbConnectionStringDefaults.ColumnEncryptionSetting;
513 /// Is it a valid connection level column encryption setting ?
515 /// <param name="value"></param>
516 /// <returns></returns>
517 internal static bool IsValidColumnEncryptionSetting(SqlConnectionColumnEncryptionSetting value) {
518 Debug.Assert(Enum.GetNames(typeof(SqlConnectionColumnEncryptionSetting)).Length == 2, "SqlConnectionColumnEncryptionSetting enum has changed, update needed");
519 return value == SqlConnectionColumnEncryptionSetting.Enabled || value == SqlConnectionColumnEncryptionSetting.Disabled;
523 /// Convert connection level column encryption setting value to string.
525 /// <param name="value"></param>
526 /// <returns></returns>
527 internal static string ColumnEncryptionSettingToString(SqlConnectionColumnEncryptionSetting value) {
528 Debug.Assert(IsValidColumnEncryptionSetting(value), "value is not a valid connection level column encryption setting.");
531 case SqlConnectionColumnEncryptionSetting.Enabled:
532 return ColumnEncryptionSettingEnabledString;
533 case SqlConnectionColumnEncryptionSetting.Disabled:
534 return ColumnEncryptionSettingDisabledString;
541 internal static bool IsValidAuthenticationTypeValue(SqlAuthenticationMethod value) {
542 Debug.Assert(Enum.GetNames(typeof(SqlAuthenticationMethod)).Length == 4, "SqlAuthenticationMethod enum has changed, update needed");
543 return value == SqlAuthenticationMethod.SqlPassword
544 || value == SqlAuthenticationMethod.ActiveDirectoryPassword
545 || value == SqlAuthenticationMethod.ActiveDirectoryIntegrated
546 || value == SqlAuthenticationMethod.NotSpecified;
549 internal static string AuthenticationTypeToString(SqlAuthenticationMethod value)
551 Debug.Assert(IsValidAuthenticationTypeValue(value));
555 case SqlAuthenticationMethod.SqlPassword:
556 return SqlPasswordString;
557 case SqlAuthenticationMethod.ActiveDirectoryPassword:
558 return ActiveDirectoryPasswordString;
559 case SqlAuthenticationMethod.ActiveDirectoryIntegrated:
560 return ActiveDirectoryIntegratedString;
566 internal static SqlAuthenticationMethod ConvertToAuthenticationType(string keyword, object value)
570 return DbConnectionStringDefaults.Authentication;
573 string sValue = (value as string);
574 SqlAuthenticationMethod result;
577 if (TryConvertToAuthenticationType(sValue, out result))
582 // try again after remove leading & trailing whitespaces.
583 sValue = sValue.Trim();
584 if (TryConvertToAuthenticationType(sValue, out result))
589 // string values must be valid
590 throw ADP.InvalidConnectionOptionValue(keyword);
594 // the value is not string, try other options
595 SqlAuthenticationMethod eValue;
597 if (value is SqlAuthenticationMethod)
599 // quick path for the most common case
600 eValue = (SqlAuthenticationMethod)value;
602 else if (value.GetType().IsEnum)
604 // explicitly block scenarios in which user tries to use wrong enum types, like:
605 // builder["ApplicationIntent"] = EnvironmentVariableTarget.Process;
606 // workaround: explicitly cast non-ApplicationIntent enums to int
607 throw ADP.ConvertFailed(value.GetType(), typeof(SqlAuthenticationMethod), null);
613 // Enum.ToObject allows only integral and enum values (enums are blocked above), rasing ArgumentException for the rest
614 eValue = (SqlAuthenticationMethod)Enum.ToObject(typeof(SqlAuthenticationMethod), value);
616 catch (ArgumentException e)
618 // to be consistent with the messages we send in case of wrong type usage, replace
619 // the error with our exception, and keep the original one as inner one for troubleshooting
620 throw ADP.ConvertFailed(value.GetType(), typeof(SqlAuthenticationMethod), e);
624 // ensure value is in valid range
625 if (IsValidAuthenticationTypeValue(eValue))
631 throw ADP.InvalidEnumerationValue(typeof(SqlAuthenticationMethod), (int)eValue);
637 /// Convert the provided value to a SqlConnectionColumnEncryptionSetting.
639 /// <param name="keyword"></param>
640 /// <param name="value"></param>
641 /// <returns></returns>
642 internal static SqlConnectionColumnEncryptionSetting ConvertToColumnEncryptionSetting(string keyword, object value) {
644 return DbConnectionStringDefaults.ColumnEncryptionSetting;
647 string sValue = (value as string);
648 SqlConnectionColumnEncryptionSetting result;
649 if (null != sValue) {
650 if (TryConvertToColumnEncryptionSetting(sValue, out result)) {
654 // try again after remove leading & trailing whitespaces.
655 sValue = sValue.Trim();
656 if (TryConvertToColumnEncryptionSetting(sValue, out result)) {
660 // string values must be valid
661 throw ADP.InvalidConnectionOptionValue(keyword);
664 // the value is not string, try other options
665 SqlConnectionColumnEncryptionSetting eValue;
667 if (value is SqlConnectionColumnEncryptionSetting) {
668 // quick path for the most common case
669 eValue = (SqlConnectionColumnEncryptionSetting)value;
671 else if (value.GetType().IsEnum) {
672 // explicitly block scenarios in which user tries to use wrong enum types, like:
673 // builder["SqlConnectionColumnEncryptionSetting"] = EnvironmentVariableTarget.Process;
674 // workaround: explicitly cast non-SqlConnectionColumnEncryptionSetting enums to int
675 throw ADP.ConvertFailed(value.GetType(), typeof(SqlConnectionColumnEncryptionSetting), null);
679 // Enum.ToObject allows only integral and enum values (enums are blocked above), rasing ArgumentException for the rest
680 eValue = (SqlConnectionColumnEncryptionSetting)Enum.ToObject(typeof(SqlConnectionColumnEncryptionSetting), value);
682 catch (ArgumentException e) {
683 // to be consistent with the messages we send in case of wrong type usage, replace
684 // the error with our exception, and keep the original one as inner one for troubleshooting
685 throw ADP.ConvertFailed(value.GetType(), typeof(SqlConnectionColumnEncryptionSetting), e);
689 // ensure value is in valid range
690 if (IsValidColumnEncryptionSetting(eValue)) {
694 throw ADP.InvalidEnumerationValue(typeof(SqlConnectionColumnEncryptionSetting), (int)eValue);
700 internal static class DbConnectionStringDefaults {
702 // internal const string NamedConnection = "";
705 internal const string Driver = "";
706 internal const string Dsn = "";
709 internal const bool AdoNetPooler = false;
710 internal const string FileName = "";
711 internal const int OleDbServices = ~(/*DBPROPVAL_OS_AGR_AFTERSESSION*/0x00000008 | /*DBPROPVAL_OS_CLIENTCURSOR*/0x00000004); // -13
712 internal const string Provider = "";
715 internal const bool Unicode = false;
716 internal const bool OmitOracleConnectionName = false;
719 internal const ApplicationIntent ApplicationIntent = System.Data.SqlClient.ApplicationIntent.ReadWrite;
720 internal const string ApplicationName = ".Net SqlClient Data Provider";
721 internal const bool AsynchronousProcessing = false;
722 internal const string AttachDBFilename = "";
723 internal const int ConnectTimeout = 15;
724 internal const bool ConnectionReset = true;
725 internal const bool ContextConnection = false;
726 internal const string CurrentLanguage = "";
727 internal const string DataSource = "";
728 internal const bool Encrypt = false;
729 internal const bool Enlist = true;
730 internal const string FailoverPartner = "";
731 internal const string InitialCatalog = "";
732 internal const bool IntegratedSecurity = false;
733 internal const int LoadBalanceTimeout = 0; // default of 0 means don't use
734 internal const bool MultipleActiveResultSets = false;
735 internal const bool MultiSubnetFailover = false;
736 internal const bool TransparentNetworkIPResolution = true;
737 internal const int MaxPoolSize = 100;
738 internal const int MinPoolSize = 0;
739 internal const string NetworkLibrary = "";
740 internal const int PacketSize = 8000;
741 internal const string Password = "";
742 internal const bool PersistSecurityInfo = false;
743 internal const bool Pooling = true;
744 internal const bool TrustServerCertificate = false;
745 internal const string TypeSystemVersion = "Latest";
746 internal const string UserID = "";
747 internal const bool UserInstance = false;
748 internal const bool Replication = false;
749 internal const string WorkstationID = "";
750 internal const string TransactionBinding = "Implicit Unbind";
751 internal const int ConnectRetryCount = 1;
752 internal const int ConnectRetryInterval = 10;
753 internal static readonly SqlAuthenticationMethod Authentication = SqlAuthenticationMethod.NotSpecified;
754 internal static readonly SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Disabled;
757 internal static class DbConnectionOptionKeywords {
759 internal const string Driver = "driver";
760 internal const string Pwd = "pwd";
761 internal const string UID = "uid";
764 internal const string DataProvider = "data provider";
765 internal const string ExtendedProperties = "extended properties";
766 internal const string FileName = "file name";
767 internal const string Provider = "provider";
768 internal const string RemoteProvider = "remote provider";
770 // common keywords (OleDb, OracleClient, SqlClient)
771 internal const string Password = "password";
772 internal const string UserID = "user id";
775 internal static class DbConnectionStringKeywords {
777 // internal const string NamedConnection = "Named Connection";
780 internal const string Driver = "Driver";
781 internal const string Dsn = "Dsn";
782 internal const string FileDsn = "FileDsn";
783 internal const string SaveFile = "SaveFile";
786 internal const string FileName = "File Name";
787 internal const string OleDbServices = "OLE DB Services";
788 internal const string Provider = "Provider";
791 internal const string Unicode = "Unicode";
792 internal const string OmitOracleConnectionName = "Omit Oracle Connection Name";
795 internal const string ApplicationIntent = "ApplicationIntent";
796 internal const string ApplicationName = "Application Name";
797 internal const string AsynchronousProcessing = "Asynchronous Processing";
798 internal const string AttachDBFilename = "AttachDbFilename";
799 internal const string ConnectTimeout = "Connect Timeout";
800 internal const string ConnectionReset = "Connection Reset";
801 internal const string ContextConnection = "Context Connection";
802 internal const string CurrentLanguage = "Current Language";
803 internal const string Encrypt = "Encrypt";
804 internal const string FailoverPartner = "Failover Partner";
805 internal const string InitialCatalog = "Initial Catalog";
806 internal const string MultipleActiveResultSets = "MultipleActiveResultSets";
807 internal const string MultiSubnetFailover = "MultiSubnetFailover";
808 internal const string TransparentNetworkIPResolution = "TransparentNetworkIPResolution";
809 internal const string NetworkLibrary = "Network Library";
810 internal const string PacketSize = "Packet Size";
811 internal const string Replication = "Replication";
812 internal const string TransactionBinding = "Transaction Binding";
813 internal const string TrustServerCertificate = "TrustServerCertificate";
814 internal const string TypeSystemVersion = "Type System Version";
815 internal const string UserInstance = "User Instance";
816 internal const string WorkstationID = "Workstation ID";
817 internal const string ConnectRetryCount = "ConnectRetryCount";
818 internal const string ConnectRetryInterval = "ConnectRetryInterval";
819 internal const string Authentication = "Authentication";
820 internal const string Certificate = "Certificate";
821 internal const string ColumnEncryptionSetting = "Column Encryption Setting";
823 // common keywords (OleDb, OracleClient, SqlClient)
824 internal const string DataSource = "Data Source";
825 internal const string IntegratedSecurity = "Integrated Security";
826 internal const string Password = "Password";
827 internal const string PersistSecurityInfo = "Persist Security Info";
828 internal const string UserID = "User ID";
830 // managed pooling (OracleClient, SqlClient)
831 internal const string Enlist = "Enlist";
832 internal const string LoadBalanceTimeout = "Load Balance Timeout";
833 internal const string MaxPoolSize = "Max Pool Size";
834 internal const string Pooling = "Pooling";
835 internal const string MinPoolSize = "Min Pool Size";
838 internal static class DbConnectionStringSynonyms {
839 //internal const string AsynchronousProcessing = Async;
840 internal const string Async = "async";
842 //internal const string ApplicationName = APP;
843 internal const string APP = "app";
845 //internal const string AttachDBFilename = EXTENDEDPROPERTIES+","+INITIALFILENAME;
846 internal const string EXTENDEDPROPERTIES = "extended properties";
847 internal const string INITIALFILENAME = "initial file name";
849 //internal const string ConnectTimeout = CONNECTIONTIMEOUT+","+TIMEOUT;
850 internal const string CONNECTIONTIMEOUT = "connection timeout";
851 internal const string TIMEOUT = "timeout";
853 //internal const string CurrentLanguage = LANGUAGE;
854 internal const string LANGUAGE = "language";
856 //internal const string OraDataSource = SERVER;
857 //internal const string SqlDataSource = ADDR+","+ADDRESS+","+SERVER+","+NETWORKADDRESS;
858 internal const string ADDR = "addr";
859 internal const string ADDRESS = "address";
860 internal const string SERVER = "server";
861 internal const string NETWORKADDRESS = "network address";
863 //internal const string InitialCatalog = DATABASE;
864 internal const string DATABASE = "database";
866 //internal const string IntegratedSecurity = TRUSTEDCONNECTION;
867 internal const string TRUSTEDCONNECTION = "trusted_connection"; // underscore introduced in everett
869 //internal const string LoadBalanceTimeout = ConnectionLifetime;
870 internal const string ConnectionLifetime = "connection lifetime";
872 //internal const string NetworkLibrary = NET+","+NETWORK;
873 internal const string NET = "net";
874 internal const string NETWORK = "network";
876 internal const string WorkaroundOracleBug914652 = "Workaround Oracle Bug 914652";
878 //internal const string Password = Pwd;
879 internal const string Pwd = "pwd";
881 //internal const string PersistSecurityInfo = PERSISTSECURITYINFO;
882 internal const string PERSISTSECURITYINFO = "persistsecurityinfo";
884 //internal const string UserID = UID+","+User;
885 internal const string UID = "uid";
886 internal const string User = "user";
888 //internal const string WorkstationID = WSID;
889 internal const string WSID = "wsid";