Является ли код System.Data.SqlClient управляемым кодом?

  1. Запросы выполняются в программе C# с использованием пространства имен System.Data.SqlClient управляемого или неуправляемого кода?

  2. Каждый раз, когда соединение закрыто, (conn.Close() метод используется) ресурс считает выпущенным, или мы должны распорядиться им, чтобы получить освобождение?

2 ответа

Решение

Сам System.Data.SqlClient является управляемым кодом. Однако он построен поверх нескольких других библиотек. Некоторые из них являются управляемым кодом, а некоторые нет.

  1. Сам запрос выполняется базой данных. Таким образом, текст запроса (часть, которая жестко запрограммирована в вашей программе) будет считаться управляемым кодом, но как только команда отправляется в базу данных, она больше не управляется.

  2. После выполнения команды.close само соединение освобождается из приложения.net и возвращается в пул соединений (часть OLEDB, ODBC и / или других подсистем). В этот момент соединение освобождается, а неуправляемая часть освобождается. Утилита выполнит все, что делает и освободит другие управляемые части (строка подключения и т. Д.).

Всегда полезно вызывать метод dispose для любого объекта, который его реализует (или заключать его в блок using, как показано в @IRSOG). В этом случае не особенно опасно просто вызывать close(). Я бы не стал делать это привычкой.

О втором вопросе:

Метод Close откатывает все ожидающие транзакции. Затем он освобождает соединение с пулом соединений или закрывает соединение, если пул соединений отключен.

отредактированный

В следующем примере создается SqlConnection, открывается его, отображаются некоторые его свойства. Соединение автоматически закрывается в конце использования блока.

private static void OpenSqlConnection(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
        Console.WriteLine("State: {0}", connection.State);
    }
}

отредактированный

Вам нужно использовать для каждого объекта, который вы создаете, который реализует IDisposable. Это включает в себя SqlCommand и SqlConnection.Если вы используете using заявление, они будут располагать после использования блока.

Другие вопросы по тегам