Ответ 1
Одна ошибка, которую я вижу, повторяется снова и снова:
Создание и настройка всего (DbConnection, DbCommand, DbParameters) внутри метода, который многократно вызывается в узком цикле.
В большинстве случаев вы можете реорганизовать эти локальные переменные как члены класса, создавая их экземпляр только один раз и сохраняя только обновления DbParameters внутри метода.
ОБНОВЛЕНО включить образец кода, указанный в комментариях
Отказ от ответственности: Это быстро собранный образец для единственного намерения продемонстрировать мысль о перемещении повторяющихся вещей из цикла. Другие лучшие практики не обязательно реализуются.
public static void Show() {
List people = new List();
//Everything is done inside the loop
PersonDal personDal = new PersonDal();
foreach (Person person in people) {
personDal.Insert(person);
}
//Things are setup once outside the loop.
using (DbConnection connection = SqlClientFactory.Instance.CreateConnection()) {
// setup the connection
BetterPersonDal betterPersonDal = new BetterPersonDal(connection);
connection.Open();
foreach (Person person in people) {
betterPersonDal.Insert(person);
}
}
}
}
class Person {
public int Id { get; set; }
public string Name { get; set; }
}
В этой первой реализации каждая вещь настраивается каждый раз, когда вызывается метод:
class PersonDal {
public int Insert(Person person) {
DbProviderFactory factory = SqlClientFactory.Instance;
using (DbConnection connection = factory.CreateConnection()) {
connection.Open();
connection.ConnectionString = "Whatever";
using (DbCommand command = connection.CreateCommand()) {
command.CommandText = "Whatever";
command.CommandType = CommandType.StoredProcedure;
DbParameter id = command.CreateParameter();
id.ParameterName = "@Id";
id.DbType = DbType.Int32;
id.Value = person.Id;
DbParameter name = command.CreateParameter();
name.ParameterName = "@Name";
name.DbType = DbType.String;
name.Size = 50;
name.Value = person.Name;
command.Parameters.AddRange(new DbParameter[] { id, name });
return (int)command.ExecuteScalar();
}
}
}
}
Теперь мы переместим установку в конструкцию объектов, оставив ее вне цикла:
class BetterPersonDal {
private DbProviderFactory factory;
private DbConnection connection;
private DbCommand command;
private DbParameter id;
private DbParameter name;
public BetterPersonDal(DbConnection connection) {
this.command = connection.CreateCommand();
this.command.CommandText = "Whatever";
this.command.CommandType = CommandType.StoredProcedure;
this.id = command.CreateParameter();
this.id.ParameterName = "@Id";
this.id.DbType = DbType.Int32;
this.name = command.CreateParameter();
this.name.ParameterName = "@Name";
this.name.DbType = DbType.String;
this.name.Size = 50;
this.command.Parameters.AddRange(new DbParameter[] { id, name });
}
public int Insert(Person person) {
this.id.Value = person.Id;
this.name.Value = person.Name;
return (int)command.ExecuteScalar();
}
}