В настоящее время я разрабатываю свои навыки кодирования, практикуя объектно-ориентированное программирование.Работа с несколькими SQL-соединениями
Я работаю с большим количеством SQL-соединений, чтобы получить информацию для инициализации объектов класса. Я считаю, что я плохо себя чувствую, из-за количества SQL-соединений, которые я инициализирую одновременно. Мне часто нужно запускать несколько соединений одновременно, чтобы завершить инициализацию моего основного класса. Ниже приведен краткий пример того, что я имею в виду.
У меня есть несколько классов. Каждый класс имеет несколько свойств другого типа класса. Вот краткий пример того, как это выглядит в основном:
public class UserAccount
{
public long UserId { get; set; }
public string UserName { get; set; }
public Address UserAddress { get; set;}
}
public class UserAddress
{
public long AddressId { get; set; }
public string Address { get; set; }
}
Теперь для того, чтобы восстановить информацию о каждом из этих классов, я использую специальные методы, которые извлекают значение каждого свойства класса из моей базы данных. Вот как мой метод выглядит для класса UserAccount:
public static UserAccount GetUserAccountById(long id)
{
UserAccount result = null;
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString))
{
using (SqlCommand cmd = new SqlCommand(string.Empty, con))
{
cmd.CommandText = "SELECT * FROM UserAccounts WHERE UserId = @Id";
cmd.Parameters.AddWithValue("@Id", id);
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
result = RetrieveFromDatabaseRow(reader);
}
con.Close();
}
}
return result;
}
public static UserAccount RetrieveFromDatabaseRow(SqlDataReader reader)
{
try
{
return new UserAccount
{
UserId = (long)reader["UserId"],
UserName = (string)reader["UserName"],
UserAddress = UserAddress.GetUserAddressById((long)reader["PrimaryAddressId"])
};
}
catch (Exception unhandledException)
{
GlobalMethods.LogException(unhandledException);
return null;
}
}
Теперь метод UserAddress.GetUserAddressById является почти таким же, как метод экстракции моего первого класса. Он инициализирует соединение и запускает команду SQL.
Почему я думаю, что я делаю это неправильно: текущий способ, которым он выполняется в данный момент, вызывает одновременное открытие нескольких соединений SQL (в моем примере это всего 2, но в моем фактическом проект).
Я думал о создании одного огромного оператора SQL, который объединяет все необходимые таблицы SQL в одной команде, а затем извлекает всю эту информацию для инициализации основного класса без запроса дополнительной информации из его свойств (UserAddress класс). Но тогда мне это не смешно, потому что часто мне нужно получать много информации одновременно, а иногда одного утверждения недостаточно. Кроме того, это боль в заднице, чтобы написать одну черту огромной инструкции SQL, которая объединяет десять таблиц.
Я думал о создании одной глобальной переменной SqlConnection, которая будет инициализирована только один раз, и все мои SQL-запросы будут проходить через него все время, в то же время. Однако я не знаю, как это будет реагировать на такие действия.
Я мог бы использовать некоторые советы и подсказки о том, как правильно выполнить это. Спасибо заранее.
Я думаю, проблема заключается в том, что вы запрашиваете для каждого пользователя, а не просто для того, чтобы сразу получить всех пользователей, или составить список пользователей, которые вам нужны, чтобы получить и отправить один запрос с учетом этого. – Vajura
@Vajura В этом примере показано, как Я обрабатываю один экземпляр. У меня есть аналогичная функция, которая извлекает всех пользователей из базы данных и добавляет каждую из них в общий список. Однако тот же метод «RetrieveFromDatabaseRow» находится в игре (для инициализации реального объекта User). –