| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833 |
- //------------------------------------------------------------------------------
- // <copyright file="SqlConnectionString.cs" company="Microsoft">
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // </copyright>
- // <owner current="true" primary="true">[....]</owner>
- // <owner current="true" primary="false">[....]</owner>
- //------------------------------------------------------------------------------
- namespace System.Data.SqlClient {
- using System;
- using System.Collections;
- using System.Data;
- using System.Data.Common;
- using System.Diagnostics;
- using System.Globalization;
- using System.IO;
- using System.Security;
- using System.Security.Permissions;
- using System.Text;
- using System.Runtime.Versioning;
- internal sealed class SqlConnectionString : DbConnectionOptions {
- // instances of this class are intended to be immutable, i.e readonly
- // used by pooling classes so it is much easier to verify correctness
- // when not worried about the class being modified during execution
- internal static class DEFAULT {
- internal const ApplicationIntent ApplicationIntent = DbConnectionStringDefaults.ApplicationIntent;
- internal const string Application_Name = TdsEnums.SQL_PROVIDER_NAME;
- internal const bool Asynchronous = false;
- internal const string AttachDBFilename = "";
- internal const int Connect_Timeout = ADP.DefaultConnectionTimeout;
- internal const bool Connection_Reset = true;
- internal const bool Context_Connection = false;
- internal const string Current_Language = "";
- internal const string Data_Source = "";
- internal const bool Encrypt = false;
- internal const bool Enlist = true;
- internal const string FailoverPartner = "";
- internal const string Initial_Catalog = "";
- internal const bool Integrated_Security = false;
- internal const int Load_Balance_Timeout = 0; // default of 0 means don't use
- internal const bool MARS = false;
- internal const int Max_Pool_Size = 100;
- internal const int Min_Pool_Size = 0;
- internal const bool MultiSubnetFailover = DbConnectionStringDefaults.MultiSubnetFailover;
- internal const bool TransparentNetworkIPResolution = DbConnectionStringDefaults.TransparentNetworkIPResolution;
- internal const string Network_Library = "";
- internal const int Packet_Size = 8000;
- internal const string Password = "";
- internal const bool Persist_Security_Info = false;
- internal const bool Pooling = true;
- internal const bool TrustServerCertificate = false;
- internal const string Type_System_Version = "";
- internal const string User_ID = "";
- internal const bool User_Instance = false;
- internal const bool Replication = false;
- internal const int Connect_Retry_Count = 1;
- internal const int Connect_Retry_Interval = 10;
- internal static readonly SqlAuthenticationMethod Authentication = SqlAuthenticationMethod.NotSpecified;
- internal static readonly SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Disabled;
- }
- // SqlConnection ConnectionString Options
- // keys must be lowercase!
- internal static class KEY {
- internal const string ApplicationIntent = "applicationintent";
- internal const string Application_Name = "application name";
- internal const string AsynchronousProcessing = "asynchronous processing";
- internal const string AttachDBFilename = "attachdbfilename";
- internal const string ColumnEncryptionSetting = "column encryption setting";
- internal const string Connect_Timeout = "connect timeout";
- internal const string Connection_Reset = "connection reset";
- internal const string Context_Connection = "context connection";
- internal const string Current_Language = "current language";
- internal const string Data_Source = "data source";
- internal const string Encrypt = "encrypt";
- internal const string Enlist = "enlist";
- internal const string FailoverPartner = "failover partner";
- internal const string Initial_Catalog = "initial catalog";
- internal const string Integrated_Security = "integrated security";
- internal const string Load_Balance_Timeout = "load balance timeout";
- internal const string MARS = "multipleactiveresultsets";
- internal const string Max_Pool_Size = "max pool size";
- internal const string Min_Pool_Size = "min pool size";
- internal const string MultiSubnetFailover = "multisubnetfailover";
- internal const string TransparentNetworkIPResolution = "transparentnetworkipresolution";
- internal const string Network_Library = "network library";
- internal const string Packet_Size = "packet size";
- internal const string Password = "password";
- internal const string Persist_Security_Info = "persist security info";
- internal const string Pooling = "pooling";
- internal const string TransactionBinding = "transaction binding";
- internal const string TrustServerCertificate = "trustservercertificate";
- internal const string Type_System_Version = "type system version";
- internal const string User_ID = "user id";
- internal const string User_Instance = "user instance";
- internal const string Workstation_Id = "workstation id";
- internal const string Replication = "replication";
- internal const string Connect_Retry_Count = "connectretrycount";
- internal const string Connect_Retry_Interval = "connectretryinterval";
- internal const string Authentication = "authentication";
- }
- // Constant for the number of duplicate options in the connnection string
- private static class SYNONYM {
- // application name
- internal const string APP = "app";
- internal const string Async = "async";
- // attachDBFilename
- internal const string EXTENDED_PROPERTIES = "extended properties";
- internal const string INITIAL_FILE_NAME = "initial file name";
- // connect timeout
- internal const string CONNECTION_TIMEOUT = "connection timeout";
- internal const string TIMEOUT = "timeout";
- // current language
- internal const string LANGUAGE = "language";
- // data source
- internal const string ADDR = "addr";
- internal const string ADDRESS = "address";
- internal const string SERVER = "server";
- internal const string NETWORK_ADDRESS = "network address";
- // initial catalog
- internal const string DATABASE = "database";
- // integrated security
- internal const string TRUSTED_CONNECTION = "trusted_connection";
- // load balance timeout
- internal const string Connection_Lifetime = "connection lifetime";
- // network library
- internal const string NET = "net";
- internal const string NETWORK = "network";
- // password
- internal const string Pwd = "pwd";
- // persist security info
- internal const string PERSISTSECURITYINFO = "persistsecurityinfo";
- // user id
- internal const string UID = "uid";
- internal const string User = "user";
- // workstation id
- internal const string WSID = "wsid";
- // make sure to update SynonymCount value below when adding or removing synonyms
- }
- internal const int SynonymCount = 21;
- // the following are all inserted as keys into the _netlibMapping hash
- internal static class NETLIB {
- internal const string AppleTalk = "dbmsadsn";
- internal const string BanyanVines = "dbmsvinn";
- internal const string IPXSPX = "dbmsspxn";
- internal const string Multiprotocol = "dbmsrpcn";
- internal const string NamedPipes = "dbnmpntw";
- internal const string SharedMemory = "dbmslpcn";
- internal const string TCPIP = "dbmssocn";
- internal const string VIA = "dbmsgnet";
- }
- internal enum TypeSystem {
- Latest = 2008,
- SQLServer2000 = 2000,
- SQLServer2005 = 2005,
- SQLServer2008 = 2008,
- SQLServer2012 = 2012,
- }
- internal static class TYPESYSTEMVERSION {
- internal const string Latest = "Latest";
- internal const string SQL_Server_2000 = "SQL Server 2000";
- internal const string SQL_Server_2005 = "SQL Server 2005";
- internal const string SQL_Server_2008 = "SQL Server 2008";
- internal const string SQL_Server_2012 = "SQL Server 2012";
- }
- internal enum TransactionBindingEnum {
- ImplicitUnbind,
- ExplicitUnbind
- }
- internal static class TRANSACIONBINDING {
- internal const string ImplicitUnbind = "Implicit Unbind";
- internal const string ExplicitUnbind = "Explicit Unbind";
- }
- static private Hashtable _sqlClientSynonyms;
- static private Hashtable _netlibMapping;
- private readonly bool _integratedSecurity;
- private readonly bool _connectionReset;
- private readonly bool _contextConnection;
- private readonly bool _encrypt;
- private readonly bool _trustServerCertificate;
- private readonly bool _enlist;
- private readonly bool _mars;
- private readonly bool _persistSecurityInfo;
- private readonly bool _pooling;
- private readonly bool _replication;
- private readonly bool _userInstance;
- private readonly bool _multiSubnetFailover;
- private readonly bool _transparentNetworkIPResolution;
- private readonly SqlAuthenticationMethod _authType;
- private readonly SqlConnectionColumnEncryptionSetting _columnEncryptionSetting;
- private readonly int _connectTimeout;
- private readonly int _loadBalanceTimeout;
- private readonly int _maxPoolSize;
- private readonly int _minPoolSize;
- private readonly int _packetSize;
- private readonly int _connectRetryCount;
- private readonly int _connectRetryInterval;
- private readonly ApplicationIntent _applicationIntent;
- private readonly string _applicationName;
- private readonly string _attachDBFileName;
- private readonly string _currentLanguage;
- private readonly string _dataSource;
- private readonly string _localDBInstance; // created based on datasource, set to NULL if datasource is not LocalDB
- private readonly string _failoverPartner;
- private readonly string _initialCatalog;
- private readonly string _password;
- private readonly string _userID;
- private readonly string _networkLibrary;
- private readonly string _workstationId;
- private readonly TypeSystem _typeSystemVersion;
- private readonly Version _typeSystemAssemblyVersion;
- private static readonly Version constTypeSystemAsmVersion10 = new Version("10.0.0.0");
- private static readonly Version constTypeSystemAsmVersion11 = new Version("11.0.0.0");
- private readonly TransactionBindingEnum _transactionBinding;
- private readonly string _expandedAttachDBFilename; // expanded during construction so that CreatePermissionSet & Expand are consistent
- // SxS: reading Software\\Microsoft\\MSSQLServer\\Client\\SuperSocketNetLib\Encrypt value from registry
- [ResourceExposure(ResourceScope.None)]
- [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
- internal SqlConnectionString(string connectionString) : base(connectionString, GetParseSynonyms(), false) {
- bool runningInProc = InOutOfProcHelper.InProc;
-
- _integratedSecurity = ConvertValueToIntegratedSecurity();
- ConvertValueToBoolean(KEY.AsynchronousProcessing, DEFAULT.Asynchronous); // while we don't use it anymore, we still need to verify it is true/false
- // SQLPT 41700: Ignore ResetConnection=False (still validate the keyword/value)
- _connectionReset = ConvertValueToBoolean(KEY.Connection_Reset, DEFAULT.Connection_Reset);
- _contextConnection = ConvertValueToBoolean(KEY.Context_Connection, DEFAULT.Context_Connection);
- _encrypt = ConvertValueToEncrypt();
- _enlist = ConvertValueToBoolean(KEY.Enlist, ADP.IsWindowsNT);
- _mars = ConvertValueToBoolean(KEY.MARS, DEFAULT.MARS);
- _persistSecurityInfo = ConvertValueToBoolean(KEY.Persist_Security_Info, DEFAULT.Persist_Security_Info);
- _pooling = ConvertValueToBoolean(KEY.Pooling, DEFAULT.Pooling);
- _replication = ConvertValueToBoolean(KEY.Replication, DEFAULT.Replication);
- _userInstance = ConvertValueToBoolean(KEY.User_Instance, DEFAULT.User_Instance);
- _multiSubnetFailover = ConvertValueToBoolean(KEY.MultiSubnetFailover, DEFAULT.MultiSubnetFailover);
- _transparentNetworkIPResolution = ConvertValueToBoolean(KEY.TransparentNetworkIPResolution, DEFAULT.TransparentNetworkIPResolution);
- _connectTimeout = ConvertValueToInt32(KEY.Connect_Timeout, DEFAULT.Connect_Timeout);
- _loadBalanceTimeout = ConvertValueToInt32(KEY.Load_Balance_Timeout, DEFAULT.Load_Balance_Timeout);
- _maxPoolSize = ConvertValueToInt32(KEY.Max_Pool_Size, DEFAULT.Max_Pool_Size);
- _minPoolSize = ConvertValueToInt32(KEY.Min_Pool_Size, DEFAULT.Min_Pool_Size);
- _packetSize = ConvertValueToInt32(KEY.Packet_Size, DEFAULT.Packet_Size);
- _connectRetryCount = ConvertValueToInt32(KEY.Connect_Retry_Count, DEFAULT.Connect_Retry_Count);
- _connectRetryInterval = ConvertValueToInt32(KEY.Connect_Retry_Interval, DEFAULT.Connect_Retry_Interval);
- _applicationIntent = ConvertValueToApplicationIntent();
- _applicationName = ConvertValueToString(KEY.Application_Name, DEFAULT.Application_Name);
- _attachDBFileName = ConvertValueToString(KEY.AttachDBFilename, DEFAULT.AttachDBFilename);
- _currentLanguage = ConvertValueToString(KEY.Current_Language, DEFAULT.Current_Language);
- _dataSource = ConvertValueToString(KEY.Data_Source, DEFAULT.Data_Source);
- _localDBInstance = LocalDBAPI.GetLocalDbInstanceNameFromServerName(_dataSource);
- _failoverPartner = ConvertValueToString(KEY.FailoverPartner, DEFAULT.FailoverPartner);
- _initialCatalog = ConvertValueToString(KEY.Initial_Catalog, DEFAULT.Initial_Catalog);
- _networkLibrary = ConvertValueToString(KEY.Network_Library, null);
- _password = ConvertValueToString(KEY.Password, DEFAULT.Password);
- _trustServerCertificate = ConvertValueToBoolean(KEY.TrustServerCertificate, DEFAULT.TrustServerCertificate);
- _authType = ConvertValueToAuthenticationType();
- _columnEncryptionSetting = ConvertValueToColumnEncryptionSetting();
- // Temporary string - this value is stored internally as an enum.
- string typeSystemVersionString = ConvertValueToString(KEY.Type_System_Version, null);
- string transactionBindingString = ConvertValueToString(KEY.TransactionBinding, null);
- _userID = ConvertValueToString(KEY.User_ID, DEFAULT.User_ID);
- _workstationId = ConvertValueToString(KEY.Workstation_Id, null);
- if (_contextConnection) {
- // We have to be running in the engine for you to request a
- // context connection.
- if (!runningInProc) {
- throw SQL.ContextUnavailableOutOfProc();
- }
- // When using a context connection, we need to ensure that no
- // other connection string keywords are specified.
- foreach (DictionaryEntry entry in Parsetable) {
- if ((string) entry.Key != KEY.Context_Connection &&
- (string) entry.Key != KEY.Type_System_Version) {
- throw SQL.ContextAllowsLimitedKeywords();
- }
- }
- }
- if (!_encrypt) { // Support legacy registry encryption settings
- const string folder = "Software\\Microsoft\\MSSQLServer\\Client\\SuperSocketNetLib";
- const string value = "Encrypt";
- Object obj = ADP.LocalMachineRegistryValue(folder, value);
- if ((obj is Int32) && (1 == (int)obj)) { // If the registry key exists
- _encrypt = true;
- }
- }
- if (_loadBalanceTimeout < 0) {
- throw ADP.InvalidConnectionOptionValue(KEY.Load_Balance_Timeout);
- }
- if (_connectTimeout < 0) {
- throw ADP.InvalidConnectionOptionValue(KEY.Connect_Timeout);
- }
- if (_maxPoolSize < 1) {
- throw ADP.InvalidConnectionOptionValue(KEY.Max_Pool_Size);
- }
- if (_minPoolSize < 0) {
- throw ADP.InvalidConnectionOptionValue(KEY.Min_Pool_Size);
- }
- if (_maxPoolSize < _minPoolSize) {
- throw ADP.InvalidMinMaxPoolSizeValues();
- }
- if ((_packetSize < TdsEnums.MIN_PACKET_SIZE) || (TdsEnums.MAX_PACKET_SIZE < _packetSize)) {
- throw SQL.InvalidPacketSizeValue();
- }
- if (null != _networkLibrary) { // MDAC 83525
- string networkLibrary = _networkLibrary.Trim().ToLower(CultureInfo.InvariantCulture);
- Hashtable netlib = NetlibMapping();
- if (!netlib.ContainsKey(networkLibrary)) {
- throw ADP.InvalidConnectionOptionValue(KEY.Network_Library);
- }
- _networkLibrary = (string) netlib[networkLibrary];
- }
- else {
- _networkLibrary = DEFAULT.Network_Library;
- }
- ValidateValueLength(_applicationName, TdsEnums.MAXLEN_APPNAME, KEY.Application_Name);
- ValidateValueLength(_currentLanguage , TdsEnums.MAXLEN_LANGUAGE, KEY.Current_Language);
- ValidateValueLength(_dataSource, TdsEnums.MAXLEN_SERVERNAME, KEY.Data_Source);
- ValidateValueLength(_failoverPartner, TdsEnums.MAXLEN_SERVERNAME, KEY.FailoverPartner);
- ValidateValueLength(_initialCatalog, TdsEnums.MAXLEN_DATABASE, KEY.Initial_Catalog);
- ValidateValueLength(_password, TdsEnums.MAXLEN_PASSWORD, KEY.Password);
- ValidateValueLength(_userID, TdsEnums.MAXLEN_USERNAME, KEY.User_ID);
- if (null != _workstationId) {
- ValidateValueLength(_workstationId, TdsEnums.MAXLEN_HOSTNAME, KEY.Workstation_Id);
- }
- if (!String.Equals(DEFAULT.FailoverPartner, _failoverPartner, StringComparison.OrdinalIgnoreCase)) {
- // fail-over partner is set
- if (_multiSubnetFailover) {
- throw SQL.MultiSubnetFailoverWithFailoverPartner(serverProvidedFailoverPartner: false, internalConnection: null);
- }
- if (String.Equals(DEFAULT.Initial_Catalog, _initialCatalog, StringComparison.OrdinalIgnoreCase)) {
- throw ADP.MissingConnectionOptionValue(KEY.FailoverPartner, KEY.Initial_Catalog);
- }
- }
- // expand during construction so that CreatePermissionSet and Expand are consistent
- string datadir = null;
- _expandedAttachDBFilename = ExpandDataDirectory(KEY.AttachDBFilename, _attachDBFileName, ref datadir);
- if (null != _expandedAttachDBFilename) {
- if (0 <= _expandedAttachDBFilename.IndexOf('|')) {
- throw ADP.InvalidConnectionOptionValue(KEY.AttachDBFilename);
- }
- ValidateValueLength(_expandedAttachDBFilename, TdsEnums.MAXLEN_ATTACHDBFILE, KEY.AttachDBFilename);
- if (_localDBInstance == null)
- {
- // fail fast to verify LocalHost when using |DataDirectory|
- // still must check again at connect time
- string host = _dataSource;
- string protocol = _networkLibrary;
- TdsParserStaticMethods.AliasRegistryLookup(ref host, ref protocol);
- VerifyLocalHostAndFixup(ref host, true, false /*don't fix-up*/);
- }
- }
- else if (0 <= _attachDBFileName.IndexOf('|')) {
- throw ADP.InvalidConnectionOptionValue(KEY.AttachDBFilename);
- }
- else {
- ValidateValueLength(_attachDBFileName, TdsEnums.MAXLEN_ATTACHDBFILE, KEY.AttachDBFilename);
- }
- _typeSystemAssemblyVersion = constTypeSystemAsmVersion10;
- if (true == _userInstance && !ADP.IsEmpty(_failoverPartner)) {
- throw SQL.UserInstanceFailoverNotCompatible();
- }
- if (ADP.IsEmpty(typeSystemVersionString)) {
- typeSystemVersionString = DbConnectionStringDefaults.TypeSystemVersion;
- }
- if (typeSystemVersionString.Equals(TYPESYSTEMVERSION.Latest, StringComparison.OrdinalIgnoreCase)) {
- _typeSystemVersion = TypeSystem.Latest;
- }
- else if (typeSystemVersionString.Equals(TYPESYSTEMVERSION.SQL_Server_2000, StringComparison.OrdinalIgnoreCase)) {
- if (_contextConnection) {
- throw SQL.ContextAllowsOnlyTypeSystem2005();
- }
- _typeSystemVersion = TypeSystem.SQLServer2000;
- }
- else if (typeSystemVersionString.Equals(TYPESYSTEMVERSION.SQL_Server_2005, StringComparison.OrdinalIgnoreCase)) {
- _typeSystemVersion = TypeSystem.SQLServer2005;
- }
- else if (typeSystemVersionString.Equals(TYPESYSTEMVERSION.SQL_Server_2008, StringComparison.OrdinalIgnoreCase)) {
- _typeSystemVersion = TypeSystem.SQLServer2008;
- }
- else if (typeSystemVersionString.Equals(TYPESYSTEMVERSION.SQL_Server_2012, StringComparison.OrdinalIgnoreCase)) {
- _typeSystemVersion = TypeSystem.SQLServer2012;
- _typeSystemAssemblyVersion = constTypeSystemAsmVersion11;
- }
- else {
- throw ADP.InvalidConnectionOptionValue(KEY.Type_System_Version);
- }
- if (ADP.IsEmpty(transactionBindingString)) {
- transactionBindingString = DbConnectionStringDefaults.TransactionBinding;
- }
- if (transactionBindingString.Equals(TRANSACIONBINDING.ImplicitUnbind, StringComparison.OrdinalIgnoreCase)) {
- _transactionBinding = TransactionBindingEnum.ImplicitUnbind;
- }
- else if (transactionBindingString.Equals(TRANSACIONBINDING.ExplicitUnbind, StringComparison.OrdinalIgnoreCase)) {
- _transactionBinding = TransactionBindingEnum.ExplicitUnbind;
- }
- else {
- throw ADP.InvalidConnectionOptionValue(KEY.TransactionBinding);
- }
- if (_applicationIntent == ApplicationIntent.ReadOnly && !String.IsNullOrEmpty(_failoverPartner))
- throw SQL.ROR_FailoverNotSupportedConnString();
- if ((_connectRetryCount<0) || (_connectRetryCount>255)) {
- throw ADP.InvalidConnectRetryCountValue();
- }
- if ((_connectRetryInterval < 1) || (_connectRetryInterval > 60)) {
- throw ADP.InvalidConnectRetryIntervalValue();
- }
- if (Authentication != SqlAuthenticationMethod.NotSpecified && _integratedSecurity == true) {
- throw SQL.AuthenticationAndIntegratedSecurity();
- }
- if (Authentication == SqlClient.SqlAuthenticationMethod.ActiveDirectoryIntegrated && (HasUserIdKeyword || HasPasswordKeyword)) {
- throw SQL.IntegratedWithUserIDAndPassword();
- }
- }
- // This c-tor is used to create SSE and user instance connection strings when user instance is set to true
- //
- internal SqlConnectionString(SqlConnectionString connectionOptions, string dataSource, bool userInstance, bool? setEnlistValue) : base(connectionOptions) {
- _integratedSecurity = connectionOptions._integratedSecurity;
- _connectionReset = connectionOptions._connectionReset;
- _contextConnection = connectionOptions._contextConnection;
- _encrypt = connectionOptions._encrypt;
- if (setEnlistValue.HasValue) {
- _enlist = setEnlistValue.Value;
- }
- else {
- _enlist = connectionOptions._enlist;
- }
-
- _mars = connectionOptions._mars;
- _persistSecurityInfo = connectionOptions._persistSecurityInfo;
- _pooling = connectionOptions._pooling;
- _replication = connectionOptions._replication;
- _userInstance = userInstance;
- _connectTimeout = connectionOptions._connectTimeout;
- _loadBalanceTimeout = connectionOptions._loadBalanceTimeout;
- _maxPoolSize = connectionOptions._maxPoolSize;
- _minPoolSize = connectionOptions._minPoolSize;
- _multiSubnetFailover = connectionOptions._multiSubnetFailover;
- _transparentNetworkIPResolution = connectionOptions._transparentNetworkIPResolution;
- _packetSize = connectionOptions._packetSize;
- _applicationName = connectionOptions._applicationName;
- _attachDBFileName = connectionOptions._attachDBFileName;
- _currentLanguage = connectionOptions._currentLanguage;
- _dataSource = dataSource;
- _localDBInstance = LocalDBAPI.GetLocalDbInstanceNameFromServerName(_dataSource);
- _failoverPartner = connectionOptions._failoverPartner;
- _initialCatalog = connectionOptions._initialCatalog;
- _password = connectionOptions._password;
- _userID = connectionOptions._userID;
- _networkLibrary = connectionOptions._networkLibrary;
- _workstationId = connectionOptions._workstationId;
- _expandedAttachDBFilename = connectionOptions._expandedAttachDBFilename;
- _typeSystemVersion = connectionOptions._typeSystemVersion;
- _typeSystemAssemblyVersion = connectionOptions._typeSystemAssemblyVersion;
- _transactionBinding = connectionOptions._transactionBinding;
- _applicationIntent = connectionOptions._applicationIntent;
- _connectRetryCount = connectionOptions._connectRetryCount;
- _connectRetryInterval = connectionOptions._connectRetryInterval;
- _authType = connectionOptions._authType;
- _columnEncryptionSetting = connectionOptions._columnEncryptionSetting;
- ValidateValueLength(_dataSource, TdsEnums.MAXLEN_SERVERNAME, KEY.Data_Source);
- }
- internal bool IntegratedSecurity { get { return _integratedSecurity; } }
- // We always initialize in Async mode so that both synchronous and asynchronous methods
- // will work. In the future we can deprecate the keyword entirely.
- internal bool Asynchronous { get { return true; } }
- // SQLPT 41700: Ignore ResetConnection=False, always reset the connection for security
- internal bool ConnectionReset { get { return true; } }
- internal bool ContextConnection { get { return _contextConnection; } }
- // internal bool EnableUdtDownload { get { return _enableUdtDownload;} }
- internal bool Encrypt { get { return _encrypt; } }
- internal bool TrustServerCertificate { get { return _trustServerCertificate; } }
- internal bool Enlist { get { return _enlist; } }
- internal bool MARS { get { return _mars; } }
- internal bool MultiSubnetFailover { get { return _multiSubnetFailover; } }
- internal bool TransparentNetworkIPResolution { get { return _transparentNetworkIPResolution; } }
- internal SqlAuthenticationMethod Authentication { get { return _authType; } }
- internal SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting { get { return _columnEncryptionSetting; } }
- internal bool PersistSecurityInfo { get { return _persistSecurityInfo; } }
- internal bool Pooling { get { return _pooling; } }
- internal bool Replication { get { return _replication; } }
- internal bool UserInstance { get { return _userInstance; } }
- internal int ConnectTimeout { get { return _connectTimeout; } }
- internal int LoadBalanceTimeout { get { return _loadBalanceTimeout; } }
- internal int MaxPoolSize { get { return _maxPoolSize; } }
- internal int MinPoolSize { get { return _minPoolSize; } }
- internal int PacketSize { get { return _packetSize; } }
- internal int ConnectRetryCount { get { return _connectRetryCount; } }
- internal int ConnectRetryInterval { get { return _connectRetryInterval; } }
- internal ApplicationIntent ApplicationIntent { get { return _applicationIntent; } }
- internal string ApplicationName { get { return _applicationName; } }
- internal string AttachDBFilename { get { return _attachDBFileName; } }
- internal string CurrentLanguage { get { return _currentLanguage; } }
- internal string DataSource { get { return _dataSource; } }
- internal string LocalDBInstance { get { return _localDBInstance; } }
- internal string FailoverPartner { get { return _failoverPartner; } }
- internal string InitialCatalog { get { return _initialCatalog; } }
- internal string NetworkLibrary { get { return _networkLibrary; } }
- internal string Password { get { return _password; } }
- internal string UserID { get { return _userID; } }
- internal string WorkstationId { get { return _workstationId; } }
- internal TypeSystem TypeSystemVersion { get { return _typeSystemVersion; } }
- internal Version TypeSystemAssemblyVersion { get { return _typeSystemAssemblyVersion; } }
- internal TransactionBindingEnum TransactionBinding { get { return _transactionBinding; } }
- internal bool EnforceLocalHost {
- get {
- // so tdsparser.connect can determine if SqlConnection.UserConnectionOptions
- // needs to enfoce local host after datasource alias lookup
- return (null != _expandedAttachDBFilename) && (null == _localDBInstance);
- }
- }
- protected internal override System.Security.PermissionSet CreatePermissionSet() {
- System.Security.PermissionSet permissionSet = new System.Security.PermissionSet(System.Security.Permissions.PermissionState.None);
- permissionSet.AddPermission(new SqlClientPermission(this));
- return permissionSet;
- }
- protected internal override string Expand() {
- if (null != _expandedAttachDBFilename) {
- return ExpandKeyword(KEY.AttachDBFilename, _expandedAttachDBFilename);
- }
- else {
- return base.Expand();
- }
- }
- private static bool CompareHostName(ref string host, string name, bool fixup) {
- // same computer name or same computer name + "\named instance"
- bool equal = false;
- if (host.Equals(name, StringComparison.OrdinalIgnoreCase)) {
- if (fixup) {
- host = ".";
- }
- equal = true;
- }
- else if (host.StartsWith(name+@"\", StringComparison.OrdinalIgnoreCase)) {
- if (fixup) {
- host = "." + host.Substring(name.Length);
- }
- equal = true;
- }
- return equal;
- }
-
- // this hashtable is meant to be read-only translation of parsed string
- // keywords/synonyms to a known keyword string
- internal static Hashtable GetParseSynonyms() {
- Hashtable hash = _sqlClientSynonyms;
- if (null == hash) {
- hash = new Hashtable(SqlConnectionStringBuilder.KeywordsCount + SynonymCount);
- hash.Add(KEY.ApplicationIntent, KEY.ApplicationIntent);
- hash.Add(KEY.Application_Name, KEY.Application_Name);
- hash.Add(KEY.AsynchronousProcessing, KEY.AsynchronousProcessing);
- hash.Add(KEY.AttachDBFilename, KEY.AttachDBFilename);
- hash.Add(KEY.Connect_Timeout, KEY.Connect_Timeout);
- hash.Add(KEY.Connection_Reset, KEY.Connection_Reset);
- hash.Add(KEY.Context_Connection, KEY.Context_Connection);
- hash.Add(KEY.Current_Language, KEY.Current_Language);
- hash.Add(KEY.Data_Source, KEY.Data_Source);
- hash.Add(KEY.Encrypt, KEY.Encrypt);
- hash.Add(KEY.Enlist, KEY.Enlist);
- hash.Add(KEY.FailoverPartner, KEY.FailoverPartner);
- hash.Add(KEY.Initial_Catalog, KEY.Initial_Catalog);
- hash.Add(KEY.Integrated_Security, KEY.Integrated_Security);
- hash.Add(KEY.Load_Balance_Timeout, KEY.Load_Balance_Timeout);
- hash.Add(KEY.MARS, KEY.MARS);
- hash.Add(KEY.Max_Pool_Size, KEY.Max_Pool_Size);
- hash.Add(KEY.Min_Pool_Size, KEY.Min_Pool_Size);
- hash.Add(KEY.MultiSubnetFailover, KEY.MultiSubnetFailover);
- hash.Add(KEY.TransparentNetworkIPResolution, KEY.TransparentNetworkIPResolution);
- hash.Add(KEY.Network_Library, KEY.Network_Library);
- hash.Add(KEY.Packet_Size, KEY.Packet_Size);
- hash.Add(KEY.Password, KEY.Password);
- hash.Add(KEY.Persist_Security_Info, KEY.Persist_Security_Info);
- hash.Add(KEY.Pooling, KEY.Pooling);
- hash.Add(KEY.Replication, KEY.Replication);
- hash.Add(KEY.TrustServerCertificate, KEY.TrustServerCertificate);
- hash.Add(KEY.TransactionBinding, KEY.TransactionBinding);
- hash.Add(KEY.Type_System_Version, KEY.Type_System_Version);
- hash.Add(KEY.ColumnEncryptionSetting, KEY.ColumnEncryptionSetting);
- hash.Add(KEY.User_ID, KEY.User_ID);
- hash.Add(KEY.User_Instance, KEY.User_Instance);
- hash.Add(KEY.Workstation_Id, KEY.Workstation_Id);
- hash.Add(KEY.Connect_Retry_Count, KEY.Connect_Retry_Count);
- hash.Add(KEY.Connect_Retry_Interval, KEY.Connect_Retry_Interval);
- hash.Add(KEY.Authentication, KEY.Authentication);
- hash.Add(SYNONYM.APP, KEY.Application_Name);
- hash.Add(SYNONYM.Async, KEY.AsynchronousProcessing);
- hash.Add(SYNONYM.EXTENDED_PROPERTIES, KEY.AttachDBFilename);
- hash.Add(SYNONYM.INITIAL_FILE_NAME, KEY.AttachDBFilename);
- hash.Add(SYNONYM.CONNECTION_TIMEOUT, KEY.Connect_Timeout);
- hash.Add(SYNONYM.TIMEOUT, KEY.Connect_Timeout);
- hash.Add(SYNONYM.LANGUAGE, KEY.Current_Language);
- hash.Add(SYNONYM.ADDR, KEY.Data_Source);
- hash.Add(SYNONYM.ADDRESS, KEY.Data_Source);
- hash.Add(SYNONYM.NETWORK_ADDRESS, KEY.Data_Source);
- hash.Add(SYNONYM.SERVER, KEY.Data_Source);
- hash.Add(SYNONYM.DATABASE, KEY.Initial_Catalog);
- hash.Add(SYNONYM.TRUSTED_CONNECTION, KEY.Integrated_Security);
- hash.Add(SYNONYM.Connection_Lifetime, KEY.Load_Balance_Timeout);
- hash.Add(SYNONYM.NET, KEY.Network_Library);
- hash.Add(SYNONYM.NETWORK, KEY.Network_Library);
- hash.Add(SYNONYM.Pwd, KEY.Password);
- hash.Add(SYNONYM.PERSISTSECURITYINFO, KEY.Persist_Security_Info);
- hash.Add(SYNONYM.UID, KEY.User_ID);
- hash.Add(SYNONYM.User, KEY.User_ID);
- hash.Add(SYNONYM.WSID, KEY.Workstation_Id);
- Debug.Assert(SqlConnectionStringBuilder.KeywordsCount + SynonymCount == hash.Count, "incorrect initial ParseSynonyms size");
- _sqlClientSynonyms = hash;
- }
- return hash;
- }
- internal string ObtainWorkstationId() {
- // If not supplied by the user, the default value is the MachineName
- // Note: In Longhorn you'll be able to rename a machine without
- // rebooting. Therefore, don't cache this machine name.
- string result = WorkstationId;
- if (null == result) {
- // permission to obtain Environment.MachineName is Asserted
- // since permission to open the connection has been granted
- // the information is shared with the server, but not directly with the user
- result = ADP.MachineName();
- ValidateValueLength(result, TdsEnums.MAXLEN_HOSTNAME, KEY.Workstation_Id);
- }
- return result;
- }
- static internal Hashtable NetlibMapping() {
- const int NetLibCount = 8;
- Hashtable hash = _netlibMapping;
- if (null == hash) {
- hash = new Hashtable(NetLibCount);
- hash.Add(NETLIB.TCPIP, TdsEnums.TCP);
- hash.Add(NETLIB.NamedPipes, TdsEnums.NP);
- hash.Add(NETLIB.Multiprotocol, TdsEnums.RPC);
- hash.Add(NETLIB.BanyanVines, TdsEnums.BV);
- hash.Add(NETLIB.AppleTalk, TdsEnums.ADSP);
- hash.Add(NETLIB.IPXSPX, TdsEnums.SPX);
- hash.Add(NETLIB.VIA, TdsEnums.VIA);
- hash.Add(NETLIB.SharedMemory, TdsEnums.LPC);
- Debug.Assert(NetLibCount == hash.Count, "incorrect initial NetlibMapping size");
- _netlibMapping = hash;
- }
- return hash;
- }
- static internal bool ValidProtocal (string protocal) {
- switch (protocal) {
- case TdsEnums.TCP :
- case TdsEnums.NP :
- case TdsEnums.VIA :
- case TdsEnums.LPC :
- return true;
- // case TdsEnums.RPC : Invalid Protocals
- // case TdsEnums.BV :
- // case TdsEnums.ADSP :
- // case TdsEnums.SPX :
- default :
- return false;
- }
- }
- private void ValidateValueLength (string value, int limit, string key) {
- if (limit < value.Length) {
- throw ADP.InvalidConnectionOptionValueLength(key, limit);
- }
- }
- internal static void VerifyLocalHostAndFixup(ref string host, bool enforceLocalHost, bool fixup) {
- if (ADP.IsEmpty(host)) {
- if (fixup) {
- host = ".";
- }
- }
- else if (!CompareHostName(ref host, @".", fixup) &&
- !CompareHostName(ref host, @"(local)", fixup)) {
- // Fix-up completed in CompareHostName if return value true.
- string name = ADP.GetComputerNameDnsFullyQualified(); // i.e, machine.location.corp.company.com
- if (!CompareHostName(ref host, name, fixup)) {
- int separatorPos = name.IndexOf('.'); // to compare just 'machine' part
- if ((separatorPos <= 0) || !CompareHostName(ref host, name.Substring(0, separatorPos), fixup)) {
- if (enforceLocalHost) {
- throw ADP.InvalidConnectionOptionValue(KEY.AttachDBFilename);
- }
- }
- }
- }
- }
-
- internal System.Data.SqlClient.ApplicationIntent ConvertValueToApplicationIntent() {
- object value = base.Parsetable[KEY.ApplicationIntent];
- if (value == null) {
- return DEFAULT.ApplicationIntent;
- }
- // when wrong value is used in the connection string provided to SqlConnection.ConnectionString or c-tor,
- // wrap Format and Overflow exceptions with Argument one, to be consistent with rest of the keyword types (like int and bool)
- try {
- return DbConnectionStringBuilderUtil.ConvertToApplicationIntent(KEY.ApplicationIntent, value);
- }
- catch (FormatException e) {
- throw ADP.InvalidConnectionOptionValue(KEY.ApplicationIntent, e);
- }
- catch (OverflowException e) {
- throw ADP.InvalidConnectionOptionValue(KEY.ApplicationIntent, e);
- }
- // ArgumentException and other types are raised as is (no wrapping)
- }
- internal SqlAuthenticationMethod ConvertValueToAuthenticationType() {
- object value = base.Parsetable[KEY.Authentication];
- string valStr = value as string;
- if (valStr == null) {
- return DEFAULT.Authentication;
- }
- try {
- return DbConnectionStringBuilderUtil.ConvertToAuthenticationType(KEY.Authentication, valStr);
- }
- catch (FormatException e) {
- throw ADP.InvalidConnectionOptionValue(KEY.Authentication, e);
- }
- catch (OverflowException e) {
- throw ADP.InvalidConnectionOptionValue(KEY.Authentication, e);
- }
- }
- /// <summary>
- /// Convert the value to SqlConnectionColumnEncryptionSetting.
- /// </summary>
- /// <returns></returns>
- internal SqlConnectionColumnEncryptionSetting ConvertValueToColumnEncryptionSetting() {
- object value = base.Parsetable[KEY.ColumnEncryptionSetting];
- string valStr = value as string;
- if (valStr == null) {
- return DEFAULT.ColumnEncryptionSetting;
- }
- try {
- return DbConnectionStringBuilderUtil.ConvertToColumnEncryptionSetting(KEY.ColumnEncryptionSetting, valStr);
- }
- catch (FormatException e) {
- throw ADP.InvalidConnectionOptionValue(KEY.ColumnEncryptionSetting, e);
- }
- catch (OverflowException e) {
- throw ADP.InvalidConnectionOptionValue(KEY.ColumnEncryptionSetting, e);
- }
- }
- internal bool ConvertValueToEncrypt() {
- // If the Authentication keyword is provided, default to Encrypt=true;
- // otherwise keep old default for backwards compatibility
- object authValue = base.Parsetable[KEY.Authentication];
- bool defaultEncryptValue = (authValue == null) ? DEFAULT.Encrypt : true;
- return ConvertValueToBoolean(KEY.Encrypt, defaultEncryptValue);
- }
- }
- }
|