Как избавиться от поторяющегося кода и подвисаний при работе с базой?
добрые люди, проконсультируете пожалуйста джуна, написал приложение на winforms, приложение состоит из 12 форм, все формы одинаково работают , с помощью Datagridview заносят данные в БД, автоматом отображаются в датагриде. теперь хочу узнать мнение опытных людей, насколько плохо написал код (во первых приложение медленно работает, во вторых создавал одинаковых методов на всех формах, т.к почти во всех формах одинаковые функции выполняются). пожалуйста помогите советами как можно улучшить код и насколько ужасно написал код. ниже выложил внешний вид формы и код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Drawing.Imaging;
namespace LOCAL_PROJECT
{
public partial class mary : Form
{
public mary()
{
InitializeComponent();
}
//CONNECTION STRING
DataTable dt = new DataTable("mary");
MySqlCommand command;
MySqlConnection con = new MySqlConnection("server = 192.168.1.200; UserId = user; Password = user; database = equipment");
MySqlDataAdapter adapter = new MySqlDataAdapter();
int id;
public void spisok()
{
con.Open();
MySqlDataAdapter adapter = new MySqlDataAdapter(" SELECT* FROM `mary` ", con);
DataSet dset = new DataSet();
adapter.Fill(dset);
dataGridView1.DataSource = dset.Tables[0];
con.Close();
}
private void mary_Load(object sender, EventArgs e)
{
spisok();
dataGridView1.EnableHeadersVisualStyles = false;
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Lime;
dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("Times new Roman", 13, FontStyle.Bold);
dataGridView1.ColumnHeadersHeight = 35;
dataGridView1.DefaultCellStyle.Font = new Font("Times new Roman", 12);
dataGridView1.Columns[0].Width = 55;
dataGridView1.Columns[1].Width = 210;
dataGridView1.Columns[2].Width = 160;
dataGridView1.Columns[3].Width = 130;
dataGridView1.Columns[4].Width = 90;
dataGridView1.Columns[5].Width = 78;
dataGridView1.Columns[6].Width = 90;
dataGridView1.Columns[7].Width = 78;
dataGridView1.Columns[10].Width = 88;
dataGridView1.Columns[0].HeaderCell.Value = "id";
dataGridView1.Columns[1].HeaderCell.Value = "наименование товара";
dataGridView1.Columns[2].HeaderCell.Value = "тип товара";
dataGridView1.Columns[3].HeaderCell.Value = "префикс товара";
dataGridView1.Columns[4].HeaderCell.Value = "установленная емкость оборудования";
dataGridView1.Columns[5].HeaderCell.Value = "неиспользованная емкость оборудования";
dataGridView1.Columns[6].HeaderCell.Value = "общий трафик интернета";
dataGridView1.Columns[7].HeaderCell.Value = "неиспользованный трафик интернета";
dataGridView1.Columns[8].HeaderCell.Value = "количество абонентских плат";
dataGridView1.Columns[9].HeaderCell.Value = "количество интернет плат";
dataGridView1.Columns[10].HeaderCell.Value = "время установки";
dataGridView1.Columns[11].HeaderCell.Value = "Геолокация C";
dataGridView1.Columns[12].HeaderCell.Value = "Геолокация B";
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
//подсказка для Геолокации
textBox10.Text = "C";
textBox10.ForeColor = Color.Gray;
textBox10.TextAlign = HorizontalAlignment.Center;
Font myfont = new Font("Times new Roman", 14);
textBox10.Font = myfont;
//подсказка для Геолокации
textBox11.Text = "B";
textBox11.ForeColor = Color.Gray;
textBox11.TextAlign = HorizontalAlignment.Center;
Font myfont1 = new Font("Times new Roman", 14);
textBox11.Font = myfont1;
}
private void button4_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
menu menuu = new menu();
menuu.Show();
}
// Метод автонумерация ID
private DataTable AutoNumberedTable(DataTable SourceTable)
{
DataTable ResultTable = new DataTable();
DataColumn AutoNumberColumn = new DataColumn();
AutoNumberColumn.ColumnName = "id";
AutoNumberColumn.DataType = typeof(int);
AutoNumberColumn.AutoIncrement = true;
AutoNumberColumn.AutoIncrementSeed = 1;
AutoNumberColumn.AutoIncrementStep = 1;
ResultTable.Columns.Add(AutoNumberColumn);
ResultTable.Merge(SourceTable);
return ResultTable;
}
private void button5_Click(object sender, EventArgs e)
{
con.Open();
string sql = "insert into mary(id, name of product, product type, product prefix, installed capacity of equipment, unused equipment capacity, total internet traffic, unused internet traffic, number of subscription fees, number of internet boards, year, geolocationC, geolocationB) Values (null, '" + textBox2.Text + "', '" + textBox1.Text + "', '" + textBox3.Text + "', '" + textBox4.Text + "', '" + textBox5.Text + "','" + textBox6.Text + "', '" + textBox9.Text + "', '" + textBox8.Text + "', '" + textBox7.Text + "', '" + textBox12.Text + "', '" + textBox10.Text + "', '" + textBox11.Text + "' )";
this.dataGridView1.DataSource = AutoNumberedTable(dt);
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("added successfully");
textBox2.Text = string.Empty;
textBox1.Text = string.Empty;
textBox3.Text = string.Empty;
textBox4.Text = string.Empty;
textBox5.Text = string.Empty;
textBox6.Text = string.Empty;
textBox7.Text = string.Empty;
textBox8.Text = string.Empty;
textBox9.Text = string.Empty;
textBox10.Text = string.Empty;
textBox11.Text = string.Empty;
textBox12.Text = string.Empty;
spisok();
}
// Метод делете
private void delete(int id)
{
string sql = "DELETE FROM mary WHERE id=" + id + "";
command = new MySqlCommand(sql, con);
//OPEN CON, EXECUTE DELETE, CLOSE CON
try
{
con.Open();
adapter = new MySqlDataAdapter(command);
adapter.DeleteCommand = con.CreateCommand();
adapter.DeleteCommand.CommandText = sql;
// PROMT FOR CONFIRMATION
if (command.ExecuteNonQuery() > 0)
{
MessageBox.Show("Deleted");
}
con.Close();
spisok();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//Delete button
private void button3_Click(object sender, EventArgs e)
{
string selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
int tb = Convert.ToInt32(selected);
delete(tb);
}
//UPDATE PROSESS
private void update(int id)
{
string sql = "UPDATE mary SET name of product='" + textBox2.Text + "', product type='" + textBox1.Text + "', product prefix='" + textBox3.Text + "', installed capacity of equipment='" + textBox4.Text + "', unused equipment capacity='" + textBox5.Text + "', total internet traffic='" + textBox6.Text + "', unused internet traffic='" + textBox9.Text + "', number of subscription fees='" + textBox8.Text + "', number of internet boards='" + textBox7.Text + "', year='" + textBox12.Text + "', geolocationC='" + textBox10.Text + "', geolocationC='" + textBox11.Text + "'";
command = new MySqlCommand(sql, con);
//OPEN CON, EXECUTE DELETE, CLOSE CON
try
{
con.Open();
adapter = new MySqlDataAdapter(command);
adapter.UpdateCommand = con.CreateCommand();
adapter.UpdateCommand.CommandText = sql;
// PROMT FOR CONFIRMATION
if (adapter.UpdateCommand.ExecuteNonQuery() > 0)
{
MessageBox.Show("Successfully UPDATED!");
}
con.Close();
spisok();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
con.Close();
}
}
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
id = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].Value.ToString());
textBox2.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
textBox1.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
textBox3.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
textBox4.Text = dataGridView1.CurrentRow.Cells[4].Value.ToString();
textBox5.Text = dataGridView1.CurrentRow.Cells[5].Value.ToString();
textBox6.Text = dataGridView1.CurrentRow.Cells[6].Value.ToString();
textBox9.Text = dataGridView1.CurrentRow.Cells[7].Value.ToString();
textBox8.Text = dataGridView1.CurrentRow.Cells[8].Value.ToString();
textBox7.Text = dataGridView1.CurrentRow.Cells[9].Value.ToString();
textBox12.Text = dataGridView1.CurrentRow.Cells[10].Value.ToString();
textBox10.Text = dataGridView1.CurrentRow.Cells[11].Value.ToString();
textBox11.Text = dataGridView1.CurrentRow.Cells[12].Value.ToString();
}
private void textBox13_TextChanged(object sender, EventArgs e)
{
con.Open();
string query = "Select * From mary where name of product like '%" + textBox13.Text + "%' OR product type like '%" + textBox13.Text + "%' OR product prefix like '%" + textBox13.Text + "%' OR installed capacity of equipment like '%" + textBox13.Text + "%' OR unused equipment capacity like '%" + textBox13.Text + "%' OR total internet traffic like '%" + textBox13.Text + "%' OR unused internet traffic like '%" + textBox13.Text + "%' OR number of subscription fees like '%" + textBox13.Text + "%' OR number of internet boards like '%" + textBox13.Text + "%' OR year like '%" + textBox13.Text + "%' OR geolocationC like '%" + textBox13.Text + "%' OR geolocationC like '%" + textBox13.Text + "%' OR geolocationB like '%" + textBox13.Text + "%'";
DataSet dset = new DataSet();
MySqlDataAdapter adapter = new MySqlDataAdapter(query, con);
MySqlCommandBuilder builder = new MySqlCommandBuilder(adapter);
adapter.Fill(dset);
dataGridView1.DataSource = dset.Tables[0];
con.Close();
}
private void button6_Click(object sender, EventArgs e)
{
try
{
con.Open();
command = new MySqlCommand("update mary SET name of product='" + textBox2.Text + "', product type='" + textBox1.Text + "', product prefix='" + textBox3.Text + "', installed capacity of equipment='" + textBox4.Text + "', unused equipment capacity='" + textBox5.Text + "', total internet traffic='" + textBox6.Text + "', unused internet traffic='" + textBox9.Text + "', number of subscription fees='" + textBox8.Text + "', number of internet boards='" + textBox7.Text + "', year='" + textBox12.Text + "', geolocationC='" + textBox10.Text + "', geolocationC='" + textBox11.Text + "' WHERE tb='" + tertip + "'", con);
command.ExecuteNonQuery();
MessageBox.Show("updated!");
con.Close();
spisok();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
вторая форма так же выглядит только меняется таблица базы данных
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Drawing.Imaging;
namespace LOCAL_PROJECT
{
public partial class city : Form
{
public city()
{
InitializeComponent();
}
//CONNECTION STRING
DataTable dt = new DataTable("city");
MySqlCommand command;
MySqlConnection con = new MySqlConnection("server = 192.168.1.200; UserId = user; Password = user; database = equipment");
MySqlDataAdapter adapter = new MySqlDataAdapter();
int id;
public void spisok()
{
con.Open();
MySqlDataAdapter adapter = new MySqlDataAdapter(" SELECT* FROM `city` ", con);
DataSet dset = new DataSet();
adapter.Fill(dset);
dataGridView1.DataSource = dset.Tables[0];
con.Close();
}
private void city_Load(object sender, EventArgs e)
{
spisok();
dataGridView1.EnableHeadersVisualStyles = false;
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Lime;
dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("Times new Roman", 13, FontStyle.Bold);
dataGridView1.ColumnHeadersHeight = 35;
dataGridView1.DefaultCellStyle.Font = new Font("Times new Roman", 12);
dataGridView1.Columns[0].Width = 55;
dataGridView1.Columns[1].Width = 210;
dataGridView1.Columns[2].Width = 160;
dataGridView1.Columns[3].Width = 130;
dataGridView1.Columns[4].Width = 90;
dataGridView1.Columns[5].Width = 78;
dataGridView1.Columns[6].Width = 90;
dataGridView1.Columns[7].Width = 78;
dataGridView1.Columns[10].Width = 88;
dataGridView1.Columns[0].HeaderCell.Value = "id";
dataGridView1.Columns[1].HeaderCell.Value = "наименование товара";
dataGridView1.Columns[2].HeaderCell.Value = "тип товара";
dataGridView1.Columns[3].HeaderCell.Value = "префикс товара";
dataGridView1.Columns[4].HeaderCell.Value = "установленная емкость оборудования";
dataGridView1.Columns[5].HeaderCell.Value = "неиспользованная емкость оборудования";
dataGridView1.Columns[6].HeaderCell.Value = "общий трафик интернета";
dataGridView1.Columns[7].HeaderCell.Value = "неиспользованный трафик интернета";
dataGridView1.Columns[8].HeaderCell.Value = "количество абонентских плат";
dataGridView1.Columns[9].HeaderCell.Value = "количество интернет плат";
dataGridView1.Columns[10].HeaderCell.Value = "время установки";
dataGridView1.Columns[11].HeaderCell.Value = "Геолокация C";
dataGridView1.Columns[12].HeaderCell.Value = "Геолокация B";
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
//подсказка для Геолокации
textBox10.Text = "C";
textBox10.ForeColor = Color.Gray;
textBox10.TextAlign = HorizontalAlignment.Center;
Font myfont = new Font("Times new Roman", 14);
textBox10.Font = myfont;
//подсказка для Геолокации
textBox11.Text = "B";
textBox11.ForeColor = Color.Gray;
textBox11.TextAlign = HorizontalAlignment.Center;
Font myfont1 = new Font("Times new Roman", 14);
textBox11.Font = myfont1;
}
private void button4_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
menu menuu = new menu();
menuu.Show();
}
// Метод автонумерация ID
private DataTable AutoNumberedTable(DataTable SourceTable)
{
DataTable ResultTable = new DataTable();
DataColumn AutoNumberColumn = new DataColumn();
AutoNumberColumn.ColumnName = "id";
AutoNumberColumn.DataType = typeof(int);
AutoNumberColumn.AutoIncrement = true;
AutoNumberColumn.AutoIncrementSeed = 1;
AutoNumberColumn.AutoIncrementStep = 1;
ResultTable.Columns.Add(AutoNumberColumn);
ResultTable.Merge(SourceTable);
return ResultTable;
}
private void button5_Click(object sender, EventArgs e)
{
con.Open();
string sql = "insert into city(id, name of product, product type, product prefix, installed capacity of equipment, unused equipment capacity, total internet traffic, unused internet traffic, number of subscription fees, number of internet boards, year, geolocationC, geolocationB) Values (null, '" + textBox2.Text + "', '" + textBox1.Text + "', '" + textBox3.Text + "', '" + textBox4.Text + "', '" + textBox5.Text + "','" + textBox6.Text + "', '" + textBox9.Text + "', '" + textBox8.Text + "', '" + textBox7.Text + "', '" + textBox12.Text + "', '" + textBox10.Text + "', '" + textBox11.Text + "' )";
this.dataGridView1.DataSource = AutoNumberedTable(dt);
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("added successfully");
textBox2.Text = string.Empty;
textBox1.Text = string.Empty;
textBox3.Text = string.Empty;
textBox4.Text = string.Empty;
textBox5.Text = string.Empty;
textBox6.Text = string.Empty;
textBox7.Text = string.Empty;
textBox8.Text = string.Empty;
textBox9.Text = string.Empty;
textBox10.Text = string.Empty;
textBox11.Text = string.Empty;
textBox12.Text = string.Empty;
spisok();
}
// Метод делете
private void delete(int id)
{
string sql = "DELETE FROM city WHERE id=" + id + "";
command = new MySqlCommand(sql, con);
//OPEN CON, EXECUTE DELETE, CLOSE CON
try
{
con.Open();
adapter = new MySqlDataAdapter(command);
adapter.DeleteCommand = con.CreateCommand();
adapter.DeleteCommand.CommandText = sql;
// PROMT FOR CONFIRMATION
if (command.ExecuteNonQuery() > 0)
{
MessageBox.Show("Deleted");
}
con.Close();
spisok();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//Delete button
private void button3_Click(object sender, EventArgs e)
{
string selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
int tb = Convert.ToInt32(selected);
delete(tb);
}
//UPDATE PROSESS
private void update(int id)
{
string sql = "UPDATE city SET name of product='" + textBox2.Text + "', product type='" + textBox1.Text + "', product prefix='" + textBox3.Text + "', installed capacity of equipment='" + textBox4.Text + "', unused equipment capacity='" + textBox5.Text + "', total internet traffic='" + textBox6.Text + "', unused internet traffic='" + textBox9.Text + "', number of subscription fees='" + textBox8.Text + "', number of internet boards='" + textBox7.Text + "', year='" + textBox12.Text + "', geolocationC='" + textBox10.Text + "', geolocationC='" + textBox11.Text + "'";
command = new MySqlCommand(sql, con);
//OPEN CON, EXECUTE DELETE, CLOSE CON
try
{
con.Open();
adapter = new MySqlDataAdapter(command);
adapter.UpdateCommand = con.CreateCommand();
adapter.UpdateCommand.CommandText = sql;
// PROMT FOR CONFIRMATION
if (adapter.UpdateCommand.ExecuteNonQuery() > 0)
{
MessageBox.Show("Successfully UPDATED!");
}
con.Close();
spisok();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
con.Close();
}
}
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
id = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].Value.ToString());
textBox2.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
textBox1.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
textBox3.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
textBox4.Text = dataGridView1.CurrentRow.Cells[4].Value.ToString();
textBox5.Text = dataGridView1.CurrentRow.Cells[5].Value.ToString();
textBox6.Text = dataGridView1.CurrentRow.Cells[6].Value.ToString();
textBox9.Text = dataGridView1.CurrentRow.Cells[7].Value.ToString();
textBox8.Text = dataGridView1.CurrentRow.Cells[8].Value.ToString();
textBox7.Text = dataGridView1.CurrentRow.Cells[9].Value.ToString();
textBox12.Text = dataGridView1.CurrentRow.Cells[10].Value.ToString();
textBox10.Text = dataGridView1.CurrentRow.Cells[11].Value.ToString();
textBox11.Text = dataGridView1.CurrentRow.Cells[12].Value.ToString();
}
private void textBox13_TextChanged(object sender, EventArgs e)
{
con.Open();
string query = "Select * From city where name of product like '%" + textBox13.Text + "%' OR product type like '%" + textBox13.Text + "%' OR product prefix like '%" + textBox13.Text + "%' OR installed capacity of equipment like '%" + textBox13.Text + "%' OR unused equipment capacity like '%" + textBox13.Text + "%' OR total internet traffic like '%" + textBox13.Text + "%' OR unused internet traffic like '%" + textBox13.Text + "%' OR number of subscription fees like '%" + textBox13.Text + "%' OR number of internet boards like '%" + textBox13.Text + "%' OR year like '%" + textBox13.Text + "%' OR geolocationC like '%" + textBox13.Text + "%' OR geolocationC like '%" + textBox13.Text + "%' OR geolocationB like '%" + textBox13.Text + "%'";
DataSet dset = new DataSet();
MySqlDataAdapter adapter = new MySqlDataAdapter(query, con);
MySqlCommandBuilder builder = new MySqlCommandBuilder(adapter);
adapter.Fill(dset);
dataGridView1.DataSource = dset.Tables[0];
con.Close();
}
private void button6_Click(object sender, EventArgs e)
{
try
{
con.Open();
command = new MySqlCommand("update city SET name of product='" + textBox2.Text + "', product type='" + textBox1.Text + "', product prefix='" + textBox3.Text + "', installed capacity of equipment='" + textBox4.Text + "', unused equipment capacity='" + textBox5.Text + "', total internet traffic='" + textBox6.Text + "', unused internet traffic='" + textBox9.Text + "', number of subscription fees='" + textBox8.Text + "', number of internet boards='" + textBox7.Text + "', year='" + textBox12.Text + "', geolocationC='" + textBox10.Text + "', geolocationC='" + textBox11.Text + "' WHERE tb='" + tertip + "'", con);
command.ExecuteNonQuery();
MessageBox.Show("updated!");
con.Close();
spisok();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
Ответы (1 шт):
Здесь много работы, чтобы привести этот код в порядок. Начните с выноса повторяющегося кода в отдельный класс.
Например у вас есть 2 формы
public partial class Form1 : Form
{
const string connectionString = "server = 192.168.1.200; UserId = user; Password = user; database = equipment";
public Form1()
{
InitializeComponent();
}
private Method()
{
//...
}
private void button1_click(object sender, EventArgs e)
{
Method();
}
}
public partial class Form2 : Form
{
const string connectionString = "server = 192.168.1.200; UserId = user; Password = user; database = equipment";
public Form2()
{
InitializeComponent();
}
private Method()
{
//...
}
private void button1_click(object sender, EventArgs e)
{
Method();
}
}
И есть главная форма, например такая
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void button1_click(object sender, EventArgs e)
{
var form = new Form1();
form.Show();
}
private void button2_click(object sender, EventArgs e)
{
var form = new Form2();
form.Show();
}
}
Тогда вы можете вынести одинаковые методы в один класс
public class DatabaseConnector
{
const string connectionString = "server = 192.168.1.200; UserId = user; Password = user; database = equipment";
public Method()
{
//...
}
}
В главной форме создать его экземпляр и передать его формам
public partial class MainForm : Form
{
private readonly DatabaseConnector dbConnector = new DatabaseConnector();
public MainForm()
{
InitializeComponent();
}
private void button1_click(object sender, EventArgs e)
{
var form = new Form1(dbConnector);
form.Show();
}
private void button2_click(object sender, EventArgs e)
{
var form = new Form2(dbConnector);
form.Show();
}
}
В формах его принять и использовать
public partial class Form1 : Form
{
private readonly DatabaseConnector dbConnector;
public Form1(DatabaseConnector dbConnector)
{
this.dbConnector = dbConnector;
InitializeComponent();
}
private void button1_click(object sender, EventArgs e)
{
dbConnector.Method();
}
}
public partial class Form2 : Form
{
private readonly DatabaseConnector dbConnector;
public Form2(DatabaseConnector dbConnector)
{
this.dbConnector = dbConnector;
InitializeComponent();
}
private void button1_click(object sender, EventArgs e)
{
dbConnector.Method();
}
}
Таким образом код повторяться не будет.
На вопрос "почему тормозит" - потому что вы используете один и тот же поток выполнения кода для работы с базой и интерфейса. Пока приложение работает с базой, оно не может работать с интерфейсом, обновлять его, и подвисает.
Еще вы постоянно открываете и закрываете подключение к базе. Попробуйте держать одно единственное подключение открытым и закрывать его например только когда приложение закрывается. Можно для этого подписаться на событие Form.Closing у главного окна.
Для исправления ситуации нужно использовать асинхронные методы работы с базой, либо выносить работу с базой в другой поток. То есть использовать многопоточность. Но начните именно с приведения кода в порядок, потому что сейчас если дорабатывать код, придется делать это в 12 местах одновременно, легко ошибиться при внесении правок.
