Что надлежащий путь состоит в том, чтобы гарантировать, что соединение SQL закрывается, когда исключение выдается?

Основное решение R, функция findInterval выполняет основную часть. Затем умножьте результат на df и получите среднее значение строки.

t1 <- c(1, 2, 4, 6, 7, 9)
t2 <- c(6, 6, 5, 3, 3, 7)
df <- data.frame(t1 = t1, t2=t2, stringsAsFactors = FALSE)

cp <- c(-Inf, 5, 8, Inf)

Редактировать.

Если веса нормированы на сумму 1, то правильным ответом будет любой из следующих двух.

wt <- sapply(df, findInterval, cp)
rowSums(df*(wt/apply(wt, 1, sum)))
#[1] 4.333333 4.666667 4.666667 5.000000 5.666667 8.200000

sapply(1:nrow(df), function(i)
  weighted.mean(df[i,], sapply(df, findInterval, cp)[i,]))
#[1] 4.333333 4.666667 4.666667 5.000000 5.666667 8.200000

Эти результаты теперь равны результатам в других ответах.

18
задан Eric Schoonover 26 September 2008 в 18:43
поделиться

9 ответов

Перенесите свою базу данных, обрабатывающую код в "использовании"

using (SqlConnection conn = new SqlConnection (...))
{
    // Whatever happens in here, the connection is 
    // disposed of (closed) at the end.
}
45
ответ дан 30 November 2019 в 06:04
поделиться

.Net Framework поддерживает пул соединения по причине. Доверяйте ему!:) Вы не должны писать так много кода только, чтобы соединиться с базой данных и выпустить соединение.

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

Очень тщательно продуманные 'решения' имеют тенденцию приводить к содержащему ошибки коду. Простой лучше.

8
ответ дан 30 November 2019 в 06:04
поделиться

Я предполагаю это "_SqlConnection. Состояние == ConnectionState. Закрытый" Вы имели в виду! =.

Это будет, конечно, работать. Я думаю, что это более обычно для содержания самого объекта соединения в операторе использования, но что Вы имеете, хорошо, если Вы хотите снова использовать тот же объект соединения по некоторым причинам.

Одной вещью, которую необходимо определенно изменить, тем не менее, является Расположение () метод. Вы не должны ссылаться на объект соединения в, располагают, потому что он, возможно, был уже завершен в той точке. Необходимо следовать, рекомендуемые Располагают шаблон вместо этого.

2
ответ дан 30 November 2019 в 06:04
поделиться

Документы MSDN делают это довольно ясным...

  • Близкий метод откатывает любые отложенные транзакции. Это затем выпускает соединение с пулом соединения или закрывает соединение, если организация пула подключений отключена.

Вы, вероятно, не имеете (и не хотят к), отключают организацию пула подключений, таким образом, пул в конечном счете управляет состоянием соединения после вызова "Близко". Это могло быть важно, поскольку Вы можете быть смущены, смотря со стороны сервера базы данных при всех открытых соединениях.

<час>
  • приложение может звонить Близко больше чем в один раз. Никакое исключение не сгенерировано.

Итак, почему тестирование беспокойства на Закрытый? Просто звоните Близко ().

<час>
  • Близкий и Располагают, функционально эквивалентны.

Поэтому использование блок приводит к закрытому соединению. использование вызовы Располагают для Вас.

<час>
  • не звонят Близко или Располагают на Соединении, DataReader или любом другом управляемом объекте в Завершить методе Вашего класса.

Важная мера предосторожности. Спасибо, Egon.

5
ответ дан 30 November 2019 в 06:04
поделиться

Так как Вы используете IDisposables так или иначе. Можно использовать ключевое слово 'использования', которое в основном эквивалентно вызову, располагают в наконец блок, но это выглядит лучше.

1
ответ дан 30 November 2019 в 06:04
поделиться

Посмотрите этот вопрос для ответа:

Близкий и Располагают - чтобы звонить?

, Если Ваше время жизни соединения является вызовом отдельного метода, используйте using функция языка для обеспечения надлежащей очистки соединения. В то время как try/finally блок является функционально тем же, требуется больше кода, и IMO менее читаем. Нет никакой потребности проверить состояние соединения, можно звонить Dispose невнимательный, и оно обработает чистку соединения.

, Если Ваше время жизни соединения соответствует времени жизни содержания класса, то реализуйте IDisposable и очистка соединение в Dispose.

1
ответ дан 30 November 2019 в 06:04
поделиться

никакая потребность в попытке.. наконец вокруг "использования", использование попытка.. наконец

0
ответ дан 30 November 2019 в 06:04
поделиться

Мог бы я предлагать это:


    class SqlOpener : IDisposable
    {
        SqlConnection _connection;

        public SqlOpener(SqlConnection connection)
        {
            _connection = connection;
            _connection.Open();

        }

        void IDisposable.Dispose()
        {
            _connection.Close();
        }
    }

    public class SomeDataClass : IDisposable
    {
        private SqlConnection _conn;

        //constructors and methods

        private void DoSomethingWithTheSqlConnection()
        {
            //some code excluded for brevity
            using (SqlCommand cmd = new SqlCommand("some sql query", _conn))
            using(new SqlOpener(_conn))
            {
                int countOfSomething = Convert.ToInt32(cmd.ExecuteScalar());
            }
            //some code excluded for brevity
        }

        public void Dispose()
        {
            _conn.Dispose();
        }
    }

Hope, которая помогает :)

-4
ответ дан 30 November 2019 в 06:04
поделиться

Вставьте соединение, близко кодируют "Наконец" блок как Вы шоу. Наконец блоки выполняются, прежде чем исключение выдается. Используя "использование" кладка блоков точно также, но я нахожу явное "Наконец" методом более ясный.

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

1
ответ дан 30 November 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: