miniSql

创建
zgc123@gmail.com authored at 11/19/2023 1:40:15 AM
6136600
Tree
0 Parent(s)
Summary: 9 changed files with 1781 additions and 0 deletions.
Added +30 -0
Added +346 -0
Added +224 -0
Added +169 -0
Added +34 -0
Added +345 -0
Added +325 -0
Added +229 -0
Added +79 -0
Added +30 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/Commands/EditConnectionsFormCommand.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/Commands/EditConnectionsFormCommand.cs
new file mode 100644
index 0000000..c79e403
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/Commands/EditConnectionsFormCommand.cs
@@ -0,0 +1,30 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using MiniSqlQuery.Core;
+using MiniSqlQuery.Core.Commands;
+
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager.Commands
+{
+    /// <summary>The edit connections form command.</summary>
+    public class EditConnectionsFormCommand : CommandBase
+    {
+        /// <summary>Initializes a new instance of the <see cref="EditConnectionsFormCommand"/> class.</summary>
+        public EditConnectionsFormCommand()
+            : base("&Edit Connection Strings")
+        {
+            SmallImage = ImageResource.database_edit;
+        }
+
+        /// <summary>Execute the command.</summary>
+        public override void Execute()
+        {
+            DbConnectionsForm frm = Services.Resolve<DbConnectionsForm>();
+            frm.ShowDialog(HostWindow.Instance);
+        }
+    }
+}
\ No newline at end of file
Added +346 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.cs
new file mode 100644
index 0000000..b860634
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.cs
@@ -0,0 +1,346 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Data.Common;
+using System.Windows.Forms;
+using MiniSqlQuery.Core;
+using MiniSqlQuery.Properties;
+
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
+{
+    /// <summary>The connection string builder form.</summary>
+    public partial class ConnectionStringBuilderForm : Form
+    {
+        /// <summary>The _host window.</summary>
+        private readonly IHostWindow _hostWindow;
+
+        /// <summary>The _services.</summary>
+        private readonly IApplicationServices _services;
+
+        /// <summary>Gets or sets ConnectionDefinition.</summary>
+        public DbConnectionDefinition ConnectionDefinition { get; set; }
+
+        /// <summary>The default provider name.</summary>
+        public const string DefaultProviderName = "System.Data.SqlClient";
+
+        /// <summary>The _initialised.</summary>
+        private bool _initialised;
+
+        /// <summary>The _loaded.</summary>
+        private bool _loaded;
+
+        /// <summary>The _init provider.</summary>
+        private string _initProvider;
+
+        /// <summary>The _provider name.</summary>
+        private string _providerName = DefaultProviderName;
+
+        /// <summary>The _conn str.</summary>
+        private string _connStr;
+
+        /// <summary>The _conn str bldr.</summary>
+        private DbConnectionStringBuilder _connStrBldr;
+
+        /// <summary>The _dirty.</summary>
+        private bool _dirty;
+
+        /// <summary>Gets or sets ConnectionName.</summary>
+        public string ConnectionName
+        {
+            get { return txtConnectionName.Text; }
+            set { txtConnectionName.Text = value; }
+        }
+
+        /// <summary>Gets or sets Comments.</summary>
+        public string Comments
+        {
+            get { return txtComments.Text; }
+            set { txtComments.Text = value; }
+        }
+
+        /// <summary>Gets or sets ProviderName.</summary>
+        public string ProviderName
+        {
+            get { return _providerName; }
+            set
+            {
+                _providerName = value;
+                cboProvider.SelectedItem = _providerName;
+            }
+        }
+
+        /// <summary>
+        /// The supplied connection string - or if during an edit - the new one.
+        /// </summary>
+        public string ConnectionString
+        {
+            get
+            {
+                if (_connStrBldr != null)
+                {
+                    return _connStrBldr.ConnectionString;
+                }
+
+                return _connStr;
+            }
+
+            set
+            {
+                _connStr = value; // store
+                if (_connStrBldr == null)
+                {
+                    BindNewConnectionStringBuilder();
+                }
+            }
+        }
+
+        /// <summary>Gets DbConnectionStringBuilderInstance.</summary>
+        public DbConnectionStringBuilder DbConnectionStringBuilderInstance
+        {
+            get { return _connStrBldr; }
+        }
+
+
+        /// <summary>Initializes a new instance of the <see cref="ConnectionStringBuilderForm"/> class.</summary>
+        /// <param name="hostWindow">The host window.</param>
+        /// <param name="services">The services.</param>
+        public ConnectionStringBuilderForm(IHostWindow hostWindow, IApplicationServices services)
+        {
+            InitializeComponent();
+            _hostWindow = hostWindow;
+            _services = services;
+            Icon = ImageResource.database_edit_icon;
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="ConnectionStringBuilderForm"/> class.</summary>
+        /// <param name="hostWindow">The host window.</param>
+        /// <param name="definition">The definition.</param>
+        /// <param name="services">The services.</param>
+        public ConnectionStringBuilderForm(IHostWindow hostWindow, DbConnectionDefinition definition, IApplicationServices services)
+            : this(hostWindow, services)
+        {
+            ConnectionDefinition = definition;
+            ConnectionName = ConnectionDefinition.Name;
+            Comments = ConnectionDefinition.Comment;
+            _initProvider = ConnectionDefinition.ProviderName;
+            _connStr = ConnectionDefinition.ConnectionString;
+        }
+
+        /// <summary>The connection string builder form_ load.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void ConnectionStringBuilderForm_Load(object sender, EventArgs e)
+        {
+            cboProvider.DataSource = Utility.GetSqlProviderNames();
+            _initialised = true;
+        }
+
+        /// <summary>The connection string builder form_ shown.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void ConnectionStringBuilderForm_Shown(object sender, EventArgs e)
+        {
+            if (_initProvider == null)
+            {
+                ProviderName = DefaultProviderName;
+            }
+            else
+            {
+                ProviderName = _initProvider;
+            }
+
+            _loaded = true;
+        }
+
+        /// <summary>The connection string builder form_ form closing.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void ConnectionStringBuilderForm_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            if (_dirty)
+            {
+                DialogResult saveFile = _hostWindow.DisplayMessageBox(
+                    this,
+                    Resources.The_connection_details_have_changed__do_you_want_to_save, Resources.Save_Changes,
+                    MessageBoxButtons.YesNoCancel,
+                    MessageBoxIcon.Question,
+                    MessageBoxDefaultButton.Button1,
+                    0,
+                    null,
+                    null);
+
+                switch (saveFile)
+                {
+                    case DialogResult.Yes:
+                        WriteValuesBack();
+                        break;
+                    case DialogResult.Cancel:
+                        e.Cancel = true;
+                        break;
+                }
+            }
+        }
+
+
+        /// <summary>The tool strip button ok_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonOk_Click(object sender, EventArgs e)
+        {
+            DialogResult = DialogResult.OK;
+            WriteValuesBack();
+            Close();
+        }
+
+        /// <summary>The tool strip button cancel_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonCancel_Click(object sender, EventArgs e)
+        {
+            // todo - is dirty?
+            DialogResult = DialogResult.Cancel;
+            Close();
+        }
+
+        /// <summary>The write values back.</summary>
+        protected void WriteValuesBack()
+        {
+            if (ConnectionDefinition == null)
+            {
+                ConnectionDefinition = new DbConnectionDefinition();
+            }
+
+            ConnectionDefinition.Name = ConnectionName;
+            ConnectionDefinition.ProviderName = ProviderName;
+            ConnectionDefinition.ConnectionString = ConnectionString;
+            ConnectionDefinition.Comment = Comments;
+            _dirty = false;
+        }
+
+
+        /// <summary>The bind new connection string builder.</summary>
+        private void BindNewConnectionStringBuilder()
+        {
+            if (!_initialised)
+            {
+                return;
+            }
+
+            bool getBuilderFailed = false;
+            try
+            {
+                _connStrBldr = DbProviderFactories.GetFactory(ProviderName).CreateConnectionStringBuilder();
+                if (_connStrBldr == null)
+                {
+                    getBuilderFailed = true;
+                }
+            }
+            catch
+            {
+                getBuilderFailed = true;
+            }
+
+            if (getBuilderFailed)
+            {
+                _connStrBldr = new GenericConnectionStringBuilder();
+            }
+
+            try
+            {
+                _connStrBldr.ConnectionString = _connStr;
+            }
+            catch (ArgumentException argExp)
+            {
+                // consume error but notify
+                MessageBox.Show(Resources.BindNewConnectionStringBuilder_Could_not_populate_with_current_connection_string___ + argExp.Message);
+            }
+
+            propertyGridDbConnection.SelectedObject = _connStrBldr;
+        }
+
+        /// <summary>The cbo provider_ selected index changed.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void cboProvider_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (!_initialised)
+            {
+                return;
+            }
+
+            SetDirty();
+            if (cboProvider.SelectedItem != null)
+            {
+                ProviderName = cboProvider.SelectedItem.ToString();
+                BindNewConnectionStringBuilder();
+            }
+        }
+
+        /// <summary>The items text changed.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void ItemsTextChanged(object sender, EventArgs e)
+        {
+            SetDirty();
+        }
+
+        /// <summary>The property grid db connection_ property value changed.</summary>
+        /// <param name="s">The s.</param>
+        /// <param name="e">The e.</param>
+        private void propertyGridDbConnection_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
+        {
+            SetDirty();
+        }
+
+        /// <summary>The set dirty.</summary>
+        private void SetDirty()
+        {
+            if (!_loaded)
+            {
+                return;
+            }
+
+            if (!_dirty)
+            {
+                _dirty = true;
+                Text += "*";
+            }
+        }
+
+        /// <summary>The tool strip button test_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonTest_Click(object sender, EventArgs e)
+        {
+            // do a standalone raw connection test
+            Exception exp = QueryRunner.TestDbConnection(ProviderName, ConnectionString);
+            if (exp == null)
+            {
+                string msg = string.Format(Resources.Connected_to_0_successfully, ConnectionName);
+                _hostWindow.DisplaySimpleMessageBox(this, msg, Resources.Connection_Successful);
+            }
+            else
+            {
+                string msg = string.Format(Resources.Failed_connecting_to_0_1_2, ConnectionName, Environment.NewLine, exp.Message);
+                _hostWindow.DisplaySimpleMessageBox(this, msg, Resources.Connection_Failed);
+            }
+        }
+
+#if DEBUG
+
+        /// <summary>The to string.</summary>
+        /// <returns>The to string.</returns>
+        public override string ToString()
+        {
+            return string.Format("[ConnectionStringBuilderForm => Name: {0}; Provider: {1}; ConnectionString: {2}]", ConnectionName, ProviderName,
+                                 ConnectionString);
+        }
+
+#endif
+    }
+}
\ No newline at end of file
Added +224 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.Designer.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.Designer.cs
new file mode 100644
index 0000000..36e0d03
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.Designer.cs
@@ -0,0 +1,224 @@
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
+{
+	partial class ConnectionStringBuilderForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConnectionStringBuilderForm));
+			this.cboProvider = new System.Windows.Forms.ComboBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.groupBox1 = new System.Windows.Forms.GroupBox();
+			this.propertyGridDbConnection = new System.Windows.Forms.PropertyGrid();
+			this.label2 = new System.Windows.Forms.Label();
+			this.txtConnectionName = new System.Windows.Forms.TextBox();
+			this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+			this.toolStripButtonOk = new System.Windows.Forms.ToolStripButton();
+			this.toolStripButtonCancel = new System.Windows.Forms.ToolStripButton();
+			this.txtComments = new System.Windows.Forms.TextBox();
+			this.label3 = new System.Windows.Forms.Label();
+			this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+			this.toolStripButtonTest = new System.Windows.Forms.ToolStripButton();
+			this.groupBox1.SuspendLayout();
+			this.toolStrip1.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// cboProvider
+			// 
+			this.cboProvider.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.cboProvider.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+			this.cboProvider.FormattingEnabled = true;
+			this.cboProvider.Location = new System.Drawing.Point(120, 94);
+			this.cboProvider.Name = "cboProvider";
+			this.cboProvider.Size = new System.Drawing.Size(295, 21);
+			this.cboProvider.TabIndex = 5;
+			this.cboProvider.SelectedIndexChanged += new System.EventHandler(this.cboProvider_SelectedIndexChanged);
+			// 
+			// label1
+			// 
+			this.label1.AutoSize = true;
+			this.label1.Location = new System.Drawing.Point(12, 97);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(46, 13);
+			this.label1.TabIndex = 4;
+			this.label1.Text = "Provider";
+			// 
+			// groupBox1
+			// 
+			this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+						| System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.groupBox1.Controls.Add(this.propertyGridDbConnection);
+			this.groupBox1.Location = new System.Drawing.Point(12, 121);
+			this.groupBox1.Name = "groupBox1";
+			this.groupBox1.Size = new System.Drawing.Size(403, 288);
+			this.groupBox1.TabIndex = 10;
+			this.groupBox1.TabStop = false;
+			this.groupBox1.Text = "Connection Settings";
+			// 
+			// propertyGridDbConnection
+			// 
+			this.propertyGridDbConnection.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.propertyGridDbConnection.Location = new System.Drawing.Point(3, 16);
+			this.propertyGridDbConnection.Name = "propertyGridDbConnection";
+			this.propertyGridDbConnection.Size = new System.Drawing.Size(397, 269);
+			this.propertyGridDbConnection.TabIndex = 0;
+			this.propertyGridDbConnection.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.propertyGridDbConnection_PropertyValueChanged);
+			// 
+			// label2
+			// 
+			this.label2.AutoSize = true;
+			this.label2.Location = new System.Drawing.Point(12, 15);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(35, 13);
+			this.label2.TabIndex = 0;
+			this.label2.Text = "Name";
+			// 
+			// txtConnectionName
+			// 
+			this.txtConnectionName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.txtConnectionName.Location = new System.Drawing.Point(120, 12);
+			this.txtConnectionName.Name = "txtConnectionName";
+			this.txtConnectionName.Size = new System.Drawing.Size(295, 20);
+			this.txtConnectionName.TabIndex = 1;
+			this.txtConnectionName.TextChanged += new System.EventHandler(this.ItemsTextChanged);
+			// 
+			// toolStrip1
+			// 
+			this.toolStrip1.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripButtonOk,
+            this.toolStripButtonCancel,
+            this.toolStripSeparator1,
+            this.toolStripButtonTest});
+			this.toolStrip1.Location = new System.Drawing.Point(0, 412);
+			this.toolStrip1.Name = "toolStrip1";
+			this.toolStrip1.Size = new System.Drawing.Size(427, 25);
+			this.toolStrip1.TabIndex = 15;
+			this.toolStrip1.Text = "toolStrip1";
+			// 
+			// toolStripButtonOk
+			// 
+			this.toolStripButtonOk.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+			this.toolStripButtonOk.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonOk.Image")));
+			this.toolStripButtonOk.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.toolStripButtonOk.Name = "toolStripButtonOk";
+			this.toolStripButtonOk.Size = new System.Drawing.Size(27, 22);
+			this.toolStripButtonOk.Text = "&OK";
+			this.toolStripButtonOk.Click += new System.EventHandler(this.toolStripButtonOk_Click);
+			// 
+			// toolStripButtonCancel
+			// 
+			this.toolStripButtonCancel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+			this.toolStripButtonCancel.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonCancel.Image")));
+			this.toolStripButtonCancel.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.toolStripButtonCancel.Name = "toolStripButtonCancel";
+			this.toolStripButtonCancel.Size = new System.Drawing.Size(47, 22);
+			this.toolStripButtonCancel.Text = "&Cancel";
+			this.toolStripButtonCancel.Click += new System.EventHandler(this.toolStripButtonCancel_Click);
+			// 
+			// txtComments
+			// 
+			this.txtComments.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.txtComments.Location = new System.Drawing.Point(120, 38);
+			this.txtComments.Multiline = true;
+			this.txtComments.Name = "txtComments";
+			this.txtComments.Size = new System.Drawing.Size(295, 50);
+			this.txtComments.TabIndex = 3;
+			this.txtComments.TextChanged += new System.EventHandler(this.ItemsTextChanged);
+			// 
+			// label3
+			// 
+			this.label3.AutoSize = true;
+			this.label3.Location = new System.Drawing.Point(12, 41);
+			this.label3.Name = "label3";
+			this.label3.Size = new System.Drawing.Size(56, 13);
+			this.label3.TabIndex = 2;
+			this.label3.Text = "Comments";
+			// 
+			// toolStripSeparator1
+			// 
+			this.toolStripSeparator1.Name = "toolStripSeparator1";
+			this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+			// 
+			// toolStripButtonTest
+			// 
+			this.toolStripButtonTest.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+			this.toolStripButtonTest.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonTest.Image")));
+			this.toolStripButtonTest.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.toolStripButtonTest.Name = "toolStripButtonTest";
+			this.toolStripButtonTest.Size = new System.Drawing.Size(42, 22);
+			this.toolStripButtonTest.Text = "Test...";
+			this.toolStripButtonTest.Click += new System.EventHandler(this.toolStripButtonTest_Click);
+			// 
+			// ConnectionStringBuilderForm
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size(427, 437);
+			this.Controls.Add(this.txtComments);
+			this.Controls.Add(this.label3);
+			this.Controls.Add(this.toolStrip1);
+			this.Controls.Add(this.txtConnectionName);
+			this.Controls.Add(this.label2);
+			this.Controls.Add(this.groupBox1);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.cboProvider);
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "ConnectionStringBuilderForm";
+			this.Text = "Connection String Builder";
+			this.Load += new System.EventHandler(this.ConnectionStringBuilderForm_Load);
+			this.Shown += new System.EventHandler(this.ConnectionStringBuilderForm_Shown);
+			this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ConnectionStringBuilderForm_FormClosing);
+			this.groupBox1.ResumeLayout(false);
+			this.toolStrip1.ResumeLayout(false);
+			this.toolStrip1.PerformLayout();
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.ComboBox cboProvider;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.TextBox txtConnectionName;
+		private System.Windows.Forms.ToolStrip toolStrip1;
+		private System.Windows.Forms.ToolStripButton toolStripButtonCancel;
+		private System.Windows.Forms.ToolStripButton toolStripButtonOk;
+		private System.Windows.Forms.PropertyGrid propertyGridDbConnection;
+		private System.Windows.Forms.TextBox txtComments;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+		private System.Windows.Forms.ToolStripButton toolStripButtonTest;
+	}
+}
\ No newline at end of file
Added +169 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.resx b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.resx
new file mode 100644
index 0000000..bfb5614
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringBuilderForm.resx
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="toolStripButtonOk.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="toolStripButtonCancel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="toolStripButtonTest.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+</root>
\ No newline at end of file
Added +34 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringsManagerLoader.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringsManagerLoader.cs
new file mode 100644
index 0000000..5f8965c
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/ConnectionStringsManagerLoader.cs
@@ -0,0 +1,34 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+using MiniSqlQuery.Core;
+using MiniSqlQuery.PlugIns.ConnectionStringsManager.Commands;
+
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
+{
+    /// <summary>The connection strings manager loader.</summary>
+    public class ConnectionStringsManagerLoader : PluginLoaderBase
+    {
+        /// <summary>Initializes a new instance of the <see cref="ConnectionStringsManagerLoader"/> class.</summary>
+        public ConnectionStringsManagerLoader() : base(
+            "Connection String Manager",
+            "A Mini SQL Query Plugin for managing the list of connection strings.",
+            10)
+        {
+        }
+
+        /// <summary>Iinitialize the plug in.</summary>
+        public override void InitializePlugIn()
+        {
+            Services.RegisterComponent<DbConnectionsForm>("DbConnectionsForm");
+            ToolStripMenuItem editMenu = Services.HostWindow.GetMenuItem("edit");
+            editMenu.DropDownItems.Add(CommandControlBuilder.CreateToolStripMenuItem<EditConnectionsFormCommand>());
+            Services.HostWindow.AddToolStripCommand<EditConnectionsFormCommand>(null);
+        }
+    }
+}
\ No newline at end of file
Added +345 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.cs
new file mode 100644
index 0000000..b3fdbbc
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.cs
@@ -0,0 +1,345 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Windows.Forms;
+using MiniSqlQuery.Core;
+using MiniSqlQuery.Properties;
+
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
+{
+    /// <summary>The db connections form.</summary>
+    public partial class DbConnectionsForm : Form
+    {
+        /// <summary>The _host window.</summary>
+        private readonly IHostWindow _hostWindow;
+
+        /// <summary>The _services.</summary>
+        private readonly IApplicationServices _services;
+
+        /// <summary>The _settings.</summary>
+        private readonly IApplicationSettings _settings;
+
+        /// <summary>The _definition list.</summary>
+        private DbConnectionDefinitionList _definitionList;
+
+        private bool _loaded;
+
+        private bool _dirty;
+
+        /// <summary>Initializes a new instance of the <see cref="DbConnectionsForm"/> class.</summary>
+        public DbConnectionsForm()
+        {
+            InitializeComponent();
+            toolStripButtonAdd.Image = ImageResource.database_add;
+            toolStripButtonCopyAsNew.Image = ImageResource.database_add;
+            toolStripButtonEditConnStr.Image = ImageResource.database_edit;
+            toolStripButtonDelete.Image = ImageResource.database_delete;
+            Icon = ImageResource.disconnect_icon;
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="DbConnectionsForm"/> class.</summary>
+        /// <param name="services">The services.</param>
+        /// <param name="hostWindow">The host window.</param>
+        /// <param name="settings">The settings.</param>
+        public DbConnectionsForm(IApplicationServices services, IHostWindow hostWindow, IApplicationSettings settings)
+            : this()
+        {
+            _services = services;
+            _hostWindow = hostWindow;
+            _settings = settings;
+        }
+
+        /// <summary>The load connection definitions.</summary>
+        /// <returns></returns>
+        private static DbConnectionDefinitionList LoadConnectionDefinitions()
+        {
+            return DbConnectionDefinitionList.FromXml(Utility.LoadConnections());
+        }
+
+
+        /// <summary>The add to list.</summary>
+        /// <param name="definition">The definition.</param>
+        private void AddToList(DbConnectionDefinition definition)
+        {
+            if (!lstConnections.Items.Contains(definition))
+            {
+                lstConnections.Items.Add(definition);
+                SetDirty();
+            }
+        }
+
+        /// <summary>The db connections form_ form closing.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void DbConnectionsForm_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            if (_dirty)
+            {
+                DialogResult saveFile = _hostWindow.DisplayMessageBox(
+                    this,
+                    Resources.The_connection_details_have_changed__do_you_want_to_save,
+                    Resources.Save_Changes,
+                    MessageBoxButtons.YesNoCancel,
+                    MessageBoxIcon.Question,
+                    MessageBoxDefaultButton.Button1,
+                    0,
+                    null,
+                    null);
+
+                switch (saveFile)
+                {
+                    case DialogResult.Yes:
+                        SaveConnectionDefinitions(_definitionList);
+                        break;
+                    case DialogResult.Cancel:
+                        e.Cancel = true;
+                        break;
+                }
+            }
+        }
+
+        /// <summary>The db connections form_ shown.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void DbConnectionsForm_Shown(object sender, EventArgs e)
+        {
+            _definitionList = LoadConnectionDefinitions();
+            UpdateListView();
+            _loaded = true;
+        }
+
+        /// <summary>The manage definition.</summary>
+        /// <param name="definition">The definition.</param>
+        private void ManageDefinition(DbConnectionDefinition definition)
+        {
+            ConnectionStringBuilderForm frm;
+            string oldName = null;
+
+            if (definition == null)
+            {
+                frm = new ConnectionStringBuilderForm(_hostWindow, _services); // new blank form
+            }
+            else
+            {
+                oldName = definition.Name;
+                frm = new ConnectionStringBuilderForm(_hostWindow, definition, _services);
+            }
+
+            frm.ShowDialog(this);
+
+            if (frm.DialogResult == DialogResult.OK)
+            {
+                SetDirty();
+
+                if (lstConnections.Items.Contains(frm.ConnectionDefinition) && definition != null)
+                {
+                    if (definition.Name != oldName)
+                    {
+                        // want the list text to update due to name change
+                        UpdateListView();
+                        lstConnections.SelectedItem = definition;
+                    }
+                    else
+                    {
+                        UpdateDetailsPanel(lstConnections.SelectedItem as DbConnectionDefinition);
+                    }
+                }
+                else
+                {
+                    _definitionList.AddDefinition(frm.ConnectionDefinition);
+                    AddToList(frm.ConnectionDefinition);
+                    lstConnections.SelectedItem = frm.ConnectionDefinition;
+                }
+            }
+        }
+
+        /// <summary>The remove from list.</summary>
+        /// <param name="definition">The definition.</param>
+        private void RemoveFromList(DbConnectionDefinition definition)
+        {
+            if (lstConnections.Items.Contains(definition))
+            {
+                lstConnections.Items.Remove(definition);
+                SetDirty();
+            }
+        }
+
+
+        /// <summary>The save connection definitions.</summary>
+        /// <param name="data">The data.</param>
+        private void SaveConnectionDefinitions(DbConnectionDefinitionList data)
+        {
+            _settings.SetConnectionDefinitions(data);
+            Utility.SaveConnections(data);
+            _dirty = false;
+        }
+
+        /// <summary>The update details panel.</summary>
+        /// <param name="definition">The definition.</param>
+        private void UpdateDetailsPanel(DbConnectionDefinition definition)
+        {
+            if (definition != null)
+            {
+                txtName.Text = definition.Name;
+                txtProvider.Text = definition.ProviderName;
+                txtConn.Text = definition.ConnectionString;
+                txtComment.Text = definition.Comment;
+            }
+            else
+            {
+                txtName.Clear();
+                txtProvider.Clear();
+                txtConn.Clear();
+                txtComment.Clear();
+            }
+        }
+
+        /// <summary>The update list view.</summary>
+        private void UpdateListView()
+        {
+            if (_definitionList.Definitions != null && _definitionList.Definitions.Length > 0)
+            {
+                lstConnections.Items.Clear();
+                lstConnections.Items.AddRange(_definitionList.Definitions);
+                lstConnections.SelectedItem = _definitionList.Definitions[0];
+            }
+        }
+
+        /// <summary>The lst connections_ double click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void lstConnections_DoubleClick(object sender, EventArgs e)
+        {
+            DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+            if (definition != null)
+            {
+                ManageDefinition(definition);
+            }
+        }
+
+        /// <summary>The lst connections_ selected value changed.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void lstConnections_SelectedValueChanged(object sender, EventArgs e)
+        {
+            DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+            UpdateDetailsPanel(definition);
+        }
+
+        /// <summary>The tool strip button add_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonAdd_Click(object sender, EventArgs e)
+        {
+            ManageDefinition(null);
+        }
+
+        /// <summary>The tool strip button cancel_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonCancel_Click(object sender, EventArgs e)
+        {
+            Close();
+        }
+
+        /// <summary>The tool strip button copy as new_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonCopyAsNew_Click(object sender, EventArgs e)
+        {
+            DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+            if (definition != null)
+            {
+                DbConnectionDefinition newDefinition = DbConnectionDefinition.FromXml(definition.ToXml());
+                newDefinition.Name = "Copy of " + newDefinition.Name;
+                ManageDefinition(newDefinition);
+            }
+        }
+
+        /// <summary>The tool strip button delete_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonDelete_Click(object sender, EventArgs e)
+        {
+            DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+            if (definition != null)
+            {
+                int newIndex = Math.Max(lstConnections.SelectedIndex - 1, 0);
+                _definitionList.RemoveDefinition(definition);
+                RemoveFromList(definition);
+                if (lstConnections.Items.Count > 0)
+                {
+                    lstConnections.SelectedIndex = newIndex;
+                }
+            }
+        }
+
+        /// <summary>The tool strip button edit conn str_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonEditConnStr_Click(object sender, EventArgs e)
+        {
+            DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+            if (definition != null)
+            {
+                ManageDefinition(definition);
+            }
+        }
+
+        /// <summary>The tool strip button ok_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonOk_Click(object sender, EventArgs e)
+        {
+            SaveConnectionDefinitions(_definitionList);
+            Close();
+        }
+
+        /// <summary>The tool strip button test_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void toolStripButtonTest_Click(object sender, EventArgs e)
+        {
+            // do a standalone raw connection test
+            DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+            if (definition != null)
+            {
+                Exception exp = QueryRunner.TestDbConnection(definition.ProviderName, definition.ConnectionString);
+                if (exp == null)
+                {
+                    string msg = string.Format("Connected to '{0}' successfully.", definition.Name);
+                    _hostWindow.DisplaySimpleMessageBox(this, msg, "Connection Successful");
+                }
+                else
+                {
+                    string msg = string.Format("Failed connecting to '{0}'.{1}{2}", definition.Name, Environment.NewLine, exp.Message);
+                    _hostWindow.DisplaySimpleMessageBox(this, msg, "Connection Failed");
+                }
+            }
+        }
+
+        private void DbConnectionsForm_Load(object sender, EventArgs e)
+        {
+
+        }
+
+        private void SetDirty()
+        {
+            if (!_loaded)
+            {
+                return;
+            }
+
+            if (!_dirty)
+            {
+                _dirty = true;
+                Text += "*";
+            }
+        }
+    }
+}
\ No newline at end of file
Added +325 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.Designer.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.Designer.cs
new file mode 100644
index 0000000..ea1f002
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.Designer.cs
@@ -0,0 +1,325 @@
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
+{
+	partial class DbConnectionsForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DbConnectionsForm));
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.toolStripButtonOk = new System.Windows.Forms.ToolStripButton();
+            this.toolStripButtonCancel = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.toolStripButtonAdd = new System.Windows.Forms.ToolStripButton();
+            this.toolStripButtonCopyAsNew = new System.Windows.Forms.ToolStripButton();
+            this.toolStripButtonEditConnStr = new System.Windows.Forms.ToolStripButton();
+            this.toolStripButtonDelete = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.toolStripButtonTest = new System.Windows.Forms.ToolStripButton();
+            this.lstConnections = new System.Windows.Forms.ListBox();
+            this.grpDetails = new System.Windows.Forms.GroupBox();
+            this.txtComment = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.txtConn = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.txtProvider = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtName = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.toolStrip1.SuspendLayout();
+            this.grpDetails.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripButtonOk,
+            this.toolStripButtonCancel,
+            this.toolStripSeparator1,
+            this.toolStripButtonAdd,
+            this.toolStripButtonCopyAsNew,
+            this.toolStripButtonEditConnStr,
+            this.toolStripButtonDelete,
+            this.toolStripSeparator2,
+            this.toolStripButtonTest});
+            this.toolStrip1.Location = new System.Drawing.Point(0, 342);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(881, 27);
+            this.toolStrip1.TabIndex = 4;
+            this.toolStrip1.Text = "toolStrip1";
+            // 
+            // toolStripButtonOk
+            // 
+            this.toolStripButtonOk.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+            this.toolStripButtonOk.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonOk.Image")));
+            this.toolStripButtonOk.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButtonOk.Name = "toolStripButtonOk";
+            this.toolStripButtonOk.Size = new System.Drawing.Size(33, 24);
+            this.toolStripButtonOk.Text = "&OK";
+            this.toolStripButtonOk.Click += new System.EventHandler(this.toolStripButtonOk_Click);
+            // 
+            // toolStripButtonCancel
+            // 
+            this.toolStripButtonCancel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+            this.toolStripButtonCancel.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonCancel.Image")));
+            this.toolStripButtonCancel.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButtonCancel.Name = "toolStripButtonCancel";
+            this.toolStripButtonCancel.Size = new System.Drawing.Size(57, 24);
+            this.toolStripButtonCancel.Text = "&Cancel";
+            this.toolStripButtonCancel.Click += new System.EventHandler(this.toolStripButtonCancel_Click);
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 27);
+            // 
+            // toolStripButtonAdd
+            // 
+            this.toolStripButtonAdd.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonAdd.Image")));
+            this.toolStripButtonAdd.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButtonAdd.Name = "toolStripButtonAdd";
+            this.toolStripButtonAdd.Size = new System.Drawing.Size(57, 24);
+            this.toolStripButtonAdd.Text = "Add";
+            this.toolStripButtonAdd.ToolTipText = "Add";
+            this.toolStripButtonAdd.Click += new System.EventHandler(this.toolStripButtonAdd_Click);
+            // 
+            // toolStripButtonCopyAsNew
+            // 
+            this.toolStripButtonCopyAsNew.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonCopyAsNew.Image")));
+            this.toolStripButtonCopyAsNew.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButtonCopyAsNew.Name = "toolStripButtonCopyAsNew";
+            this.toolStripButtonCopyAsNew.Size = new System.Drawing.Size(115, 24);
+            this.toolStripButtonCopyAsNew.Text = "Copy as New";
+            this.toolStripButtonCopyAsNew.Click += new System.EventHandler(this.toolStripButtonCopyAsNew_Click);
+            // 
+            // toolStripButtonEditConnStr
+            // 
+            this.toolStripButtonEditConnStr.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonEditConnStr.Image")));
+            this.toolStripButtonEditConnStr.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButtonEditConnStr.Name = "toolStripButtonEditConnStr";
+            this.toolStripButtonEditConnStr.Size = new System.Drawing.Size(55, 24);
+            this.toolStripButtonEditConnStr.Text = "Edit";
+            this.toolStripButtonEditConnStr.Click += new System.EventHandler(this.toolStripButtonEditConnStr_Click);
+            // 
+            // toolStripButtonDelete
+            // 
+            this.toolStripButtonDelete.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonDelete.Image")));
+            this.toolStripButtonDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButtonDelete.Name = "toolStripButtonDelete";
+            this.toolStripButtonDelete.Size = new System.Drawing.Size(73, 24);
+            this.toolStripButtonDelete.Text = "Delete";
+            this.toolStripButtonDelete.Click += new System.EventHandler(this.toolStripButtonDelete_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 27);
+            // 
+            // toolStripButtonTest
+            // 
+            this.toolStripButtonTest.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+            this.toolStripButtonTest.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonTest.Image")));
+            this.toolStripButtonTest.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButtonTest.Name = "toolStripButtonTest";
+            this.toolStripButtonTest.Size = new System.Drawing.Size(49, 24);
+            this.toolStripButtonTest.Text = "Test...";
+            this.toolStripButtonTest.Click += new System.EventHandler(this.toolStripButtonTest_Click);
+            // 
+            // lstConnections
+            // 
+            this.lstConnections.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left)));
+            this.lstConnections.FormattingEnabled = true;
+            this.lstConnections.ItemHeight = 16;
+            this.lstConnections.Location = new System.Drawing.Point(16, 15);
+            this.lstConnections.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.lstConnections.Name = "lstConnections";
+            this.lstConnections.Size = new System.Drawing.Size(335, 292);
+            this.lstConnections.TabIndex = 5;
+            this.lstConnections.SelectedValueChanged += new System.EventHandler(this.lstConnections_SelectedValueChanged);
+            this.lstConnections.DoubleClick += new System.EventHandler(this.lstConnections_DoubleClick);
+            // 
+            // grpDetails
+            // 
+            this.grpDetails.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.grpDetails.Controls.Add(this.txtComment);
+            this.grpDetails.Controls.Add(this.label4);
+            this.grpDetails.Controls.Add(this.txtConn);
+            this.grpDetails.Controls.Add(this.label3);
+            this.grpDetails.Controls.Add(this.txtProvider);
+            this.grpDetails.Controls.Add(this.label2);
+            this.grpDetails.Controls.Add(this.txtName);
+            this.grpDetails.Controls.Add(this.label1);
+            this.grpDetails.Location = new System.Drawing.Point(360, 15);
+            this.grpDetails.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.grpDetails.Name = "grpDetails";
+            this.grpDetails.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.grpDetails.Size = new System.Drawing.Size(505, 319);
+            this.grpDetails.TabIndex = 6;
+            this.grpDetails.TabStop = false;
+            this.grpDetails.Text = "Details";
+            // 
+            // txtComment
+            // 
+            this.txtComment.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtComment.Location = new System.Drawing.Point(133, 206);
+            this.txtComment.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.txtComment.Multiline = true;
+            this.txtComment.Name = "txtComment";
+            this.txtComment.ReadOnly = true;
+            this.txtComment.Size = new System.Drawing.Size(363, 105);
+            this.txtComment.TabIndex = 7;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(8, 209);
+            this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(67, 17);
+            this.label4.TabIndex = 6;
+            this.label4.Text = "Comment";
+            // 
+            // txtConn
+            // 
+            this.txtConn.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtConn.Location = new System.Drawing.Point(133, 87);
+            this.txtConn.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.txtConn.Multiline = true;
+            this.txtConn.Name = "txtConn";
+            this.txtConn.ReadOnly = true;
+            this.txtConn.Size = new System.Drawing.Size(363, 110);
+            this.txtConn.TabIndex = 5;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(8, 91);
+            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(79, 17);
+            this.label3.TabIndex = 4;
+            this.label3.Text = "Connection";
+            // 
+            // txtProvider
+            // 
+            this.txtProvider.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtProvider.Location = new System.Drawing.Point(133, 55);
+            this.txtProvider.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.txtProvider.Name = "txtProvider";
+            this.txtProvider.ReadOnly = true;
+            this.txtProvider.Size = new System.Drawing.Size(363, 22);
+            this.txtProvider.TabIndex = 3;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(8, 59);
+            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(61, 17);
+            this.label2.TabIndex = 2;
+            this.label2.Text = "Provider";
+            // 
+            // txtName
+            // 
+            this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtName.Location = new System.Drawing.Point(133, 23);
+            this.txtName.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.txtName.Name = "txtName";
+            this.txtName.ReadOnly = true;
+            this.txtName.Size = new System.Drawing.Size(363, 22);
+            this.txtName.TabIndex = 1;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(8, 27);
+            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(45, 17);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Name";
+            // 
+            // DbConnectionsForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(881, 369);
+            this.Controls.Add(this.grpDetails);
+            this.Controls.Add(this.lstConnections);
+            this.Controls.Add(this.toolStrip1);
+            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "DbConnectionsForm";
+            this.ShowIcon = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Database Connection List Editor";
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DbConnectionsForm_FormClosing);
+            this.Load += new System.EventHandler(this.DbConnectionsForm_Load);
+            this.Shown += new System.EventHandler(this.DbConnectionsForm_Shown);
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.grpDetails.ResumeLayout(false);
+            this.grpDetails.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.ToolStrip toolStrip1;
+		private System.Windows.Forms.ToolStripButton toolStripButtonOk;
+		private System.Windows.Forms.ToolStripButton toolStripButtonCancel;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+		private System.Windows.Forms.ToolStripButton toolStripButtonEditConnStr;
+		private System.Windows.Forms.ListBox lstConnections;
+		private System.Windows.Forms.GroupBox grpDetails;
+		private System.Windows.Forms.TextBox txtProvider;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.TextBox txtName;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.TextBox txtComment;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.TextBox txtConn;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.ToolStripButton toolStripButtonAdd;
+		private System.Windows.Forms.ToolStripButton toolStripButtonDelete;
+		private System.Windows.Forms.ToolStripButton toolStripButtonCopyAsNew;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+		private System.Windows.Forms.ToolStripButton toolStripButtonTest;
+	}
+}
\ No newline at end of file
Added +229 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.resx b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.resx
new file mode 100644
index 0000000..3b9a305
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.resx
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="toolStripButtonOk.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="toolStripButtonCancel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="toolStripButtonAdd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="toolStripButtonCopyAsNew.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="toolStripButtonEditConnStr.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="toolStripButtonDelete.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="toolStripButtonTest.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+</root>
\ No newline at end of file
Added +79 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/GenericConnectionStringBuilder.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/GenericConnectionStringBuilder.cs
new file mode 100644
index 0000000..5fa0aca
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/GenericConnectionStringBuilder.cs
@@ -0,0 +1,79 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Collections;
+using System.ComponentModel;
+using System.Data.Common;
+using System.Reflection;
+
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
+{
+    /// <summary>The generic connection string builder.</summary>
+    [DefaultMember("Item"), DefaultProperty("ConnectionString")]
+    public class GenericConnectionStringBuilder : DbConnectionStringBuilder
+    {
+        /// <summary>The _properties.</summary>
+        private Hashtable _properties;
+
+        /// <summary>Initializes a new instance of the <see cref="GenericConnectionStringBuilder"/> class.</summary>
+        public GenericConnectionStringBuilder()
+        {
+            Initialize(null);
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="GenericConnectionStringBuilder"/> class.</summary>
+        /// <param name="connectionString">The connection string.</param>
+        public GenericConnectionStringBuilder(string connectionString)
+        {
+            Initialize(connectionString);
+        }
+
+        /// <summary>The try get value.</summary>
+        /// <param name="keyword">The keyword.</param>
+        /// <param name="value">The value.</param>
+        /// <returns>The try get value.</returns>
+        public override bool TryGetValue(string keyword, out object value)
+        {
+            bool success = base.TryGetValue(keyword, out value);
+            if (_properties.ContainsKey(keyword))
+            {
+                PropertyDescriptor descriptor = _properties[keyword] as PropertyDescriptor;
+                if (descriptor == null)
+                {
+                    return success;
+                }
+
+                if (success)
+                {
+                    value = TypeDescriptor.GetConverter(descriptor.PropertyType).ConvertFrom(value);
+                    return success;
+                }
+
+                DefaultValueAttribute attribute = descriptor.Attributes[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
+                if (attribute != null)
+                {
+                    value = attribute.Value;
+                    success = true;
+                }
+            }
+
+            return success;
+        }
+
+        /// <summary>The initialize.</summary>
+        /// <param name="cnnString">The cnn string.</param>
+        private void Initialize(string cnnString)
+        {
+            _properties = new Hashtable();
+            this.GetProperties(_properties);
+            if (!string.IsNullOrEmpty(cnnString))
+            {
+                ConnectionString = cnnString;
+            }
+        }
+    }
+}
\ No newline at end of file