miniSql

创建
zgc123@gmail.com authored at 11/19/2023 1:40:15 AM
6136600
Tree
0 Parent(s)
Summary: 14 changed files with 1448 additions and 0 deletions.
Added +6 -0
Added +18 -0
Added +98 -0
Added +89 -0
Added +13 -0
Added +275 -0
Added +429 -0
Added +153 -0
Added +17 -0
Added +113 -0
Added +40 -0
Added +73 -0
Added +124 -0
Added +0 -0
Added +6 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/app.config b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/app.config
new file mode 100644
index 0000000..b5a9018
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/app.config
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<configuration>
+  <startup>
+    <supportedRuntime version="v2.0.50727"/>
+  </startup>
+</configuration>
Added +18 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Commands/ShowExportWindowCommand.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Commands/ShowExportWindowCommand.cs
new file mode 100644
index 0000000..90df497
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Commands/ShowExportWindowCommand.cs
@@ -0,0 +1,18 @@
+using MiniSqlQuery.Core.Commands;
+
+namespace MiniSqlQuery.Exports.Plugin.Commands
+{
+    public class ShowExportWindowCommand : CommandBase
+    {
+        public ShowExportWindowCommand()
+            : base("&Export data...")
+        {
+        }
+
+        public override void Execute()
+        {
+            ExportWindow frm = new ExportWindow(Services);
+            frm.Show(Services.HostWindow.Instance);
+        }
+    }
+}
\ No newline at end of file
Added +98 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/CSVExport.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/CSVExport.cs
new file mode 100644
index 0000000..b55807a
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/CSVExport.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Data;
+using System.IO;
+
+namespace MiniSqlQuery.Exports.Plugin.Export
+{
+    public class CSVExport
+    {
+        #region Delegates
+
+        public delegate void WrittenData(string text);
+
+        #endregion
+
+        public static event WrittenData OnWrittenData;
+
+        public static void ExportToCSV(DataTable source, string fileName, bool fileNamesFirstRow)
+        {
+            // Create the CSV file to which grid data will be exported.
+            StreamWriter sw = new StreamWriter(fileName, false);
+            // First we will write the headers.
+            DataTable dt = source;
+            int iColCount = dt.Columns.Count;
+
+            if (fileNamesFirstRow)
+            {
+                for (int i = 0; i < iColCount; i++)
+                {
+                    CsvWrite(sw, dt.Columns[i].ColumnName);
+                    if (i < iColCount - 1)
+                    {
+                        sw.Write(",");
+                    }
+                    if (OnWrittenData != null)
+                    {
+                        OnWrittenData(string.Format("Wrote column name {0}", i));
+                    }
+                }
+                sw.Write(sw.NewLine);
+                if (OnWrittenData != null)
+                {
+                    OnWrittenData("Wrote filednames row..");
+                }
+            }
+            // Now write all the rows.
+            int counter = 0;
+            foreach (DataRow dr in dt.Rows)
+            {
+                for (int i = 0; i < iColCount; i++)
+                {
+                    if (!Convert.IsDBNull(dr[i]))
+                    {
+                        CsvWrite(sw, dr[i].ToString());
+                    }
+                    if (i < iColCount - 1)
+                    {
+                        sw.Write(",");
+                    }
+                }
+                sw.Write(sw.NewLine);
+                counter++;
+                if (OnWrittenData != null)
+                {
+                    OnWrittenData(string.Format("Wrote row {0}", counter));
+                }
+            }
+            sw.Close();
+            if (OnWrittenData != null)
+            {
+                OnWrittenData("Finished exporting CSV file to " + fileName);
+            }
+        }
+
+        /// <summary>
+        /// Perform a CSV compliant wtrite of <paramref name="text"/> to the <paramref name="sw"/>.
+        /// Handles commas, quotes and newlines.
+        /// </summary>
+        /// <param name="sw">The writer.</param>
+        /// <param name="text">The text.</param>
+        private static void CsvWrite(TextWriter sw, string text)
+        {
+            if (text != null)
+            {
+                bool needsQuotes = false;
+                if (text.Contains("\"") || text.Contains(",") || text.Contains("\n"))
+                {
+                    needsQuotes = true;
+                    text = text.Replace("\"", "\"\"");
+                }
+                if (needsQuotes)
+                {
+                    text = string.Concat("\"", text, "\"");
+                }
+                sw.Write(text);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +89 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/HtmlExport.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/HtmlExport.cs
new file mode 100644
index 0000000..3a989af
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/HtmlExport.cs
@@ -0,0 +1,89 @@
+using System.Data;
+using System.Text;
+
+namespace MiniSqlQuery.Exports.Plugin.Export
+{
+    public class HtmlExport
+    {
+        public delegate void WrittenData(string text);
+
+        public static event WrittenData OnWrittenData;
+
+        public static void ExportToHTML(DataTable source, string fileName, HtmlExportFormat format)
+        {
+            StringBuilder sbCss = new StringBuilder();
+            StringBuilder sbHtml = new StringBuilder();
+            bool isAltSet = false;
+
+            sbCss.Append("<style>");
+            sbCss.Append("body { font-family:" + format.FontFamily + "; font-size:" + format.FontSize + "; color:" + format.FontColor + "; }");
+            sbCss.Append(".Header {background-color:" + format.HeaderColor + "}");
+            sbCss.Append(".Row    {background-color:" + format.RowColor + "}");
+            sbCss.Append(".AltRow    {background-color:" + format.RowAltColor + "}");
+            sbCss.Append("</style>");
+
+            //this.SetStatusText = "Created style for html";
+
+            sbHtml.Append("<html>");
+            sbHtml.Append("<head><title>Export from " + source.TableName + "</title>");
+            sbHtml.Append(sbCss.ToString());
+            sbHtml.Append("</head>");
+            sbHtml.Append("<body>");
+
+            int fields = source.Columns.Count;
+            sbHtml.Append("<table border='0' cellpadding='2'");
+            sbHtml.Append("<tr>");
+            for (int i = 0; i < fields; i++)
+            {
+                sbHtml.Append(string.Format("<td class='Header'>{0}</td>", source.Columns[i].ColumnName));
+
+                if (OnWrittenData != null)
+                {
+                    OnWrittenData("Writing column name " + i);
+                }
+            }
+            sbHtml.Append("</tr>");
+
+            int counter = 0;
+            foreach (DataRow dr in source.Rows)
+            {
+                sbHtml.Append("<tr>");
+
+                for (int i = 0; i < fields; i++)
+                {
+                    if (isAltSet)
+                    {
+                        sbHtml.Append(string.Format("<td class='AltRow'>{0}</td>", dr[i]));
+                    }
+                    else
+                    {
+                        sbHtml.Append(string.Format("<td class='Row'>{0}</td>", dr[i]));
+                    }
+                }
+                counter++;
+                if (OnWrittenData != null)
+                {
+                    OnWrittenData("Writing row " + counter);
+                }
+
+                sbHtml.Append("</tr>");
+
+                if (isAltSet == false)
+                    isAltSet = true;
+                else
+                    isAltSet = false;
+            }
+            sbHtml.Append("</table>");
+            sbHtml.Append("</body></html>");
+
+
+            System.IO.TextWriter tw = new System.IO.StreamWriter(fileName);
+            tw.WriteLine(sbHtml.ToString());
+            tw.Close();
+            if (OnWrittenData != null)
+            {
+                OnWrittenData("Finished exporting to html file");
+            }
+        }
+    }
+}
\ No newline at end of file
Added +13 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/HtmlExportFormat.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/HtmlExportFormat.cs
new file mode 100644
index 0000000..fdd0c14
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Export/HtmlExportFormat.cs
@@ -0,0 +1,13 @@
+namespace MiniSqlQuery.Exports.Plugin.Export
+{
+    public class HtmlExportFormat
+    {
+        public string FontFamily { get; set; }
+        public string FontSize { get; set; }
+        public string FontColor { get; set; }
+
+        public string HeaderColor { get; set; }
+        public string RowColor { get; set; }
+        public string RowAltColor { get; set; }
+    }
+}
\ No newline at end of file
Added +275 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.cs
new file mode 100644
index 0000000..d75de71
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.cs
@@ -0,0 +1,275 @@
+using System;
+using System.Data;
+using System.Windows.Forms;
+using MiniSqlQuery.Core;
+using MiniSqlQuery.Core.Forms;
+
+namespace MiniSqlQuery.Exports.Plugin
+{
+    public partial class ExportWindow : Form
+    {
+        private readonly IApplicationServices _services;
+        private DataSet _dsExecutedData;
+
+        public ExportWindow(IApplicationServices services)
+        {
+            _services = services;
+            InitializeComponent();
+            txtFilePath.Text = string.Format("{0}\\export{1:yyyy-MM-dd}.htm",
+                                             Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), DateTime.Today);
+        }
+
+        public string SetStatusText
+        {
+            set
+            {
+                toolStripStatusLabel1.Text = value;
+                statusStrip1.Refresh();
+            }
+        }
+
+        private void ExportWindow_Load(object sender, EventArgs e)
+        {
+            IQueryBatchProvider batchProvider = _services.HostWindow.ActiveChildForm as IQueryBatchProvider;
+
+            if (batchProvider != null && batchProvider.Batch != null)
+            {
+                if (batchProvider.Batch.Queries.Count > 1)
+                {
+                    BatchQuerySelectForm querySelectForm = new BatchQuerySelectForm();
+                    querySelectForm.Fill(batchProvider.Batch);
+                    querySelectForm.ShowDialog();
+                    if (querySelectForm.DialogResult == DialogResult.OK)
+                    {
+                        _dsExecutedData = querySelectForm.SelectedQuery.Result;
+                    }
+                    else
+                    {
+                        Close(); // user calncelled
+                    }
+                    return;
+                }
+
+                if (batchProvider.Batch.Queries.Count == 1)
+                {
+                    _dsExecutedData = batchProvider.Batch.Queries[0].Result;
+                    return;
+                }
+            }
+
+            MessageBox.Show("Couldn't find a result window, run a query or view a table to export the data.");
+            Close();
+        }
+
+        private void btnExport_Click(object sender, EventArgs e)
+        {
+            if (rbtXml.Checked)
+            {
+                ExportXml();
+            }
+
+            if (rbtHtml.Checked)
+            {
+                ExportHtml();
+            }
+
+            if (rbtCsv.Checked)
+            {
+                ExportCSV();
+            }
+        }
+
+        private void button1_Click(object sender, EventArgs e)
+        {
+            // Create new SaveFileDialog object
+            SaveFileDialog dialogSave = new SaveFileDialog();
+
+            // Default file extension
+            if (rbtCsv.Checked)
+            {
+                dialogSave.DefaultExt = "csv";
+                dialogSave.FilterIndex = 2;
+            }
+
+            if (rbtHtml.Checked)
+            {
+                dialogSave.DefaultExt = "htm";
+                dialogSave.FilterIndex = 1;
+            }
+
+            if (rbtXml.Checked)
+            {
+                dialogSave.DefaultExt = "xml";
+                dialogSave.FilterIndex = 3;
+            }
+
+            //DialogSave.DefaultExt = "txt";
+
+            // Available file extensions
+            dialogSave.Filter = "Html File (*.htm)|*.htm|CSV File (*.csv)|*.csv|XML file (*.xml)|*.xml";
+
+            // Adds a extension if the user does not
+            dialogSave.AddExtension = true;
+
+            // Restores the selected directory, next time
+            dialogSave.RestoreDirectory = true;
+
+            // Dialog title
+            dialogSave.Title = "Where do you want to save the file?";
+
+            // Startup directory
+            dialogSave.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
+
+            // Show the dialog and process the result
+            if (dialogSave.ShowDialog() == DialogResult.OK)
+            {
+                txtFilePath.Text = dialogSave.FileName;
+                //MessageBox.Show("You selected the file: " + DialogSave.FileName);
+            }
+
+            dialogSave.Dispose();
+        }
+
+        //private int GetFieldCount
+        //{
+        //    get { return _dsExecutedData.Tables[0].Columns.Count; }
+        //}
+        //private int GetRowCount
+        //{
+        //    get { return _dsExecutedData.Tables[0].Rows.Count; }
+        //}
+
+        private void ExportHtml()
+        {
+            Export.HtmlExportFormat format = new Export.HtmlExportFormat();
+            format.FontColor = txtFontColor.Text;
+            format.FontFamily = txtFontFamily.Text;
+            format.FontSize = txtFontSize.Text;
+
+            format.HeaderColor = txtHeaderBGColor.Text;
+            format.RowAltColor = txtRowBgAltColor.Text;
+            format.RowColor = txtRowBgcolor.Text;
+
+            Export.HtmlExport.OnWrittenData += CSVExport_OnWrittenData;
+            Export.HtmlExport.ExportToHTML(_dsExecutedData.Tables[0], txtFilePath.Text, format);
+
+            #region Not used
+
+            //StringBuilder sbCss = new StringBuilder();
+            //StringBuilder sbHtml = new StringBuilder();
+            //bool isAltSet = false;
+
+            //sbCss.Append("<style>");
+            //sbCss.Append("body { font-family:" + this.txtFontFamily.Text + "; font-size:" + this.txtFontSize.Text + "; color:" + this.txtFontColor.Text + "; }");
+            //sbCss.Append(".Header {background-color:" + this.txtHeaderBGColor.Text + "}");
+            //sbCss.Append(".Row    {background-color:" + this.txtRowBgcolor.Text + "}");
+            //sbCss.Append(".AltRow    {background-color:" +  this.txtRowBgAltColor.Text + "}");
+            //sbCss.Append("</style>");
+
+            //this.SetStatusText = "Created style for html";
+
+            //sbHtml.Append("<html>");
+            //sbHtml.Append("<head><title>Export from " + _dsExecutedData.Tables[0].TableName + "</title>");
+            //sbHtml.Append(sbCss.ToString());
+            //sbHtml.Append("</head>");
+            //sbHtml.Append("<body>");
+
+            //int fields = this.GetFieldCount;
+            //sbHtml.Append("<table border='0' cellpadding='2'");
+            //sbHtml.Append("<tr>");
+            //for (int i = 0; i < fields; i++)
+            //{
+            //    sbHtml.Append(string.Format("<td class='Header'>{0}</td>", _dsExecutedData.Tables[0].Columns[i].ColumnName));
+            //    this.SetStatusText = "Writing column name " + i.ToString();
+            //}
+            //sbHtml.Append("</tr>");
+
+            //int Counter = 0;
+            //foreach (DataRow dr in _dsExecutedData.Tables[0].Rows)
+            //{
+            //    sbHtml.Append("<tr>");
+
+            //    for (int i = 0; i < fields; i++)
+            //    {
+            //        if (isAltSet)
+            //        {
+            //            sbHtml.Append(string.Format("<td class='AltRow'>{0}</td>", dr[i].ToString()));
+
+            //        }
+            //        else
+            //        {
+            //            sbHtml.Append(string.Format("<td class='Row'>{0}</td>", dr[i].ToString()));
+
+            //        }
+            //    }
+            //    Counter++;
+            //    this.SetStatusText = "Wring row " + Counter.ToString();
+            //    sbHtml.Append("</tr>");
+
+            //    if (isAltSet == false)
+            //        isAltSet = true;
+            //    else
+            //        isAltSet = false;
+            //}
+            //sbHtml.Append("</table>");
+            //sbHtml.Append("</body></html>");
+
+
+            //System.IO.TextWriter tw = new System.IO.StreamWriter(this.txtFilePath.Text);
+            //tw.WriteLine(sbHtml.ToString());
+            //tw.Close();
+            //this.SetStatusText = "Finished exporting to html file"; 
+
+            #endregion
+        }
+
+        private void ExportCSV()
+        {
+            Export.CSVExport.OnWrittenData += CSVExport_OnWrittenData;
+            Export.CSVExport.ExportToCSV(_dsExecutedData.Tables[0], txtFilePath.Text, chkRowNames.Checked);
+        }
+
+        private void CSVExport_OnWrittenData(string text)
+        {
+            SetStatusText = text;
+        }
+
+        private void ExportXml()
+        {
+            _dsExecutedData.Tables[0].WriteXml(txtFilePath.Text);
+            SetStatusText = "Finished exporting to Xml file";
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+            Close();
+        }
+
+        private void rbtHtml_CheckedChanged(object sender, EventArgs e)
+        {
+            ChangeExtension("htm");
+        }
+
+        private void ChangeExtension(string extension)
+        {
+            if (!string.IsNullOrEmpty(txtFilePath.Text))
+            {
+                string p = txtFilePath.Text;
+                int idx = p.LastIndexOf(".");
+                p = p.Remove(idx);
+                p = p + "." + extension;
+                txtFilePath.Text = p;
+            }
+        }
+
+        private void rbtCsv_CheckedChanged(object sender, EventArgs e)
+        {
+            ChangeExtension("csv");
+        }
+
+        private void rbtXml_CheckedChanged(object sender, EventArgs e)
+        {
+            ChangeExtension("xml");
+        }
+    }
+}
\ No newline at end of file
Added +429 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.Designer.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.Designer.cs
new file mode 100644
index 0000000..a065afb
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.Designer.cs
@@ -0,0 +1,429 @@
+namespace MiniSqlQuery.Exports.Plugin
+{
+    partial class ExportWindow
+    {
+        /// <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()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExportWindow));
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtFilePath = new System.Windows.Forms.TextBox();
+            this.button1 = new System.Windows.Forms.Button();
+            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+            this.rbtHtml = new System.Windows.Forms.RadioButton();
+            this.rbtCsv = new System.Windows.Forms.RadioButton();
+            this.rbtXml = new System.Windows.Forms.RadioButton();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.btnExport = new System.Windows.Forms.Button();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.chkRowNames = new System.Windows.Forms.CheckBox();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.txtRowBgAltColor = new System.Windows.Forms.TextBox();
+            this.label10 = new System.Windows.Forms.Label();
+            this.txtRowBgcolor = new System.Windows.Forms.TextBox();
+            this.label8 = new System.Windows.Forms.Label();
+            this.label9 = new System.Windows.Forms.Label();
+            this.txtHeaderBGColor = new System.Windows.Forms.TextBox();
+            this.label7 = new System.Windows.Forms.Label();
+            this.txtFontColor = new System.Windows.Forms.TextBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.txtFontSize = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.txtFontFamily = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+            this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
+            this.groupBox1.SuspendLayout();
+            this.groupBox3.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.statusStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(12, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(68, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Export to file:";
+            // 
+            // txtFilePath
+            // 
+            this.txtFilePath.Location = new System.Drawing.Point(15, 25);
+            this.txtFilePath.Name = "txtFilePath";
+            this.txtFilePath.Size = new System.Drawing.Size(428, 20);
+            this.txtFilePath.TabIndex = 1;
+            // 
+            // button1
+            // 
+            this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+            this.button1.ImageKey = "VSFolder_open.bmp";
+            this.button1.ImageList = this.imageList1;
+            this.button1.Location = new System.Drawing.Point(449, 25);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(27, 20);
+            this.button1.TabIndex = 2;
+            this.button1.UseVisualStyleBackColor = true;
+            this.button1.Click += new System.EventHandler(this.button1_Click);
+            // 
+            // imageList1
+            // 
+            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
+            this.imageList1.TransparentColor = System.Drawing.Color.Magenta;
+            this.imageList1.Images.SetKeyName(0, "VSFolder_open.bmp");
+            // 
+            // rbtHtml
+            // 
+            this.rbtHtml.AutoSize = true;
+            this.rbtHtml.Checked = true;
+            this.rbtHtml.Location = new System.Drawing.Point(15, 51);
+            this.rbtHtml.Name = "rbtHtml";
+            this.rbtHtml.Size = new System.Drawing.Size(46, 17);
+            this.rbtHtml.TabIndex = 3;
+            this.rbtHtml.TabStop = true;
+            this.rbtHtml.Text = "Html";
+            this.rbtHtml.UseVisualStyleBackColor = true;
+            this.rbtHtml.CheckedChanged += new System.EventHandler(this.rbtHtml_CheckedChanged);
+            // 
+            // rbtCsv
+            // 
+            this.rbtCsv.AutoSize = true;
+            this.rbtCsv.Location = new System.Drawing.Point(77, 51);
+            this.rbtCsv.Name = "rbtCsv";
+            this.rbtCsv.Size = new System.Drawing.Size(43, 17);
+            this.rbtCsv.TabIndex = 4;
+            this.rbtCsv.Text = "Csv";
+            this.rbtCsv.UseVisualStyleBackColor = true;
+            this.rbtCsv.CheckedChanged += new System.EventHandler(this.rbtCsv_CheckedChanged);
+            // 
+            // rbtXml
+            // 
+            this.rbtXml.AutoSize = true;
+            this.rbtXml.Location = new System.Drawing.Point(126, 51);
+            this.rbtXml.Name = "rbtXml";
+            this.rbtXml.Size = new System.Drawing.Size(42, 17);
+            this.rbtXml.TabIndex = 5;
+            this.rbtXml.Text = "Xml";
+            this.rbtXml.UseVisualStyleBackColor = true;
+            this.rbtXml.CheckedChanged += new System.EventHandler(this.rbtXml_CheckedChanged);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Location = new System.Drawing.Point(401, 359);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 6;
+            this.btnCancel.Text = "Close";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // btnExport
+            // 
+            this.btnExport.Location = new System.Drawing.Point(320, 359);
+            this.btnExport.Name = "btnExport";
+            this.btnExport.Size = new System.Drawing.Size(75, 23);
+            this.btnExport.TabIndex = 7;
+            this.btnExport.Text = "Export";
+            this.btnExport.UseVisualStyleBackColor = true;
+            this.btnExport.Click += new System.EventHandler(this.btnExport_Click);
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.groupBox3);
+            this.groupBox1.Controls.Add(this.groupBox2);
+            this.groupBox1.Location = new System.Drawing.Point(15, 85);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(461, 268);
+            this.groupBox1.TabIndex = 8;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Output settings";
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Controls.Add(this.chkRowNames);
+            this.groupBox3.Location = new System.Drawing.Point(6, 201);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(449, 54);
+            this.groupBox3.TabIndex = 1;
+            this.groupBox3.TabStop = false;
+            this.groupBox3.Text = "Csv";
+            // 
+            // chkRowNames
+            // 
+            this.chkRowNames.AutoSize = true;
+            this.chkRowNames.Checked = true;
+            this.chkRowNames.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.chkRowNames.Location = new System.Drawing.Point(9, 19);
+            this.chkRowNames.Name = "chkRowNames";
+            this.chkRowNames.Size = new System.Drawing.Size(145, 17);
+            this.chkRowNames.TabIndex = 0;
+            this.chkRowNames.Text = "Column names in first row";
+            this.chkRowNames.UseVisualStyleBackColor = true;
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Controls.Add(this.txtRowBgAltColor);
+            this.groupBox2.Controls.Add(this.label10);
+            this.groupBox2.Controls.Add(this.txtRowBgcolor);
+            this.groupBox2.Controls.Add(this.label8);
+            this.groupBox2.Controls.Add(this.label9);
+            this.groupBox2.Controls.Add(this.txtHeaderBGColor);
+            this.groupBox2.Controls.Add(this.label7);
+            this.groupBox2.Controls.Add(this.txtFontColor);
+            this.groupBox2.Controls.Add(this.label6);
+            this.groupBox2.Controls.Add(this.label5);
+            this.groupBox2.Controls.Add(this.txtFontSize);
+            this.groupBox2.Controls.Add(this.label4);
+            this.groupBox2.Controls.Add(this.txtFontFamily);
+            this.groupBox2.Controls.Add(this.label3);
+            this.groupBox2.Controls.Add(this.label2);
+            this.groupBox2.Location = new System.Drawing.Point(6, 19);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(449, 176);
+            this.groupBox2.TabIndex = 0;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Html";
+            // 
+            // txtRowBgAltColor
+            // 
+            this.txtRowBgAltColor.Location = new System.Drawing.Point(241, 131);
+            this.txtRowBgAltColor.Name = "txtRowBgAltColor";
+            this.txtRowBgAltColor.Size = new System.Drawing.Size(100, 20);
+            this.txtRowBgAltColor.TabIndex = 15;
+            this.txtRowBgAltColor.Text = "#F2F2F2";
+            // 
+            // label10
+            // 
+            this.label10.AutoSize = true;
+            this.label10.Location = new System.Drawing.Point(186, 134);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(49, 13);
+            this.label10.TabIndex = 14;
+            this.label10.Text = "Alternate";
+            // 
+            // txtRowBgcolor
+            // 
+            this.txtRowBgcolor.Location = new System.Drawing.Point(62, 131);
+            this.txtRowBgcolor.Name = "txtRowBgcolor";
+            this.txtRowBgcolor.Size = new System.Drawing.Size(100, 20);
+            this.txtRowBgcolor.TabIndex = 13;
+            this.txtRowBgcolor.Text = "#FFFFFF";
+            // 
+            // label8
+            // 
+            this.label8.AutoSize = true;
+            this.label8.Location = new System.Drawing.Point(25, 134);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(31, 13);
+            this.label8.TabIndex = 12;
+            this.label8.Text = "Color";
+            // 
+            // label9
+            // 
+            this.label9.AutoSize = true;
+            this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label9.Location = new System.Drawing.Point(6, 109);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(32, 13);
+            this.label9.TabIndex = 11;
+            this.label9.Text = "Row";
+            // 
+            // txtHeaderBGColor
+            // 
+            this.txtHeaderBGColor.Location = new System.Drawing.Point(62, 82);
+            this.txtHeaderBGColor.Name = "txtHeaderBGColor";
+            this.txtHeaderBGColor.Size = new System.Drawing.Size(100, 20);
+            this.txtHeaderBGColor.TabIndex = 10;
+            this.txtHeaderBGColor.Text = "#CAE1FF";
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(25, 85);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(31, 13);
+            this.label7.TabIndex = 9;
+            this.label7.Text = "Color";
+            // 
+            // txtFontColor
+            // 
+            this.txtFontColor.Location = new System.Drawing.Point(319, 35);
+            this.txtFontColor.Name = "txtFontColor";
+            this.txtFontColor.Size = new System.Drawing.Size(100, 20);
+            this.txtFontColor.TabIndex = 8;
+            this.txtFontColor.Text = "#000000";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(282, 38);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(31, 13);
+            this.label6.TabIndex = 7;
+            this.label6.Text = "Color";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label5.Location = new System.Drawing.Point(6, 16);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(32, 13);
+            this.label5.TabIndex = 6;
+            this.label5.Text = "Font";
+            // 
+            // txtFontSize
+            // 
+            this.txtFontSize.Location = new System.Drawing.Point(223, 35);
+            this.txtFontSize.Name = "txtFontSize";
+            this.txtFontSize.Size = new System.Drawing.Size(53, 20);
+            this.txtFontSize.TabIndex = 5;
+            this.txtFontSize.Text = "12px";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(168, 38);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(49, 13);
+            this.label4.TabIndex = 4;
+            this.label4.Text = "Font size";
+            // 
+            // txtFontFamily
+            // 
+            this.txtFontFamily.Location = new System.Drawing.Point(62, 35);
+            this.txtFontFamily.Name = "txtFontFamily";
+            this.txtFontFamily.Size = new System.Drawing.Size(100, 20);
+            this.txtFontFamily.TabIndex = 3;
+            this.txtFontFamily.Text = "Verdana";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(20, 38);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(36, 13);
+            this.label3.TabIndex = 2;
+            this.label3.Text = "Family";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label2.Location = new System.Drawing.Point(6, 60);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(48, 13);
+            this.label2.TabIndex = 0;
+            this.label2.Text = "Header";
+            // 
+            // statusStrip1
+            // 
+            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripStatusLabel1});
+            this.statusStrip1.Location = new System.Drawing.Point(0, 390);
+            this.statusStrip1.Name = "statusStrip1";
+            this.statusStrip1.Size = new System.Drawing.Size(488, 22);
+            this.statusStrip1.TabIndex = 9;
+            this.statusStrip1.Text = "statusStrip1";
+            // 
+            // toolStripStatusLabel1
+            // 
+            this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
+            this.toolStripStatusLabel1.Size = new System.Drawing.Size(473, 17);
+            this.toolStripStatusLabel1.Spring = true;
+            this.toolStripStatusLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // ExportWindow
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(488, 412);
+            this.Controls.Add(this.statusStrip1);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.btnExport);
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.rbtXml);
+            this.Controls.Add(this.rbtCsv);
+            this.Controls.Add(this.rbtHtml);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.txtFilePath);
+            this.Controls.Add(this.label1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "ExportWindow";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "ExportWindow";
+            this.Load += new System.EventHandler(this.ExportWindow_Load);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            this.statusStrip1.ResumeLayout(false);
+            this.statusStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtFilePath;
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.RadioButton rbtHtml;
+        private System.Windows.Forms.RadioButton rbtCsv;
+        private System.Windows.Forms.RadioButton rbtXml;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Button btnExport;
+        private System.Windows.Forms.ImageList imageList1;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox txtRowBgAltColor;
+        private System.Windows.Forms.Label label10;
+        private System.Windows.Forms.TextBox txtRowBgcolor;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.Label label9;
+        private System.Windows.Forms.TextBox txtHeaderBGColor;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.TextBox txtFontColor;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.TextBox txtFontSize;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.TextBox txtFontFamily;
+        private System.Windows.Forms.CheckBox chkRowNames;
+        private System.Windows.Forms.StatusStrip statusStrip1;
+        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
+    }
+}
\ No newline at end of file
Added +153 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.resx b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.resx
new file mode 100644
index 0000000..8831e4a
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/ExportWindow.resx
@@ -0,0 +1,153 @@
+<?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="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACE
+        BAAAAk1TRnQBSQFMAwEBAAEEAQABBAEAARABAAEQAQAE/wEZAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA
+        ARADAAEBAQABGAYAAQz/AJMAAXUBhAGPAWYBgAGPAWABeQGHAVcBbgF7AU4BYgFvAUQBVgFhATkBSAFS
+        AS4BOgFDASUBLgE1ARsBIgEpARQBGQEeAQ4BEgEWAQ4BEwEYmQABdwGHAZIBiQGhAasBagGyAdQBAAGP
+        Ac0BAAGPAc0BAAGPAc0BBAGMAccBCAGIAb4BDwGCAbQBFQF8AakBGwF3AZ8BHwFyAZYBIgFLAVwBmwGt
+        AbWWAAF6AYoBlQF+Ab4B0wGKAaQBrgF+AdwB/wFfAc8B/wFVAcsB/wFMAcQB+gFBAbwB9QE3AbMB8AEu
+        AaoB6wEkAaAB5QETAYwB1AEjAWcBgAFeAWkBbZYAAX0BjgGYAXkB0gHsAYsBpAGtAYkBwgHOAXEB2AH/
+        AWUB0wH/AVwBzgH/AVEByQH+AUkBwQH6AT8BuQH1ATQBsAHuASkBqAHpARABhQHNASIBSwFbAbIBwAHG
+        kwABgAGRAZwBgQHXAe8BfQHFAeABjAGmAbABgAHdAf4BaAHTAf8BZwHUAf8BYgHRAf8BWAHNAf8BTgHH
+        AfwBRgG+AfcBOwG2AfIBMQGsAewBJQFpAYEBegGVAaGTAAGDAZUBnwGJAdwB8QGMAeIB/wGNAagBsQGM
+        AboBxwF0AdgB/wFnAdQB/wFnAdQB/wFnAdQB/wFfAdAB/wFUAc0B/wFLAcUB/AFBAbsB9wEuAaIB2wFR
+        AWcBdAGyAcABxpAAAYYBmgGjAZIB4QHyAZgB6AH9AYABxAHeAY4BpwGwAYEB3gH9AYQB4AH/AYQB4AH/
+        AYQB4AH/AYQB4AH/AYEB3wH/AXsB3QH/AXQB2AH/AWsB1gH/AVYBqQHRAY8BmwGkkAABiAGcAaUBmgHm
+        AfMBnwHrAfsBmAHoAf4BiwGsAbkBiwGsAbkBigGqAbcBiAGmAbMBhgGjAa8BgwGfAaoBgQGaAaYBfwGV
+        AaEBfAGRAZ0BegGOAZkBeQGLAZUBdwGIAZOQAAGLAaABqAGgAeoB9gGmAe4B+QGfAesB+wGYAegB/gF6
+        AdoB/wFnAdQB/wFnAdQB/wFnAdQB/wFnAdQB/wFnAdQB/wFnAdQB/wF3AYgBk5kAAY4BogGrAacB7gH2
+        AasB8AH3AaYB7gH5AZ8B6wH7AZgB6AH9AXEB1AH7AYkBngGnAYYBmQGjAYIBlAGfAX4BkAGaAXoBjAGX
+        AXcBiAGTmQABjwGkAawBoAHSAdoBqwHwAfcBqwHwAfcBpgHuAfkBnwHrAfsBjQGhAaoB1QHcAeCoAAHa
+        Ad4B4QGPAaQBrAGPAaQBrAGPAaQBrAGPAaQBrAGPAaQBrAHVAdwB4P8A/wAtAAFCAU0BPgcAAT4DAAEo
+        AwABQAMAARADAAEBAQABAQUAAYAXAAP/AQAC/wYAAv8HAAEHBwABAwcAAQMHAAEBBwABAR8AAQcHAAEH
+        BwAB/wYAAQEB/wYAAv8GAAL/BgAL
+</value>
+  </data>
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>122, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
Added +17 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Loader.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Loader.cs
new file mode 100644
index 0000000..1fa65f6
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Loader.cs
@@ -0,0 +1,17 @@
+using MiniSqlQuery.Core;
+
+namespace MiniSqlQuery.Exports.Plugin
+{
+    public class Loader : PluginLoaderBase
+    {
+        public Loader()
+            : base("Exports for MiniSqlQuery", "Enables exporting of data")
+        {
+        }
+
+        public override void InitializePlugIn()
+        {
+            Services.HostWindow.AddPluginCommand<Commands.ShowExportWindowCommand>();
+        }
+    }
+}
\ No newline at end of file
Added +113 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/MiniSqlQuery.Exports.Plugin.csproj b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/MiniSqlQuery.Exports.Plugin.csproj
new file mode 100644
index 0000000..ba9fb74
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/MiniSqlQuery.Exports.Plugin.csproj
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{BADDFE58-B855-4A88-A131-BE4066F080E8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>MiniSqlQuery.Exports.Plugin</RootNamespace>
+    <AssemblyName>MiniSqlQuery.Exports.Plugin</AssemblyName>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\Build\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release - No Tests|AnyCPU'">
+    <OutputPath>bin\Release - No Tests\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Commands\ShowExportWindowCommand.cs" />
+    <Compile Include="ExportWindow.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ExportWindow.Designer.cs">
+      <DependentUpon>ExportWindow.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Export\CSVExport.cs" />
+    <Compile Include="Export\HtmlExport.cs" />
+    <Compile Include="Export\HtmlExportFormat.cs" />
+    <Compile Include="Loader.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ExportWindow.resx">
+      <DependentUpon>ExportWindow.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\Folder_Open.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\MiniSqlQuery.Core\MiniSqlQuery.Core.csproj">
+      <Project>{B819CF6A-B5FD-4E85-842D-FD855F856A5A}</Project>
+      <Name>MiniSqlQuery.Core</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
Added +40 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/AssemblyInfo.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1424e3c
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/AssemblyInfo.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("MiniSqlQuery.Exports.Plugin")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Home")]
+[assembly: AssemblyProduct("MiniSqlQuery.Exports.Plugin")]
+[assembly: AssemblyCopyright("Copyright © Home 2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+
+[assembly: Guid("41c446b6-7194-40de-865b-6255393ad6ce")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
\ No newline at end of file
Added +73 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/Resources.Designer.cs b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..5b268f2
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/Resources.Designer.cs
@@ -0,0 +1,73 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace MiniSqlQuery.Exports.Plugin.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MiniSqlQuery.Exports.Plugin.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Folder_Open {
+            get {
+                object obj = ResourceManager.GetObject("Folder_Open", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Added +124 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/Resources.resx b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/Resources.resx
new file mode 100644
index 0000000..345583e
--- /dev/null
+++ b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Properties/Resources.resx
@@ -0,0 +1,124 @@
+<?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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Folder_Open" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Folder_Open.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
\ No newline at end of file
Added +0 -0
diff --git a/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Resources/Folder_Open.png b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Resources/Folder_Open.png
new file mode 100644
index 0000000..5555c85
Binary files /dev/null and b/minisqlquery-master/src/Contrib/MiniSqlQuery.Exports.Plugin/Resources/Folder_Open.png differ