Datagrid как подключить бд
Перейти к содержимому

Datagrid как подключить бд

  • автор:

Datagrid как подключить бд

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Ранее мы рассмотрели, как удобно загружать данные в приложении Windows Forms в элемент DataGridView через DataSet. Теперь определим полнофункциональную форму, через которую мы сможем производить все стандартные CRUD операции в базе данных.

Итак, определим форму, на которой будет элемент DataGridView и три кнопки для добавления, удаления и сохранения изменений. Форма в итоге будет выглядеть примерно следующим образом:

DataSet и DataGridView

Код формы будет выглядеть следующим образом:

using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace AdoNetWinFormsApp < public partial class Form1 : Form < DataSet ds; SqlDataAdapter adapter; SqlCommandBuilder commandBuilder; string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; string sql = "SELECT * FROM Users"; public Form1() < InitializeComponent(); dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.AllowUserToAddRows = false; using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); ds = new DataSet(); adapter.Fill(ds); dataGridView1.DataSource = ds.Tables[0]; // делаем недоступным столбец id для изменения dataGridView1.Columns["Id"].ReadOnly = true; >> // кнопка добавления private void addButton_Click(object sender, EventArgs e) < DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable ds.Tables[0].Rows.Add(row); >// кнопка удаления private void deleteButton_Click(object sender, EventArgs e) < // удаляем выделенные строки из dataGridView1 foreach(DataGridViewRow row in dataGridView1.SelectedRows) < dataGridView1.Rows.Remove(row); >> // кнопка сохранения private void saveButton_Click(object sender, EventArgs e) < using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); commandBuilder = new SqlCommandBuilder(adapter); adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; adapter.Update(ds); >> > >

Здесь для добавления объекта мы будем обращаться к хранимой процедуре sp_CreateUser, которая была добавлена в базу данных в прошлой теме.

В конструкторе данные загружаются в DataSet, первая таблица которого устанавливается в качестве источника данных для dataGridView1:

dataGridView1.DataSource = ds.Tables[0];

Также в конструкторе устанавливается полное выделение строки и запрет на ручное добавление новых строк:

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.AllowUserToAddRows = false;

В обработчике кнопки добавления создается новая строка, которая добавляется в таблицу объекта DataSet. И так как мы ранее установили привязку к источнику данных, то автоматически новая строка также будет добавляться и в dataGridView1:

private void addButton_Click(object sender, EventArgs e) < DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable ds.Tables[0].Rows.Add(row); >

В обработчике кнопки удаления удаляются выделенные строки в dataGridView1. Опять же в силу привязки к источнику данных будет также происходить удаление и из таблицы в DataSet:

private void deleteButton_Click(object sender, EventArgs e) < foreach(DataGridViewRow row in dataGridView1.SelectedRows) < dataGridView1.Rows.Remove(row); >>

Для обновления на не нужна никакая кнопка, так как мы можем нажать на любую ячейку таблицы (кроме заблокированного для изменения столбца Id) и изменить в ней данные. Однако сами по себе добавление новой строки, удаление строк, изменение ячеек ни как автоматически не отразятся на базе данных. И чтобы бд синхронизировалась, пользователю надо будет нажать на кнопку сохранения, обработчик которой выглядит следующим образом:

private void saveButton_Click(object sender, EventArgs e) < using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); commandBuilder = new SqlCommandBuilder(adapter); adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; adapter.Update(ds); >>

Как в прошлой теме здесь устанавливается у адаптера команда на добавление InsertCommand и затем вызывается метод Update() . В итоге мы можем добавить несколько строк, удалить, изменить, и потом один раз мы нажмем на кнопку, и все изменения будут применены к базе данных.

Подключение к базе данных и вывод в DataGrid

, то тогда все работает.
Но ведь соединение должно проходить выше так как OpenConnection() возвращает «true»?

