#region License
// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
// This source code is made available under the terms of the GNU Lesser General Public License v3.0
// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
#endregion
using System;
using System.Data.Common;
using System.Windows.Forms;
using MiniSqlQuery.Core;
using MiniSqlQuery.Properties;
namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
{
/// <summary>The connection string builder form.</summary>
public partial class ConnectionStringBuilderForm : Form
{
/// <summary>The _host window.</summary>
private readonly IHostWindow _hostWindow;
/// <summary>The _services.</summary>
private readonly IApplicationServices _services;
/// <summary>Gets or sets ConnectionDefinition.</summary>
public DbConnectionDefinition ConnectionDefinition { get; set; }
/// <summary>The default provider name.</summary>
public const string DefaultProviderName = "System.Data.SqlClient";
/// <summary>The _initialised.</summary>
private bool _initialised;
/// <summary>The _loaded.</summary>
private bool _loaded;
/// <summary>The _init provider.</summary>
private string _initProvider;
/// <summary>The _provider name.</summary>
private string _providerName = DefaultProviderName;
/// <summary>The _conn str.</summary>
private string _connStr;
/// <summary>The _conn str bldr.</summary>
private DbConnectionStringBuilder _connStrBldr;
/// <summary>The _dirty.</summary>
private bool _dirty;
/// <summary>Gets or sets ConnectionName.</summary>
public string ConnectionName
{
get { return txtConnectionName.Text; }
set { txtConnectionName.Text = value; }
}
/// <summary>Gets or sets Comments.</summary>
public string Comments
{
get { return txtComments.Text; }
set { txtComments.Text = value; }
}
/// <summary>Gets or sets ProviderName.</summary>
public string ProviderName
{
get { return _providerName; }
set
{
_providerName = value;
cboProvider.SelectedItem = _providerName;
}
}
/// <summary>
/// The supplied connection string - or if during an edit - the new one.
/// </summary>
public string ConnectionString
{
get
{
if (_connStrBldr != null)
{
return _connStrBldr.ConnectionString;
}
return _connStr;
}
set
{
_connStr = value; // store
if (_connStrBldr == null)
{
BindNewConnectionStringBuilder();
}
}
}
/// <summary>Gets DbConnectionStringBuilderInstance.</summary>
public DbConnectionStringBuilder DbConnectionStringBuilderInstance
{
get { return _connStrBldr; }
}
/// <summary>Initializes a new instance of the <see cref="ConnectionStringBuilderForm"/> class.</summary>
/// <param name="hostWindow">The host window.</param>
/// <param name="services">The services.</param>
public ConnectionStringBuilderForm(IHostWindow hostWindow, IApplicationServices services)
{
InitializeComponent();
_hostWindow = hostWindow;
_services = services;
Icon = ImageResource.database_edit_icon;
}
/// <summary>Initializes a new instance of the <see cref="ConnectionStringBuilderForm"/> class.</summary>
/// <param name="hostWindow">The host window.</param>
/// <param name="definition">The definition.</param>
/// <param name="services">The services.</param>
public ConnectionStringBuilderForm(IHostWindow hostWindow, DbConnectionDefinition definition, IApplicationServices services)
: this(hostWindow, services)
{
ConnectionDefinition = definition;
ConnectionName = ConnectionDefinition.Name;
Comments = ConnectionDefinition.Comment;
_initProvider = ConnectionDefinition.ProviderName;
_connStr = ConnectionDefinition.ConnectionString;
}
/// <summary>The connection string builder form_ load.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void ConnectionStringBuilderForm_Load(object sender, EventArgs e)
{
cboProvider.DataSource = Utility.GetSqlProviderNames();
_initialised = true;
}
/// <summary>The connection string builder form_ shown.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void ConnectionStringBuilderForm_Shown(object sender, EventArgs e)
{
if (_initProvider == null)
{
ProviderName = DefaultProviderName;
}
else
{
ProviderName = _initProvider;
}
_loaded = true;
}
/// <summary>The connection string builder form_ form closing.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void ConnectionStringBuilderForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (_dirty)
{
DialogResult saveFile = _hostWindow.DisplayMessageBox(
this,
Resources.The_connection_details_have_changed__do_you_want_to_save, Resources.Save_Changes,
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1,
0,
null,
null);
switch (saveFile)
{
case DialogResult.Yes:
WriteValuesBack();
break;
case DialogResult.Cancel:
e.Cancel = true;
break;
}
}
}
/// <summary>The tool strip button ok_ click.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void toolStripButtonOk_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
WriteValuesBack();
Close();
}
/// <summary>The tool strip button cancel_ click.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void toolStripButtonCancel_Click(object sender, EventArgs e)
{
// todo - is dirty?
DialogResult = DialogResult.Cancel;
Close();
}
/// <summary>The write values back.</summary>
protected void WriteValuesBack()
{
if (ConnectionDefinition == null)
{
ConnectionDefinition = new DbConnectionDefinition();
}
ConnectionDefinition.Name = ConnectionName;
ConnectionDefinition.ProviderName = ProviderName;
ConnectionDefinition.ConnectionString = ConnectionString;
ConnectionDefinition.Comment = Comments;
_dirty = false;
}
/// <summary>The bind new connection string builder.</summary>
private void BindNewConnectionStringBuilder()
{
if (!_initialised)
{
return;
}
bool getBuilderFailed = false;
try
{
_connStrBldr = DbProviderFactories.GetFactory(ProviderName).CreateConnectionStringBuilder();
if (_connStrBldr == null)
{
getBuilderFailed = true;
}
}
catch
{
getBuilderFailed = true;
}
if (getBuilderFailed)
{
_connStrBldr = new GenericConnectionStringBuilder();
}
try
{
_connStrBldr.ConnectionString = _connStr;
}
catch (ArgumentException argExp)
{
// consume error but notify
MessageBox.Show(Resources.BindNewConnectionStringBuilder_Could_not_populate_with_current_connection_string___ + argExp.Message);
}
propertyGridDbConnection.SelectedObject = _connStrBldr;
}
/// <summary>The cbo provider_ selected index changed.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void cboProvider_SelectedIndexChanged(object sender, EventArgs e)
{
if (!_initialised)
{
return;
}
SetDirty();
if (cboProvider.SelectedItem != null)
{
ProviderName = cboProvider.SelectedItem.ToString();
BindNewConnectionStringBuilder();
}
}
/// <summary>The items text changed.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void ItemsTextChanged(object sender, EventArgs e)
{
SetDirty();
}
/// <summary>The property grid db connection_ property value changed.</summary>
/// <param name="s">The s.</param>
/// <param name="e">The e.</param>
private void propertyGridDbConnection_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
SetDirty();
}
/// <summary>The set dirty.</summary>
private void SetDirty()
{
if (!_loaded)
{
return;
}
if (!_dirty)
{
_dirty = true;
Text += "*";
}
}
/// <summary>The tool strip button test_ click.</summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
private void toolStripButtonTest_Click(object sender, EventArgs e)
{
// do a standalone raw connection test
Exception exp = QueryRunner.TestDbConnection(ProviderName, ConnectionString);
if (exp == null)
{
string msg = string.Format(Resources.Connected_to_0_successfully, ConnectionName);
_hostWindow.DisplaySimpleMessageBox(this, msg, Resources.Connection_Successful);
}
else
{
string msg = string.Format(Resources.Failed_connecting_to_0_1_2, ConnectionName, Environment.NewLine, exp.Message);
_hostWindow.DisplaySimpleMessageBox(this, msg, Resources.Connection_Failed);
}
}
#if DEBUG
/// <summary>The to string.</summary>
/// <returns>The to string.</returns>
public override string ToString()
{
return string.Format("[ConnectionStringBuilderForm => Name: {0}; Provider: {1}; ConnectionString: {2}]", ConnectionName, ProviderName,
ConnectionString);
}
#endif
}
}
|