Вылетает программа при считывании данных (классы)

SQL запросом вытягиваю логин и пароль. Их нужно записать в список, чтоб потом можно было вывести логин в checketListBox. После этого я помечаю аккаунты и использую их для запуска 1С. т.е в параметры запуска должны вставляться логин и пароль. Но у меня почему то вылетает программа на финальном этапе. Класс простейший

 public class Person
    {
        public string Name;
        public string Password;
    }

После него идет объявление списка

public List<Person> persons = new List<Person>();

Вот так вот считываю (наверное ужасно делаю) данные в перменные

 using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlCommand command = new SqlCommand(sqlExpression, connection);
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                Person p = new Person
                {
                    Name = reader.GetString(0).ToString().Trim(),
                    Password = reader.GetString(1).ToString().Trim()
                };
                persons.Add(p);
            }
            reader.Close();
        }
        foreach (var item in persons)
        {
            checkListNormal.Items.Add(item.Name);
        }

Данные успешно попадают в две переменные. count 4. И успешно добавляются в CheckListBox

А вот при запуске 1С, ловлю Dispose формы на моменте подстановки данных. Где я ошибся? Спасибо

using (Process pProcess = new Process())
                {
                    // Запуск клиентов
                    pProcess.StartInfo.FileName = @"C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe";
                    pProcess.StartInfo.Arguments = string.Format($"enterprise & /D\\\\192.168.0.0\\bases\\base & /N{((Person)itemChecked).Name} & /P{((Person)itemChecked).Password}");
                    pProcess.StartInfo.UseShellExecute = false;
                    pProcess.EnableRaisingEvents = true;
                    pProcess.Start();
                    }
                }

Ответы (1 шт):

Автор решения: Frehzy

Написал универсальный метод для получения класса из Select запроса (думаю, именно такие вы и используете). Единственное - у вас используется Sql, а у меня MySql, но разница у них не сильно большая. Просто чуть подправьте под себя запрос в БД. Обработку самого результата не трогайте:

public MySqlConnection GetDBConnection(int timeOut = 30)
{
    string connString = "Server=" + Host
        + ";Database=" + DataBaseName
        + ";port=" + Port
        + ";User Id=" + Username
        + ";password=" + Password
        + ";Connection Timeout=" + timeOut;

    MySqlConnection conn = new(connString);

    return conn;
}

public List<T> SqlQuery<T>(string query)
{
    var result = new List<T>();

    using (MySqlConnection connection = GetDBConnection())
    {
        connection.Open();
        using var command = connection.CreateCommand();
        command.CommandText = query;
        using var reader = command.ExecuteReader();
        var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToArray();
        var properties = typeof(T).GetProperties();

        while (reader.Read())
        {
            var data = new object[reader.FieldCount];
            reader.GetValues(data);

            var instance = (T)Activator.CreateInstance(typeof(T));

            for (var i = 0; i < data.Length; ++i)
            {
                if (data[i] == DBNull.Value)
                    data[i] = null;

                var property = properties.SingleOrDefault(x => x.Name.Equals(columns[i], StringComparison.InvariantCultureIgnoreCase));

                if (property is not null)
                {
                    var dataValue = Guid.TryParse(data[i].ToString(), out Guid res) is true ? res : data[i];
                    property.SetValue(instance, Convert.ChangeType(dataValue, property.PropertyType));
                }
            }
            result.Add(instance);
        }
    }
    return result;
}

Как вызывать метод (needClass в вашем случае будет Person):

var list = new *ClassName*().SqlQuery<*needClass*>();

Если вам нужно сделать что-то с этим листом, то советую использовать ForEach.

Так же, не забывайте о том, что класс Person должен иметь "полноценные" свойства:

public class Person
{
    public string Name { get; set; }

    public string Password { get; set; }

    public Person() { }

    public Person(string name, string password)
    {
        Name = name;
        Password = password;
    }
}
→ Ссылка