Управление подключениями SQL Server

Перестройте свое решение (иногда чистое, а затем лучше работает). Затем посмотрите на свой список ошибок, прокрутите до самого конца, и он, скорее всего, укажет на ошибку, которая не позволяет вашей сборке скомпилироваться, и компилятор XAML, скорее всего, использует кэшированную версию сборки, а не новую, которую вы используете. хочу построить.

7
задан Neale 20 October 2015 в 00:15
поделиться

4 ответа

Это большая часть. Некоторые дополнительные моменты, которые следует учитывать:

  • Где вы берете строку подключения? Вы не хотите, чтобы это было жестко запрограммировано повсюду, и вам может потребоваться его защита.
  • Вам часто приходится создавать другие объекты, прежде чем вы действительно используете соединение ( 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
}

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

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

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. Поскольку фактическое событие привязки данных выиграло '

14
ответ дан 6 December 2019 в 11:52
поделиться

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

2
ответ дан 6 December 2019 в 11:52
поделиться

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

1
ответ дан 6 December 2019 в 11:52
поделиться

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

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

0
ответ дан 6 December 2019 в 11:52
поделиться