miniSql

创建
zgc123@gmail.com authored at 11/19/2023 1:40:15 AM
6136600
Tree
0 Parent(s)
Summary: 9 changed files with 782 additions and 0 deletions.
Added +72 -0
Added +59 -0
Added +120 -0
Added +51 -0
Added +119 -0
Added +120 -0
Added +37 -0
Added +84 -0
Added +120 -0
Added +72 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.cs
new file mode 100644
index 0000000..2211260
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.cs
@@ -0,0 +1,72 @@
+#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;
+
+namespace MiniSqlQuery.Core.Controls
+{
+    /// <summary>A batch query selection control is used for displaying multiple result sets and allows
+    /// the user to select one (e.g. for exports etc).</summary>
+    public partial class BatchQuerySelectControl : UserControl
+    {
+        /// <summary>The _batch.</summary>
+        private QueryBatch _batch;
+
+        /// <summary>The _selected query.</summary>
+        private Query _selectedQuery;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="BatchQuerySelectControl"/> class.
+        /// </summary>
+        public BatchQuerySelectControl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// Gets the selected query.
+        /// </summary>
+        /// <value>The selected query.</value>
+        public Query SelectedQuery
+        {
+            get { return _selectedQuery; }
+        }
+
+        /// <summary>Fills the list with the batch result sets.</summary>
+        /// <param name="batch">The query batch.</param>
+        public void Fill(QueryBatch batch)
+        {
+            _batch = batch;
+            lstBatches.Items.Clear();
+            if (batch == null)
+            {
+                return;
+            }
+
+            for (int setIndex = 0; setIndex < batch.Queries.Count; setIndex++)
+            {
+                var query = batch.Queries[setIndex];
+                if (query.Result != null && query.Result.Tables.Count > 0)
+                {
+                    string setName = string.Format("Result Set {0} ({1} tables)", setIndex, query.Result.Tables.Count);
+                    lstBatches.Items.Add(setName);
+                }
+            }
+
+            lstBatches.SelectedIndex = 0;
+        }
+
+        /// <summary>The lst batches_ selected index changed.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void lstBatches_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            _selectedQuery = _batch.Queries[lstBatches.SelectedIndex];
+        }
+    }
+}
\ No newline at end of file
Added +59 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.Designer.cs
new file mode 100644
index 0000000..65790b3
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.Designer.cs
@@ -0,0 +1,59 @@
+namespace MiniSqlQuery.Core.Controls
+{
+	partial class BatchQuerySelectControl
+	{
+		/// <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 Component 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()
+		{
+			this.lstBatches = new System.Windows.Forms.ListBox();
+			this.SuspendLayout();
+			// 
+			// lstBatches
+			// 
+			this.lstBatches.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lstBatches.FormattingEnabled = true;
+			this.lstBatches.Location = new System.Drawing.Point(0, 0);
+			this.lstBatches.Name = "lstBatches";
+			this.lstBatches.Size = new System.Drawing.Size(293, 160);
+			this.lstBatches.TabIndex = 0;
+			this.lstBatches.SelectedIndexChanged += new System.EventHandler(this.lstBatches_SelectedIndexChanged);
+			// 
+			// BatchQuerySelectControl
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.Controls.Add(this.lstBatches);
+			this.Name = "BatchQuerySelectControl";
+			this.Size = new System.Drawing.Size(293, 163);
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.ListBox lstBatches;
+	}
+}
Added +120 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.resx
@@ -0,0 +1,120 @@
+<?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>
+</root>
\ No newline at end of file
Added +51 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.cs
new file mode 100644
index 0000000..be6a39b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.cs
@@ -0,0 +1,51 @@
+#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;
+
+namespace MiniSqlQuery.Core.Controls
+{
+    /// <summary>A basic control for displaying an unhandled exception.</summary>
+    public partial class ExceptionControl : UserControl
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ExceptionControl"/> class.
+        /// </summary>
+        public ExceptionControl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>Sets the exception to display.</summary>
+        /// <param name="exp">The exception object.</param>
+        public void SetException(Exception exp)
+        {
+            if (exp != null)
+            {
+                lblError.Text = exp.GetType().FullName;
+                txtMessage.Text = exp.Message;
+                txtDetails.Text = exp.ToString();
+            }
+        }
+
+        /// <summary>The exception control_ load.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void ExceptionControl_Load(object sender, EventArgs e)
+        {
+        }
+
+        /// <summary>The lnk copy_ link clicked.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void lnkCopy_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            Clipboard.SetText(txtDetails.Text);
+        }
+    }
+}
\ No newline at end of file
Added +119 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.Designer.cs
new file mode 100644
index 0000000..51a3d8d
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.Designer.cs
@@ -0,0 +1,119 @@
+namespace MiniSqlQuery.Core.Controls
+{
+	partial class ExceptionControl
+	{
+		/// <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 Component 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()
+		{
+			this.lblError = new System.Windows.Forms.Label();
+			this.txtMessage = new System.Windows.Forms.TextBox();
+			this.txtDetails = new System.Windows.Forms.TextBox();
+			this.label2 = new System.Windows.Forms.Label();
+			this.lnkCopy = new System.Windows.Forms.LinkLabel();
+			this.SuspendLayout();
+			// 
+			// lblError
+			// 
+			this.lblError.AutoSize = true;
+			this.lblError.Location = new System.Drawing.Point(3, 0);
+			this.lblError.Name = "lblError";
+			this.lblError.Size = new System.Drawing.Size(29, 13);
+			this.lblError.TabIndex = 0;
+			this.lblError.Text = "Error";
+			// 
+			// txtMessage
+			// 
+			this.txtMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.txtMessage.Location = new System.Drawing.Point(6, 16);
+			this.txtMessage.Multiline = true;
+			this.txtMessage.Name = "txtMessage";
+			this.txtMessage.ReadOnly = true;
+			this.txtMessage.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+			this.txtMessage.Size = new System.Drawing.Size(428, 54);
+			this.txtMessage.TabIndex = 1;
+			// 
+			// txtDetails
+			// 
+			this.txtDetails.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.txtDetails.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+			this.txtDetails.Location = new System.Drawing.Point(6, 94);
+			this.txtDetails.Multiline = true;
+			this.txtDetails.Name = "txtDetails";
+			this.txtDetails.ReadOnly = true;
+			this.txtDetails.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+			this.txtDetails.Size = new System.Drawing.Size(428, 142);
+			this.txtDetails.TabIndex = 3;
+			// 
+			// label2
+			// 
+			this.label2.AutoSize = true;
+			this.label2.Location = new System.Drawing.Point(3, 78);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(39, 13);
+			this.label2.TabIndex = 2;
+			this.label2.Text = "Details";
+			// 
+			// lnkCopy
+			// 
+			this.lnkCopy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.lnkCopy.AutoSize = true;
+			this.lnkCopy.Location = new System.Drawing.Point(344, 239);
+			this.lnkCopy.Name = "lnkCopy";
+			this.lnkCopy.Size = new System.Drawing.Size(90, 13);
+			this.lnkCopy.TabIndex = 4;
+			this.lnkCopy.TabStop = true;
+			this.lnkCopy.Text = "Copy to Clipboard";
+			this.lnkCopy.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkCopy_LinkClicked);
+			// 
+			// ExceptionControl
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.Controls.Add(this.lnkCopy);
+			this.Controls.Add(this.txtDetails);
+			this.Controls.Add(this.label2);
+			this.Controls.Add(this.txtMessage);
+			this.Controls.Add(this.lblError);
+			this.Name = "ExceptionControl";
+			this.Size = new System.Drawing.Size(437, 256);
+			this.Load += new System.EventHandler(this.ExceptionControl_Load);
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.Label lblError;
+		private System.Windows.Forms.TextBox txtMessage;
+		private System.Windows.Forms.TextBox txtDetails;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.LinkLabel lnkCopy;
+	}
+}
Added +120 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.resx
@@ -0,0 +1,120 @@
+<?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>
+</root>
\ No newline at end of file
Added +37 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.cs
new file mode 100644
index 0000000..28e2ff7
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.cs
@@ -0,0 +1,37 @@
+#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;
+
+namespace MiniSqlQuery.Core.Controls
+{
+    /// <summary>A simple control to display plugin details.</summary>
+    public partial class PluginListControl : UserControl
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="PluginListControl"/> class.
+        /// </summary>
+        public PluginListControl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>Sets the data source to the <paramref name="plugins"/>.</summary>
+        /// <param name="plugins">The plugins to display.</param>
+        public void SetDataSource(IPlugIn[] plugins)
+        {
+            foreach (IPlugIn plugin in plugins)
+            {
+                ListViewItem item = new ListViewItem(new[]
+                                                         {
+                                                             plugin.PluginName, plugin.PluginDescription, plugin.GetType().Assembly.FullName
+                                                         });
+                listView1.Items.Add(item);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +84 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.Designer.cs
new file mode 100644
index 0000000..7dd82b8
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.Designer.cs
@@ -0,0 +1,84 @@
+namespace MiniSqlQuery.Core.Controls
+{
+	partial class PluginListControl
+	{
+		/// <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 Component 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()
+		{
+			this.listView1 = new System.Windows.Forms.ListView();
+			this.columnHeaderName = new System.Windows.Forms.ColumnHeader();
+			this.columnHeaderDescription = new System.Windows.Forms.ColumnHeader();
+			this.columnHeaderAssembly = new System.Windows.Forms.ColumnHeader();
+			this.SuspendLayout();
+			// 
+			// listView1
+			// 
+			this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeaderName,
+            this.columnHeaderDescription,
+            this.columnHeaderAssembly});
+			this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.listView1.Location = new System.Drawing.Point(0, 0);
+			this.listView1.Name = "listView1";
+			this.listView1.Size = new System.Drawing.Size(361, 146);
+			this.listView1.TabIndex = 0;
+			this.listView1.UseCompatibleStateImageBehavior = false;
+			this.listView1.View = System.Windows.Forms.View.Details;
+			// 
+			// columnHeaderName
+			// 
+			this.columnHeaderName.Text = "Name";
+			this.columnHeaderName.Width = 150;
+			// 
+			// columnHeaderDescription
+			// 
+			this.columnHeaderDescription.Text = "Description";
+			this.columnHeaderDescription.Width = 200;
+			// 
+			// columnHeaderAssembly
+			// 
+			this.columnHeaderAssembly.Text = "Assembly";
+			this.columnHeaderAssembly.Width = 200;
+			// 
+			// PluginListControl
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.Controls.Add(this.listView1);
+			this.Name = "PluginListControl";
+			this.Size = new System.Drawing.Size(361, 146);
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.ListView listView1;
+		private System.Windows.Forms.ColumnHeader columnHeaderName;
+		private System.Windows.Forms.ColumnHeader columnHeaderDescription;
+		private System.Windows.Forms.ColumnHeader columnHeaderAssembly;
+	}
+}
Added +120 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.resx
@@ -0,0 +1,120 @@
+<?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>
+</root>
\ No newline at end of file