Вылетает программа при считывании данных (классы)
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 шт):
Написал универсальный метод для получения класса из 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;
}
}