Да забыл уточнить. что обращаюсь я из другого файла (может это важно. )

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
using System.Data; using System.Windows; using System.Windows.Controls; namespace Wpf_MySql_1 { public partial class MGrid : UserControl { public MGrid() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { DBConnect dbconnect = new DBConnect(); DataTable dt = dbconnect.MySelect(); MyGrid.ItemsSource = dt.DefaultView; } } }

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Подключение к базе данных и вывод данных в DataGridView завершается с ошибкой
Подскажите что не так с кодом выкидывает разные ошибки Сейчас пишет:Error: .Net SqlClient Data.

Привязка колонок DataGrid к базе данных SQL
Проблема заключается в том, что колонки остаются пустыми. Делаю привязку так: .

Как подключить DataGrid к базе данных sqlite?
Могу считать из БД в TextBlock (закомментированный кусок в коде) Могу считать List в DataGrid.

Эксперт .NET

11808 / 8129 / 1241
Регистрация: 21.01.2016
Сообщений: 30,601

mserg1972, Оператор using закрывает подключение при выходе из блока. Для чего, по вашему, он вообще используется?

Регистрация: 18.12.2013
Сообщений: 239

Можно поподробнее, что происходит? Насколько я понял оператор using это просто синт. сахар. Почему он закрывает соединение? Ведь ошибки и исключения нет при выполнении внутри using

Добавлено через 14 минут
Правильно я понял, что компилятор по аналогии с областью видимости переменных внутри блока Using (using сообщает компилятору, что объявляемая переменная должна быть удалена в конце области видимости) так же поступает и с открытым соединением, тоже его закрывает?

Добавлено через 8 минут
Как тогда правильнее изменить код, отказаться в данном случае от Using?

Эксперт .NET

11808 / 8129 / 1241
Регистрация: 21.01.2016
Сообщений: 30,601

Лучший ответ

Сообщение было отмечено Элд Хасп как решение

Решение

mserg1972, Оператор using вызывает метод Dispose() объекта, который ему был передан, при выходе из области видимости этого оператора. В этом методе (Dispose()) располагается логика высвобождения ресурсов, к коим относится и подключение к базе.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Обновление данных в базе при обновлении в DataGrid windows from
Подскажите пожалуйста почему при изменении данных в DataGrid windows form не происходят изменения в.

MySQL: подключение к базе и вывод содержимого таблицы
Всем доброго времени суток. Кто работал с MYSQL в С++ builder, может кто нибудь скинуть пример, что.

Подключение к базе данных
По сути, должна выполняться проверка подключения к БД , при прохождении вывод сообщения.

Подключение к базе данных
Есть сервер с именем "KS-Nicola\KSERVER" на нем база "tores". Вопрос такой как подключиться к этой.

Вывод данных из БД в DataGridView

