Проверьте пожалуйста код using System; using System.Data; using System.Data.OleDb; using System.Windows.Forms;
У меня есть код который должен создавать приложение WindowsForms и работать с БД Access.
Хочу чтобы опытные ребята как вы, указали на ошибки в нём, если они есть:
namespace DentalClinicApp
{
public partial class MainForm : Form
{
private const string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=путь_к_моей_базе_данных.accdb;";
public MainForm()
{
InitializeComponent();
LoadQueries();
}
private void LoadQueries()
{
// Загрузка доступных запросов
string[] queries = new string[]
{
"Запрос 1: Какое оборудование работает в поликлинике более 3 лет",
"Запрос 2: У какого ответственного врача оборудование работает без всякого ремонта",
"Запрос 3: Показать оснащенность по кабинетам (названия по алфавиту)",
"Запрос 4: Предоставить общую сумму, потраченную на ремонты с даты 'Дата' по дату 'Дата'",
"Запрос 5: Показать разницу сумм приобретения и ремонтов по каждому из видов оборудования",
"Запрос 6: Когда сумма ремонтов какого-то оборудования превышает сумму, потерянную на приобретение"
};
queryComboBox.Items.AddRange(queries);
}
private void ExecuteQueryButton_Click(object sender, EventArgs e)
{
string selectedQuery = queryComboBox.SelectedItem.ToString();
string query = "";
switch (selectedQuery)
{
case "Запрос 1: Какое оборудование работает в поликлинике более 3 лет":
query = "SELECT Код_оборудования, Название_оборудования FROM Оборудование WHERE Дата_приобретения < DateAdd('yyyy', -3, Date())";
break;
case "Запрос 2: У какого ответственного врача оборудование работает без всякого ремонта":
query = "SELECT DISTINCT Ответственный_врач FROM Оборудование WHERE Код_оборудования NOT IN (SELECT Код_оборудования FROM Ремонты)";
break;
case "Запрос 3: Показать оснащенность по кабинетам (названия по алфавиту)":
query = "SELECT Номер_кабинета, Название_кабинета, Ответственный_врач FROM Кабинеты ORDER BY Название_кабинета";
break;
case "Запрос 4: Предоставить общую сумму, потраченную на ремонты с даты 'Дата' по дату 'Дата'":
query = "SELECT SUM(Сумма) AS Общая_сумма FROM Ремонты WHERE Дата_ремонта BETWEEN #Дата_начала# AND #Дата_конца#";
break;
case "Запрос 5: Показать разницу сумм приобретения и ремонтов по каждому из видов оборудования":
query = "SELECT О.Название_оборудования, SUM(П.Сумма) AS Сумма_приобретения, SUM(Р.Сумма) AS Сумма_ремонта " +
"FROM (Оборудование AS О INNER JOIN Приобретение AS П ON О.Код_оборудования = П.Код_оборудования) " +
"LEFT JOIN Ремонты AS Р ON О.Код_оборудования = Р.Код_оборудования " +
"GROUP BY О.Название_оборудования";
break;
case "Запрос 6: Когда сумма ремонтов какого-то оборудования превышает сумму, потерянную на приобретение":
query = "SELECT О.Код_оборудования, О.Название_оборудования " +
"FROM Оборудование AS О " +
"INNER JOIN Ремонты AS Р ON О.Код_оборудования = Р.Код_оборудования " +
"GROUP BY О.Код_оборудования, О.Название_оборудования " +
Это остальная часть кода, весь не поместился сразу в вопрос :)
:
"HAVING SUM(Р.Сумма) > SUM(П.Количество * П.Цена)";
break;
}
// Выполнение запроса и отображение результатов
using (OleDbConnection connection = new OleDbConnection(ConnectionString))
{
connection.Open ();
using (OleDbCommand cmd = new OleDbCommand(query, connection))
{
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
resultDataGridView.DataSource = dataTable;
}
}
}
}
}
я бы питон использовал
Ошибки в коде ты можешь сам найти, если протестируешь приложение. Тут можно лишь написать, как можно было бы сделать код лучше. Например, ты мог бы работать с объектами, в свой Combobox ты мог добавлять полноценные объекты с переписанным ToString-методом, и оттуда уже брать необходимую логику выполнения запросов. В этом случае можно было бы избежать ненужных цепочек switch cas'ов.