2015-12-22 2 views
0

Вместо традиционного способа выполнения запроса, как это:Производительность Последствия Использование метода в ADO.NET

protected void btnAdd_Click(object sender, EventArgs e) 
{ 
    SqlConnection connection = new SqlConnection(
     ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString); 
    connection.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = connection; 
    cmd.CommandText = "INSERT INTO Test VALUES (@FN, @LN, @DateAdded)"; 
    cmd.Parameters.AddWithValue("@FN", txtFN.Text); 
    cmd.Parameters.AddWithValue("@LN", txtLN.Text); 
    cmd.Parameters.AddWithValue("@DateAdded", DateTime.Now); 
    cmd.ExecuteNonQuery(); 
    connection.Close(); 
} 

Я создал отдельный класс, который позволяет мне повторно использовать метод для выполнения запроса путем определения оператора SQL и его параметры (имена и значения):

DB.cs

static SqlConnection connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString); 

public static void Execute(string query, SqlParameter[] parameters) 
{ 
    using (connection) 
    { 
     using (SqlCommand command = new SqlCommand(query, connection)) 
     { 
      foreach (SqlParameter parameter in parameters) 
      { 
       command.Parameters.Add(parameter); 
      } 
      connection.Open(); 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

, который затем позволяет мне уменьшить мой процесс кодирования здесь:

protected void btnAdd_Click(object sender, EventArgs e) 
{ 
    string SQL = "INSERT INTO Test VALUES (@FN, @LN, @DateAdded)"; 
    SqlParameter[] parameters = { 
     new SqlParameter("@FN", txtFN.Text), 
     new SqlParameter("@LN", txtLN.Text), 
     new SqlParameter("@DateAdded", DateTime.Now) 
    }; 

    DB.Execute(SQL, parameters); 
} 

Возникают ли какие-либо последствия для работы при выполнении этих задач? Кроме того, существуют ли способы улучшить существующий код? Благодаря!

+1

Я не вижу проблемы с этой техникой, хотя это, вероятно, больше подходит для [обзора кода] (http://codereview.stackexchange.com/), однако я лично не стал бы снова использовать объект соединения. Вы ничего не получаете от этого, и это может вызвать проблемы, просто используйте вашу конфигурацию для статической строки соединения и создайте новый объект SqlConnection в этом методе, а пул соединений .NET позаботится об остальном. Кроме того, вы можете немного упростить код, используя 'command.Parameters.AddRange (parameters);' вместо явного цикла foreach. – GarethD

+0

@GarethD Спасибо за **. AddRange ** tip. Я буду повторно использовать объект соединения для других методов в том же классе DB. Это целесообразно? – abramlimpin

+1

Игнорировать меня, я не читал код правильно. Статическое поле в любом случае будет создавать новый объект соединения с каждым вызовом метода, поэтому вы уже делаете то, что я предлагаю чуть менее подробным образом. – GarethD

ответ

1

Не должно быть разницы в производительности между двумя подходами, поскольку в обоих случаях вы используете параметризованный запрос. Поскольку вы программируете непосредственно на методы SqlCommand (в отличие от методов IDbCommand), то также нет различий в переносимости для других поставщиков РСУБД, поскольку обе реализации привязаны к SQL Server.

Вы можете сделать интерфейс немного проще в использовании маркировки второй аргумент params, т.е.

public static void Execute(string query, params SqlParameter[] parameters) 

Это позволит вам сделать вызов, как это:

DB.Execute(
    "INSERT INTO Test VALUES (@FN, @LN, @DateAdded)" 
, new SqlParameter("@FN", txtFN.Text) 
, new SqlParameter("@LN", txtLN.Text) 
, new SqlParameter("@DateAdded", DateTime.Now) 
); 
Смежные вопросы