Как я могу переместить запрос данных от пользовательской формы. Winform C# - PullRequest
0 голосов
/ 30 марта 2020

Я совершенно новичок в C# программировании и пытаюсь учиться самостоятельно. В настоящее время я создаю мини-проект для тренировки.

Я понимаю, что пользовательский уровень не должен иметь никаких запросов данных, возможно, из соображений безопасности?

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

  public class DataAccess
{


    public List<Customer> FilteredCustomersList(string name)
    {
        using (IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection(Helper.CnnVal("FineCreteDB")))
        {
            var output = connection.Query<Customer>($"SELECT * from `Customers` WHERE `Cust_Name` LIKE '{name}'").ToList();
            return output;
        }
    }

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

 private void RetrieveData()
    {
        try
        {
            DataAccess db = new DataAccess();
            filteredcustomers = db.FilteredCustomersList(CustomerNameTxtBox_AutoComplete.Text);
            ntn_num = filteredcustomers.Select(x => x.Cust_NTN).ElementAt(0);
            strn_num = filteredcustomers.Select(x => x.Cust_STRN).ElementAt(0);
            address = filteredcustomers.Select(x => x.Cust_Address).ElementAt(0);
            phone_num = filteredcustomers.Select(x => x.Cust_Phone).ElementAt(0);
            id_num = filteredcustomers.Select(x => x.Cust_ID).ElementAt(0);
        }
        catch (Exception)
        {
            MessageBox.Show("Customer not found. If customer was recently added, try updating DB.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            DataAccess db = new DataAccess();
            filteredcustomers = db.AllCustomersList();
            ntn_num = "";
            strn_num = "";
            address = "";
            phone_num = "";
        }
    }

На стороне формы пользователя «FilterCustomers» содержит список отправленных данных, теперь вот проблема : я использую список фильтрованных клиентов, чтобы извлечь различные значения столбцов, например, так:

address = filteredcustomers.Select(x => x.Cust_Address).ElementAt(0);

, а затем использовать их для заполнения соответствующих текстовых полей, таких как:

Address_TxtBox.Text = address;

Все работает нормально, но я не хочу, чтобы пользовательская форма имела эти запросы для всех отдельных столбцов, потому что из того, что я понял до сих пор, это плохое программирование и плохое для безопасности.

Может кто-нибудь подсказать мне, как мне сохранить значения в слое доступа к данным и просто вызвать их в форму? Извините, если это длинный пост, я только учусь и хотел быть как можно более подробным.

1 Ответ

0 голосов
/ 30 марта 2020

Вы уже все делаете правильно, в соответствии с тем, как должен использоваться Dapper. Dapper не поддерживает локальный граф сущностей из БД, отслеживает изменения в нем и автоматически сохраняет их. Если вы этого хотите, используйте что-то вроде EF

. Для более щадящего поиска вы извлекаете данные с помощью SELECT и отправляете их обратно с помощью UPDATE

Если вы ожидаете, что имя будет иметь только один клиент, сделайте это :

var output = connection.QueryFirstOrDefault<Customer>($"SELECT * from `Customers` WHERE `Cust_Name` LIKE @n", new { n = name });

https://dapper-tutorial.net/queryfirst

Это вернет только один экземпляр клиента (или ноль; проверьте его!), Что означает, что вы можете привести в порядок свой код формы:

        c = db.FilteredCustomer(CustomerNameTxtBox_AutoComplete.Text);
        ntn_num = c?.Cust_NTN;
        strn_num = c?.Cust_STRN;

И т. Д.

Ваше "если клиент недавно был добавлен, попробуйте обновить базу данных", на самом деле не имеет смысла - запрос выполняется в реальном времени, поэтому база данных примерно равна дата, как это может быть

...