diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/ConnectionStringDefinitionDialog.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/ConnectionStringDefinitionDialog.cs index 8d731915c0..aa299a010c 100644 --- a/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/ConnectionStringDefinitionDialog.cs +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/ConnectionStringDefinitionDialog.cs @@ -30,6 +30,7 @@ namespace SharpDbTools.Connection ToolStripProgressBar connectionTestProgressBar = new ToolStripProgressBar(); ConnectionTestBackgroundWorker testConnectionBackgroundWorker; string resultMessage; + string invariantName; ConnectionTestState connectionTestState = ConnectionTestState.UnTested; public ConnectionStringDefinitionDialog() @@ -47,6 +48,15 @@ namespace SharpDbTools.Connection this.connectionTestProgressBar.Maximum = 150; } + public string InvariantName { + get { + return this.invariantName; + } + set { + this.invariantName = value; + } + } + public ConnectionTestState ConnectionTestState { get { return this.connectionTestState; @@ -209,6 +219,10 @@ namespace SharpDbTools.Connection void SubmitButtonClick(object sender, System.EventArgs e) { + string name = (string)this.providerTypeComboBox.SelectedItem; + DbProvidersService service = DbProvidersService.GetDbProvidersService(); + this.InvariantName = service.GetInvariantName(name); + this.DialogResult = DialogResult.OK; this.Close(); } diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/DbProvidersService.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/DbProvidersService.cs index a5769ff356..a43c0d3462 100644 --- a/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/DbProvidersService.cs +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/Connection/DbProvidersService.cs @@ -32,6 +32,9 @@ namespace SharpDbTools.Connection private static DbProvidersService me = new DbProvidersService(); private static Boolean initialized = false; private Dictionary factories = new Dictionary(); + + // This is only valid witin one session - do not persist + private Dictionary invariantByNameLookup = new Dictionary(); private List names = new List(); private DbProvidersService() @@ -47,7 +50,10 @@ namespace SharpDbTools.Connection foreach(DataRow row in rows) { + // TODO: factory out string literals for column names string name = (string)row["Name"]; + string invariantName = (string)row["InvariantName"]; + invariantByNameLookup.Add(name, invariantName); //factoryData.Add(name, row); DbProviderFactory factory = DbProviderFactories.GetFactory(row); names.Add(name); @@ -73,6 +79,12 @@ namespace SharpDbTools.Connection } } + public string GetInvariantName(string name) { + string invariantName = null; + invariantByNameLookup.TryGetValue(name, out invariantName); + return invariantName; + } + public DbProviderFactory this[string name] { get diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs index 4c1ffe8459..512c23e8a1 100644 --- a/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs @@ -48,14 +48,49 @@ namespace SharpDbTools.Model string invariantName = (string)table.Rows[0][ColumnNames.InvariantName]; return invariantName; } + set { + DataTable table = this.Tables[TableNames.ConnectionInfo]; + string invariantName = (string)table.Rows[0][ColumnNames.InvariantName]; + string name = this.Name; + string connectionString = this.ConnectionString; + + if (invariantName == null) { + table.Rows[0][ColumnNames.InvariantName] = value; + } + + // if invariant has changed must clear any existing metadata + else if (!(invariantName.Equals(value))) { + // clear tables + this.Tables.Clear(); + DataTable newTable = CreateConnectionTable(); + // add the first and only column of this table; + newTable.Rows.Add(new object[] {name, invariantName, connectionString}); + } + } } public string ConnectionString { get { DataTable table = this.Tables[TableNames.ConnectionInfo]; - string connectionString = (string)table.Rows[0][ColumnNames.InvariantName]; + string connectionString = (string)table.Rows[0][ColumnNames.ConnectionString]; return connectionString; } + set { + DataTable table = this.Tables[TableNames.ConnectionInfo]; + string invariantName = (string)table.Rows[0][ColumnNames.InvariantName]; + string name = this.Name; + string connectionString = this.ConnectionString; + + if (connectionString == null) { + table.Rows[0][ColumnNames.ConnectionString] = value; + } + else if (!(connectionString.Equals(value))) { + this.Tables.Clear(); + DataTable newTable = CreateConnectionTable(); + // add the first and only column of this table; + newTable.Rows.Add(new object[] {name, invariantName, connectionString}); + } + } } public DbModelInfo() : base() diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs index 85f6aa74ab..03ce78faa9 100644 --- a/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs @@ -41,6 +41,13 @@ namespace SharpDbTools.Model } } + /// + /// + /// + /// The user readable name of the provider + /// the identifying name of the provider + /// the connection string for this connection + /// public static DbModelInfo Add(string name, string invariantName, string connectionString) { // TODO: add validation on name; invariant name @@ -53,6 +60,11 @@ namespace SharpDbTools.Model return dbModel; } + public static void Remove(string name) + { + cache.Remove(name); + } + public static DbModelInfo GetDbModelInfo(string name) { DbModelInfo modelInfo = null; bool exists = cache.TryGetValue(name, out modelInfo); diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs index be38eee956..a54948b2b8 100644 --- a/src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs @@ -194,25 +194,28 @@ namespace SharpDbTools ConnectionStringDefinitionDialog definitionDialog = new ConnectionStringDefinitionDialog(); DialogResult result = definitionDialog.ShowDialog(); + // if the dialog was cancelled then do nothing + if (result == DialogResult.Cancel) { + return; + } + // if the dialog was submitted and connection string has changed then clear the DbModelInfo metadata // note that is is not required for the Connection string to be valid - it may be work // in progress and a user might want to save a partially formed connection string - if (result == DialogResult.OK) { - DbModelInfo dbModelInfo = DbModelInfoService.GetDbModelInfo(connectionLogicalName); - string connectionString = dbModelInfo.ConnectionString; - string newConnectionString = definitionDialog.ConnectionString; - - if (connectionString == null && newConnectionString != null) { - //dbModelInfo.ConnectionString = newConnectionString; - //dbModelInfo.InvariantName = // TODO: START HERE sort out invariant name - } //else - } + + DbModelInfo dbModelInfo = DbModelInfoService.GetDbModelInfo(connectionLogicalName); + string connectionString = dbModelInfo.ConnectionString; + string newConnectionString = definitionDialog.ConnectionString; - // if the dialog was cancelled then do nothing - + if (newConnectionString == null) { + return; + } + if ((connectionString == null) || (!((newConnectionString.Equals(connectionString))))) { + dbModelInfo.ConnectionString = newConnectionString; + dbModelInfo.InvariantName = definitionDialog.InvariantName; + } } - } class DbModelInfoContextMenuStrip : ContextMenuStrip