не смог найти тему с ответом на мой вопрос. Есть база данных на локальном сервере MySql. Создаю приложение Windows Forms, соединение устанавливается с БД, но данные не выводятся в DataGridView. Точнее выводятся, но пишет System.Collections.Generic.List`1[System.String] за место данных и то только в 1-ом столбце. Не могу понять что это. Подскажите пожалуйста как мне сделать работоспособную программу Вот код соединения с БД. Метод public List[] Select() создаёт список для вывода.

class DBconnect < private MySqlConnection connection; private string server, database, uid, password; public DBconnect() < Initialize(); >private void Initialize() < server = "localhost"; database = "catalog_personal"; uid = "root"; password = " "; string connectionString; connectionString = " SERVER =" + server + " ;" + " DATABASE =" + database + " ;" + " UID =" + uid + " ;" + "PASSWORD =" + password + " ;"; connection = new MySqlConnection(connectionString); >//Открываем соединение private bool OpenConnection() < try < connection.Open(); return true; >catch(MySqlException ex) < // При обработке ошибок вы можете основывать ответ вашего приложения // по номеру ошибки. // Два наиболее распространенных номера ошибок при подключении: // 0: не удается подключиться к серверу. // 1045: неверное имя пользователя и / или пароль. switch(ex.Number) < case 0: MessageBox.Show("Невозможно подключиться к серверу, " + "связаться с админ-панелью"); break; case 1045: MessageBox.Show("Неверное имя пользователя / пароль, " + "пожалуйста, попробуйте еще раз"); break; >return false; > > //Закрываем соединение private bool CloseConnection() < try < connection.Close(); return true; >catch (MySqlException ex) < MessageBox.Show(ex.Message); return false; >> public List[] Select() < string query = " SELECT * FROM personal"; //Создаем список для сохранения результа вывода List[] list = new List[4]; list[0] = new List(); list[1] = new List(); list[2] = new List(); list[3] = new List(); //Открываем соединение if (this.OpenConnection() == true) < //Создаем команду MySqlCommand cmd = new MySqlCommand(query, connection); //Создаем читатель данных и выполняем команду чтения MySqlDataReader dataReader = cmd.ExecuteReader(); while (dataReader.Read()) < list[0].Add(dataReader[0].ToString()); list[1].Add(dataReader[1].ToString()); list[2].Add(dataReader[2].ToString()); list[3].Add(dataReader[3].ToString()); >this.CloseConnection(); return list; > else < return list; >> > 

Код в Form1

public partial class Form1 : Form < public Form1() < InitializeComponent(); LoadData(); >private void LoadData() < DBconnect db = new DBconnect(); foreach (var s in db.Select()) < dataGridView1.Rows.Add(s); >> > 

Результат ошибки

Вот что получается в результате, прикрепляю скрин

Отслеживать
задан 7 ноя 2019 в 14:43
33 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков

почему не использовать MySqlDataAdapter? Он сразу положит результат в DataTable. а его в свою очередь передадите в dataGridView1.DataSource. Select и LoadData будут из 2х строчек и соответственно без ошибок.

7 ноя 2019 в 14:54

Не разу не имел дело с DataAdapter, в программировании новичок. Если черканёте строчек кода, буду неимоверно признателен 🙂

7 ноя 2019 в 15:10

С адаптером может и удобно, но тогда ваш код получится жестко связанным с БД. Гибче подход работать все таки в парадигме ООП и создавать классы модели, т.е. вы должны создать класс Сотрудник и из БД извлекать и отображать список Сотрудников, а не массив стрингов или виртуальное зеркало таблицы БД коей является работа через адаптер.

7 ноя 2019 в 15:23

А работу через адаптер можно посмотреть в youtube, достаточно зайти на сайт и задать поиск c# mysql insert update delete и получите кучу индуского инглиша и разной степени паршивости примеров такой работы.

7 ноя 2019 в 15:26
Спасибо за совет, попробую разобраться. Если не разберусь, придётся заново открыть вопрос)))
7 ноя 2019 в 15:44

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Рассмотрим подробнее ваш пример. Вот вы «набросали» на форму контролы, и вам нужно начать программировать работу с ними. Что бы тут хотелось бы.

Во-первых, не торопитесь сразу создавать БД и подключаться к ней. Для быстрого прототипирования приложения БД не нужна и даже вредна, т.к. отвлекает время и внимание на работу с ней.

Во-вторых, в прил. необходимо выделить слои, минимально 3: слой отображения (визуальный интерфейс), слой модели предметной области с кот. работает ваше прил. и слой хранения (это как раз работа с БД).

Начнем с создания модели. У нас модель достаточно простая. Я добавил еще статич. метод для клонирования экземпляра класса, зачем? Объясню ниже.

public class Employee < public int Id < get; set; >//порядковый номер для отображения в DGV public int OrderNumber < get; set; >//имя public string FirstName < get; set; >//фамилия public string LastName < get; set; >public string Phone < get; set; >public Employee(int id, string firstName = "", string lastName = "", string phone = "") < FirstName = firstName; LastName = lastName; Phone = phone; >/// /// Получение клонированного экземпляра /// /// существующий экземпляр /// клон существующего сотрудника public static Employee GetClone(Employee employee) < if (employee is null) throw new System.ArgumentNullException(nameof(employee)); return new Employee(employee.Id) < FirstName = employee.FirstName, LastName = employee.LastName, Phone = employee.Phone, >; > public override string ToString() < return $": "; > > 

Слой хранения начнем с абстракции, с создания интерфейса репозитория.

public interface IEmployeeRepository < //получение всех Task>> GetEmployees(); //добавление Task> AddEmployee(Employee employee); //удаление Task> RemoveEmployee(int id); //обновление Task> UpdateEmployee(Employee emp); > 

Здесь мы объявляем все нужные нам для работы методы. Кстати, вы можете начинать прямо с пустого интерфейса, и по мере надобности добавлять в него нужные члены. Обратите внимание, что предполагается работа в асинхронном режиме, и да, есть еще какой-то Result !

Result — это пример т.н. монады, спец. класса для возвращения результата в случае если в методе возникнет ошибка или результат может быть равным null . Подробнее см.видео. Вот его код

/// /// Монада Result для возвращения результата вместо null /// и для случаев когда возникает Exception, а результат из метода /// нужно возвращать какой-то /// /// public class Result  < public readonly T Value; public readonly string Error; //ctors public Result(T value) < Value = value; Error = String.Empty; >public Result(string error) < Error = error; >public bool HasValue => String.IsNullOrEmpty(Error); public static implicit operator bool(Result result) < return result.HasValue; >> 

Теперь вернемся к интерфейсу приложения. Код формы такой

public partial class MainForm : Form < //Источник данных для DGV private BindingSource _bsEmployees; //редактируемый сотрудник private BindingSource _bsCurrentEmployee; //работа с БД private IEmployeeRepository _repo; public MainForm() < InitializeComponent(); StartPosition = FormStartPosition.CenterScreen; Text = "Пример работы с MySql"; //установка привязок SetBindings(); this.Load += MainForm_Load; >private void MainForm_Load(object sender, EventArgs e) < //тестовый репозиторий _repo = new TestRepository(); //Загрузка данных LoadData(); //кнопки _buttonAdd.Click += ButtonAdd_Click; _buttonRemove.Click += ButtonRemove_Click; _buttonSave.Click += ButtonSave_Click; _buttonNext.Click += ButtonNext_Click; _buttonPrev.Click += ButtonPrev_Click; //клик по строке в DGV _dataGridViewEmployees.MouseClick += (s, a) =>SetCurrentEmployee(); > private void SetBindings() < _bsEmployees = new BindingSource(); _bsEmployees.DataSource = typeof(List); //привязки для DGV _dataGridViewEmployees.AutoGenerateColumns = false; _dataGridViewEmployees.DataSource = _bsEmployees; //привязки у столбцов _columnNumber.DataPropertyName = nameof(Employee.OrderNumber); _columnFirstName.DataPropertyName = nameof(Employee.FirstName); _columnLastName.DataPropertyName = nameof(Employee.LastName); _columnPhone.DataPropertyName = nameof(Employee.Phone); //текстбоксы _bsCurrentEmployee = new BindingSource(); _bsCurrentEmployee.DataSource = new List < new Employee(0) >; _textBoxFirstName.DataBindings.Add("Text", _bsCurrentEmployee, nameof(Employee.FirstName)); _textBoxLastName.DataBindings.Add("Text", _bsCurrentEmployee, nameof(Employee.LastName)); _textBoxPhone.DataBindings.Add("Text", _bsCurrentEmployee, nameof(Employee.Phone)); > private async void LoadData() < //получаем var result = await _repo.GetEmployees(); if (result) < //извлекаем Listemployees = result.Value; //пронумеровываем int i = 1; employees.ForEach(e => e.OrderNumber = i++); //отображаем _bsEmployees.DataSource = employees; _bsEmployees.MoveFirst(); SetCurrentEmployee(); > else < MessageBox.Show(result.Error, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); >> private void ButtonAdd_Click(object sender, EventArgs e) < //курсор на последнего _bsEmployees.MoveLast(); //след.порядковый номер int number = (_bsEmployees.Current as Employee).OrderNumber + 1; //добавляем нового _bsEmployees.Add(new Employee(0) < OrderNumber = number >); //выделяем его _bsEmployees.MoveNext(); SetCurrentEmployee(); //выделяем имя для редактирования _textBoxFirstName.Focus(); > private async void ButtonSave_Click(object sender, EventArgs e) < SwitchOnWaiting(); var current = (Employee)_bsCurrentEmployee.Current; Resultresult; try < if (current.Id == 0) < //добавляем нового сотрудника result = await _repo.AddEmployee(current); >else < //иначе обновляем существующего сотрудника result = await _repo.UpdateEmployee(current); >if (result) < //перечитываем данные LoadData(); >> finally < SwitchOffWaiting(); >if(!result) < MessageBox.Show(result.Error, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); >> private async void ButtonRemove_Click(object sender, EventArgs e) < SwitchOnWaiting(); //получаем текущего var employee = (Employee)_bsEmployees.Current; Resultresult; try < //удаляем из БД result = await _repo.RemoveEmployee(employee.Id); if (result) < //удаляем из отображения _bsEmployees.Remove(employee); _bsEmployees.MoveFirst(); SetCurrentEmployee(); >> finally < SwitchOffWaiting(); >if (!result) < MessageBox.Show(result.Error, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); >> private void ButtonPrev_Click(object sender, EventArgs e) < _bsEmployees.MovePrevious(); SetCurrentEmployee(); >private void ButtonNext_Click(object sender, EventArgs e) < _bsEmployees.MoveNext(); SetCurrentEmployee(); >private void SetCurrentEmployee() < if (_bsEmployees.Count >0) < _bsCurrentEmployee.List[0] = Employee.GetClone((Employee)_bsEmployees.Current); >else < _bsCurrentEmployee.List[0] = new Employee(0); >_bsCurrentEmployee.ResetItem(0); > private void SwitchOnWaiting() < foreach (var button in this.Controls.OfType()) < button.Enabled = false; >_dataGridViewEmployees.Enabled = false; Cursor = Cursors.WaitCursor; > private void SwitchOffWaiting() < foreach (var button in this.Controls.OfType()) < button.Enabled = true; >_dataGridViewEmployees.Enabled = true; Cursor = Cursors.Default; > > 

На что хотелось бы обратить внимание.

Работаем через привязки, используем для этого два экземпляра BindingSource , один для DataGridView , второй для текстбоксов текущего редактируемого или создаваемого нового сотрудника. По клику на DGV или переходе с пом.кнопок к следующему или предыдущему создается клон и привязывается текстбоксам. Сделано так для того, чтобы исключить одновременное изменение свойств выделенного сотрудника в DGV и пользователь понимал, что необходимо нажать кнопку Сохранить для запоминания изменений.

В методе MainForm_Load() сделано подключение к фейковой БД _repo = new TestRepository(); или точнее классу реализующему IEmployeeRepository c тестовыми данными. Рассмотрим его

class TestRepository : IEmployeeRepository < private List_employees; public TestRepository() < _employees = new List< new Employee(1, "Иван", "Голунов", "+7561234567"), new Employee(2, "Сергей", "Смирнов", "+77861234567"), new Employee(3, "Дарья", "Смирнова", "+798475563"), new Employee(4, "Кристина", "Семяжко", "+7304985023"), new Employee(5, "Владимир", "Драгунов", "+73431234567"), >; > public Task> GetEmployees() < var result = new List(); foreach (var e in _employees) < var emp = new Employee(e.Id, e.FirstName, e.LastName, e.Phone); result.Add(emp); >return Task.FromResult(new Result(result)); > public Task> AddEmployee(Employee employee) < if (employee is null) throw new ArgumentNullException(nameof(employee)); if (String.IsNullOrWhiteSpace(employee.FirstName) || String.IsNullOrEmpty(employee.FirstName)) < return Task.FromResult(new Result("Введите имя сотрудника.")); > if (String.IsNullOrWhiteSpace(employee.LastName) || String.IsNullOrEmpty(employee.LastName)) < return Task.FromResult(new Result("Введите фамилию сотрудника.")); > if (employee is null || employee.Id > 0) throw new ArgumentNullException(nameof(employee)); if (_employees.Count > 0) < employee.Id = _employees.Max(e =>e.Id) + 1; > else < employee.Id = 1; >_employees.Add(employee); return Task.FromResult(new Result(1)); > public Task> RemoveEmployee(int id) < if (id e.Id == id); if (emp != null) < _employees.Remove(emp); >return Task.FromResult(new Result(1)); > public Task> UpdateEmployee(Employee employee) < if (employee is null) throw new ArgumentNullException(nameof(employee)); if (String.IsNullOrWhiteSpace(employee.FirstName) || String.IsNullOrEmpty(employee.FirstName)) < return Task.FromResult(new Result("Введите имя сотрудника.")); > if (String.IsNullOrWhiteSpace(employee.LastName) || String.IsNullOrEmpty(employee.LastName)) < return Task.FromResult(new Result("Введите фамилию сотрудника.")); > var emp = _employees.FirstOrDefault(e => e.Id == employee.Id); if (emp != null) < emp.FirstName = employee.FirstName; emp.LastName = employee.LastName; emp.Phone = employee.Phone; >return Task.FromResult(new Result(1)); > > 

Представьте на минутку, вы фрилансер и у вас заказ на подобную программу. Вам нужно быстро разработать прототип и предоставить заказчику, чтоб он мог этот прототип запустить и посмотреть, оценить и проч. Если бы вы использовали сразу подключение к реальной БД у вас бы возникли трудности, не правда ли. А так без проблем, компилируем и отправляем экзешник по почте.

Заказчик доволен? 🙂 Пишем работу с реальной БД.

class MySqlRepository : IEmployeeRepository < public MySqlRepository() < >private MySqlConnection GetConnection() < var cs = ConfigurationManager.ConnectionStrings["MySqlConn"].ToString(); var builder = new MySqlConnectionStringBuilder(cs); //чтоб избежать проблем с русским языком builder.CharacterSet = "utf8"; return new MySqlConnection(builder.ConnectionString); >public async Task>> GetEmployees() < var list = new List(); try < using (var con = GetConnection()) using (var cmd = con.CreateCommand()) < cmd.CommandText = "SELECT * FROM employees"; con.Open(); using (var reader = await cmd.ExecuteReaderAsync()) < while (await reader.ReadAsync()) < var emp = new Employee(reader.GetInt32(0)); emp.FirstName = reader.GetString(1); emp.LastName = reader.GetString(2); emp.Phone = reader.GetString(3); list.Add(emp); >> > > catch (MySqlException ex) < return new Result(GetUserFriendlyErrorMessage(ex)); > catch (Exception ex) < return new Result(ex.Message); > return new Result(list); > public async Task> AddEmployee(Employee employee) < if (employee is null) throw new ArgumentNullException(nameof(employee)); if (String.IsNullOrWhiteSpace(employee.FirstName) || String.IsNullOrEmpty(employee.FirstName)) < return new Result("Введите имя сотрудника."); > if (String.IsNullOrWhiteSpace(employee.LastName) || String.IsNullOrEmpty(employee.LastName)) < return new Result("Введите фамилию сотрудника."); > int result = 0; try < using (var con = GetConnection()) using (var cmd = con.CreateCommand()) < cmd.CommandText = "INSERT INTO employees (first_name, last_name, phone)" + " VALUES(@firstName, @lastName, @phone)"; cmd.Parameters.Add(new MySqlParameter("@firstName", MySqlDbType.VarChar, 200) < Value = employee.FirstName >); cmd.Parameters.Add(new MySqlParameter("@lastName", MySqlDbType.VarChar, 300) < Value = employee.LastName >); cmd.Parameters.Add(new MySqlParameter("@phone", MySqlDbType.VarChar, 45) < Value = employee.Phone ?? (object)System.DBNull.Value >); con.Open(); result = await cmd.ExecuteNonQueryAsync(); > > catch (MySqlException ex) < return new Result(GetUserFriendlyErrorMessage(ex)); > catch (Exception ex) < return new Result(ex.Message); > return new Result(result); > public async Task> RemoveEmployee(int id) < if (id ); con.Open(); result = await cmd.ExecuteNonQueryAsync(); > > catch (MySqlException ex) < return new Result(GetUserFriendlyErrorMessage(ex)); > catch (Exception ex) < return new Result(ex.Message); > return new Result(result); > public async Task> UpdateEmployee(Employee employee) < if (employee is null) throw new ArgumentNullException(nameof(employee)); if (String.IsNullOrWhiteSpace(employee.FirstName) || String.IsNullOrEmpty(employee.FirstName)) < return new Result("Введите имя сотрудника."); > if (String.IsNullOrWhiteSpace(employee.LastName) || String.IsNullOrEmpty(employee.LastName)) < return new Result("Введите фамилию сотрудника."); > int result = 0; try < using (var con = GetConnection()) using (var cmd = con.CreateCommand()) < cmd.CommandText = "UPDATE employees" + " SET first_name = @firstName, last_name = @lastName, phone = @phone" + " WHERE cmd.Parameters.Add(new MySqlParameter("@firstName", MySqlDbType.VarChar, 200) < Value = employee.FirstName >); cmd.Parameters.Add(new MySqlParameter("@lastName", MySqlDbType.VarChar, 300) < Value = employee.LastName >); cmd.Parameters.Add(new MySqlParameter("@phone", MySqlDbType.VarChar, 45) < Value = employee.Phone ?? (object)System.DBNull.Value >); cmd.Parameters.Add(new MySqlParameter("@id", MySqlDbType.Int32) < Value = employee.Id >); con.Open(); result = await cmd.ExecuteNonQueryAsync(); > > catch (MySqlException ex) < return new Result(GetUserFriendlyErrorMessage(ex)); > catch (Exception ex) < return new Result(ex.Message); > return new Result(result); > private string GetUserFriendlyErrorMessage(MySqlException ex) < var message = String.Empty; switch (ex.Number) < case 0: if (ex.InnerException.Message.Contains("Unknown")) < message = "Неверное название схемы или таблицы."; >else if (ex.InnerException.Message.Contains("Access")) < message = "Неверное имя или пароль доступа."; >else < message = ex.Message; >break; case 1042: message = "Сервер по указанному адресу не доступен." + "\nОшибка ожидания."; break; case 1045: message = "Неверное имя пользователя или пароль, " + "\nпожалуйста, попробуйте еще раз."; break; default: message = ex.Message; break; > return message; > > 

В методе GetConnection() параметры соединения читаются из файла App.config

Для работы с этим классом, нужно вернуться в код формы и в методе MainForm_Load() изменить строчку получения экземпляра репозитория _repo = new MySqlRepository(); .

Да, и не забудьте сначала получить деньги от заказчика 🙂

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Вывод данных в DataGridView из БД на C#

В Windows Forms табличные данные удобно выводить с помощью элемента управления DataGridView. В статье покажем, как это сделать на примере таблицы из базы данных и языка программирования C#.

Исходные данные для DataGridView

Имеется таблица в базе данных Microsoft SQL Server с информацией о факультетах университета.

Данные для DataGridView

Эти данные будем выводить в элемент DataGridView, расположенный на Windows Forms.

Программа с DataGridView

Создадим новый проект Windows Forms на Visual C# в Visual Studio. На форме расположим элемент управления DataGridView — для этого перетащите его с «Панели элементов» на макет окна.

Добавим в DataGridView три столбца под три соответствующих колонки из таблицы БД с помощью кнопки «Правка столбцов».

Добавление столбцов в DataGridView

Для наглядности назовём их так же, как называются поля в таблице базы данных.

Форма с DataGridView

Переходим к написанию кода. Вся функциональность по чтению данных из БД и их последующему выводу в DataGridView реализована в методе LoadData().

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *