То, почему SqlConnection не, расположило/закрыло?

Эта статья предоставляет больше подробную информацию об этой проблеме: http://electrosofts.com/systemverilog/arrays.html , особенно разделите 5.2.

упакованный массив А является механизмом для подразделения вектора в подполя, к которым можно удобно получить доступ как элементы массива. Следовательно, упакованный массив, как гарантируют, будет представлен как непрерывный набор битов. Распакованный массив может или не может быть так представлен. Упакованный массив отличается от распакованного массива в этом, когда упакованный массив появляется как основное устройство, это рассматривают как единственный вектор.

5
задан choudeshell 12 October 2009 в 22:08
поделиться

5 ответов

Сборка мусора C # недетерминирована, но язык предоставляет детерминированную структуру для удаления ресурсов, например:

using (SqlConnection connection = new SqlConnection(...))
{
    // ...  
}

Это создаст Блок try / finally , который гарантирует, что объект подключения будет удален независимо от того, что происходит в методе. Вам действительно следует обернуть любые экземпляры типов, которые реализуют IDisposable в блоке using, подобном этому, поскольку он обеспечит ответственное управление ресурсами (неуправляемыми ресурсами, такими как соединения с базой данных), а также даст вам детерминированный контроль, который вы ищете для.

19
ответ дан 18 December 2019 в 06:35
поделиться

Потому что C # - это язык со сборкой мусора, и сборка мусора не является детерминированной. Дело в том, что ваше sqlconnection удалено . Вы просто не можете выбирать, когда.

Sql-соединения - это ограниченный ресурс, и вполне возможно, что вы создадите их достаточно, чтобы их хватило. Вместо этого напишите его так:

internal static DataSet SelectDataSet(String commandText, DataBaseEnum dataBase)
{
    var dataset = new DataSet();

    using (SqlConnection sqlc = dataBase == DataBaseEnum.ZipCodeDb
                             ? new SqlConnection(ConfigurationManager.AppSettings["ZipcodeDB"])
                             : new SqlConnection(ConfigurationManager.AppSettings["WeatherDB"]))
    using (SqlCommand sqlcmd = sqlc.CreateCommand())
    {
        sqlcmd.CommandText = commandText;
        var adapter = new SqlDataAdapter(sqlcmd.CommandText, sqlc);
        adapter.Fill(dataset);

    }
    return dataset;
}

Хотя в этом случае вам может сойти с рук, потому что метод .Fill () - странный зверь:

Если IDbConnection закрывается до вызова Fill , он открывается для получения данных, а затем закрывается.

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

2
ответ дан 18 December 2019 в 06:35
поделиться

Будет, когда сборщик мусора выполнит свою работу. То же самое касается открытия файлового потока для записи без его закрытия. Он может быть «заблокирован», даже если коды вышли за пределы области видимости.

1
ответ дан 18 December 2019 в 06:35
поделиться

Я считаю, что это как-то связано с пулом SqlConnection. Что вы можете сделать, и мы часто делаем это на работе, так это обернуть весь вызов в оператор using, который вызывает вызов метода dispose (), затем закрывает соединение и удаляет объект

Затем вы можете сделать что-то вроде этого вместо этого:


internal static DataSet SelectDataSet(String commandText, DataBaseEnum dataBase)
{
    var dataset = new DataSet();

    using(SqlConnection sqlc = dataBase == DataBaseEnum.ZipCodeDb
                             ? new SqlConnection(ConfigurationManager.AppSettings["ZipcodeDB"])
                             : new SqlConnection(ConfigurationManager.AppSettings["WeatherDB"])) {
        SqlCommand sqlcmd = sqlc.CreateCommand();
        sqlcmd.CommandText = commandText;
        var adapter = new SqlDataAdapter(sqlcmd.CommandText, sqlc);
        adapter.Fill(dataset);


        return dataset;
    }
}

1
ответ дан 18 December 2019 в 06:35
поделиться

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

1
ответ дан 18 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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