You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

310 lines
9.4 KiB

using OpenDBDiff.Front;
using OpenDBDiff.Schema.SQLServer.Generates.Front.Util;
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace OpenDBDiff.Schema.SQLServer.Generates.Front
{
public partial class SqlServerConnectFront : UserControl, IFront
{
private Boolean isDatabaseFilled = false;
private Boolean isServerFilled = false;
private delegate void clearCombo();
private delegate void addCombo(string item);
public SqlServerConnectFront()
{
InitializeComponent();
cboAuthentication.SelectedIndex = 1;
}
private void cboAuthentication_SelectedIndexChanged(object sender, EventArgs e)
{
txtUsername.Enabled = cboAuthentication.SelectedIndex == 1;
txtPassword.Enabled = cboAuthentication.SelectedIndex == 1;
isDatabaseFilled = false;
ClearDatabase();
}
public string ErrorConnection { get; private set; }
public bool UseWindowsAuthentication
{
get
{
return cboAuthentication.SelectedIndex == 0;
}
set
{
cboAuthentication.SelectedIndex = (value ? 0 : 1);
}
}
public string DatabaseName
{
get { return cboDatabase.Text; }
set { cboDatabase.Text = value; }
}
public string UserName
{
get { return txtUsername.Text; }
set { txtUsername.Text = value; }
}
public string Password
{
get { return txtPassword.Text; }
set { txtPassword.Text = value; }
}
public override string Text
{
get { return lblName.Text; }
set { lblName.Text = value; }
}
public string ServerName
{
get { return cboServer.Text; }
set { cboServer.Text = value; }
}
public Boolean TestConnection()
{
try
{
using (SqlConnection connection = new SqlConnection())
{
connection.ConnectionString = this.ConnectionString;
connection.Open();
connection.Close();
return true;
}
}
catch (Exception ex)
{
ErrorConnection = ex.Message;
return false;
}
}
private string BuildConnectionString(string server, string database)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = server.Trim();
// if database is ommitted the connection will be established to the default database for the user
if (!string.IsNullOrEmpty(database))
builder.InitialCatalog = database.Trim();
builder.IntegratedSecurity = true;
return builder.ConnectionString;
}
private string BuildConnectionString(string server, string database, string username, string password)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(BuildConnectionString(server, database));
builder.IntegratedSecurity = false;
builder.UserID = username;
builder.Password = password;
return builder.ConnectionString;
}
public string ConnectionStringToDefaultDatabase
{
get
{
if (cboAuthentication.SelectedIndex == 1)
return BuildConnectionString(cboServer.Text, null, txtUsername.Text, txtPassword.Text);
else
return BuildConnectionString(cboServer.Text, null);
}
}
public string ConnectionStringToMasterDatabase
{
get
{
if (cboAuthentication.SelectedIndex == 1)
return BuildConnectionString(cboServer.Text, "master", txtUsername.Text, txtPassword.Text);
else
return BuildConnectionString(cboServer.Text, "master");
}
}
public string ConnectionString
{
get
{
if (cboAuthentication.SelectedIndex == 1)
return BuildConnectionString(cboServer.Text, cboDatabase.Text, txtUsername.Text, txtPassword.Text);
else
return BuildConnectionString(cboServer.Text, cboDatabase.Text);
}
set
{
if (!String.IsNullOrWhiteSpace(value))
{
var builder = new SqlConnectionStringBuilder(value);
ServerName = builder.DataSource;
UseWindowsAuthentication = builder.IntegratedSecurity;
if (UseWindowsAuthentication)
{
UserName = "";
Password = "";
}
else
{
UserName = builder.UserID;
Password = builder.Password;
}
DatabaseName = builder.InitialCatalog;
}
else
{
cboAuthentication.SelectedIndex = 1;
UserName = "";
Password = "";
ServerName = "(local)";
DatabaseName = "";
}
}
}
public Control Control
{
get
{
return this;
}
}
private void btnTest_Click(object sender, EventArgs e)
{
if (TestConnection())
MessageBox.Show(this, "Test successful!", "Test", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
MessageBox.Show(this, "Test failed!\r\n" + ErrorConnection, "Test", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private void AddComboItem(string item)
{
if (!InvokeRequired)
cboDatabase.Items.Add(item);
else
{
addCombo add = new addCombo(AddComboItem);
Invoke(add, new string[] { item });
}
}
private void ClearDatabase()
{
if (!InvokeRequired)
cboDatabase.Items.Clear();
else
{
clearCombo clear = new clearCombo(ClearDatabase);
Invoke(clear);
}
}
private void FillDatabase()
{
if (!isDatabaseFilled)
{
String connectionString = ConnectionStringToDefaultDatabase;
ClearDatabase();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand command = new SqlCommand("SELECT name,database_id FROM sys.databases ORDER BY Name", conn))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
AddComboItem(reader["Name"].ToString());
}
isDatabaseFilled = true;
}
}
}
}
}
private void cboServer_SelectedIndexChanged(object sender, EventArgs e)
{
isDatabaseFilled = false;
}
private void txtUsername_TextChanged(object sender, EventArgs e)
{
isDatabaseFilled = false;
ClearDatabase();
}
private void txtPassword_TextChanged(object sender, EventArgs e)
{
isDatabaseFilled = false;
ClearDatabase();
}
private void cboServer_DropDown(object sender, EventArgs e)
{
try
{
if (!isServerFilled)
{
this.Cursor = Cursors.WaitCursor;
SqlServerList.Get().ForEach(item => cboServer.Items.Add(item));
isServerFilled = true;
}
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor = Cursors.Default;
}
}
private void cboDatabase_DropDown(object sender, EventArgs e)
{
try
{
this.Cursor = Cursors.WaitCursor;
FillDatabase();
}
catch (Exception ex)
{
this.Cursor = Cursors.Default;
cboDatabase.Items.Clear();
MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
this.Cursor = Cursors.Default;
}
}
private void cboServer_TextChanged(object sender, EventArgs e)
{
isDatabaseFilled = false;
}
public override string ToString()
{
return string.Format($"Server: {ServerName}, Database: {DatabaseName}");
}
}
}