Управление подключениями к SQL Server - PullRequest
7 голосов
/ 26 мая 2009

Какова лучшая практика для соединений SQL?

В настоящее время я использую следующее:

using (SqlConnection sqlConn = new SqlConnection(CONNECTIONSTRING))
{
    sqlConn.Open();
    // DB CODE GOES HERE
}

Я читал, что это очень эффективный способ выполнения соединений SQL. По умолчанию пул SQL активен, поэтому, насколько я понимаю, когда код using заканчивается, объект SqlConnection закрывается и удаляется, но фактическое соединение с БД помещается в пул соединений SQL. Я ошибаюсь по этому поводу?

Ответы [ 4 ]

14 голосов
/ 26 мая 2009

Вот и все. Некоторые дополнительные моменты для рассмотрения:

  • Где вы получаете строку подключения? Вы не хотите, чтобы это было жестко запрограммировано повсеместно, и вам, возможно, придется его обезопасить.
  • Вам часто приходится создавать другие объекты, прежде чем вы действительно используете соединение (SqlCommand, SqlParameter, DataSet, SqlDataAdapter), и вы хотите подождать как можно дольше, чтобы открыть соединение . Полный шаблон должен учитывать это.
  • Вы хотите убедиться, что доступ к вашей базе данных принудительно связан с собственным классом слоя данных или сборкой. Поэтому обычно нужно выразить это как вызов частной функции:

.

private static string connectionString = "load from encrypted config file";
private SqlConnection getConnection()
{
    return new SqlConnection(connectionString);
}

А затем напишите свой пример так:

using (SqlConnection sqlConn = getConnection())
{
    // create command and add parameters

    // open the connection
    sqlConn.Open();

   // run the command
}

Этот образец может существовать только в вашем классе доступа к данным. Альтернатива - пометить его internal и распределить слой данных по всей сборке. Главное, что строгое разделение кода вашей базы данных строго соблюдается.

Реальная реализация может выглядеть так:

public IEnumerable<IDataRecord> GetSomeData(string filter)
{
    string sql = "SELECT * FROM [SomeTable] WHERE [SomeColumn] LIKE @Filter + '%'";

    using (SqlConnection cn = getConnection())
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
        cn.Open();

        using (IDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                yield return (IDataRecord)rdr;
            }
        }
    }
}

Обратите внимание, что я также смог "сложить" создание объектов cn и cmd, и таким образом сократить вложенность и создать только один блок области видимости.

Наконец, предостережение об использовании кода yield return в этом конкретном примере. Если вы вызываете метод и не завершаете ваше DataBinding или другое использование сразу, это может держать соединение открытым в течение длительного времени. Примером этого является использование его для установки источника данных в событии Load на странице ASP.NET. Поскольку фактическое событие привязки данных не произойдет до тех пор, пока вы не сможете удерживать соединение открытым гораздо дольше, чем необходимо.

2 голосов
/ 26 мая 2009

Microsoft Шаблоны и практики библиотеки являются отличным подходом к обработке подключения к базе данных. Библиотеки инкапсулируют большинство механизмов, связанных с открытием соединения, что, в свою очередь, облегчит вашу жизнь.

1 голос
/ 26 мая 2009

Ваше понимание использования является правильным, и этот метод использования является рекомендуемым способом сделать это. Вы также можете позвонить закрыть в вашем коде.

0 голосов
/ 26 мая 2009

Также: открыто поздно, закрыто рано.

Не открывайте соединение, пока не останется больше шагов до вызова базы данных. И закройте соединение, как только вы закончите.

...