SqlClient ConnectionMode - свойствоNemiro.Data.dll
Режим соединения с базой данных. Значение по умолчанию Auto, если иное не указано в параметре NeData:Sql:ConnectionMode файла конфигурации.

Пространство имён: Nemiro.Data.Sql
Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Синтаксис

public ConnectionMode ConnectionMode { get; set; }

Значение свойства

Тип: ConnectionMode
Значение по умолчанию: Auto, если иное не указано в параметре NeData:Sql:ConnectionMode файла конфигурации.
Заметки

В режиме Auto при каждом выполнении запроса к базе данных соединение автоматически открывается, а после - закрывается. Например:

using (SqlClient client = new SqlClient())
{
  // формируем запрос к базе данных
  client.CommandText = "SELECT * FROM table";
  // выполняем запрос 
  // при этом открывается соединение с базой данных
  DataTable table = client.GetTable();
  // после выполнения запроса, соединение автоматически закрывается 
  // выполняем еще один запрос, соединение опять открывается
  client.CommandText = "UPDATE table SET hits = hits + 1";
  client.ExecuteNonQuery();
  // после выполнения запроса, соединение автоматически закрывается 
  // и т.д.
}

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

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

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

При вызове метода Dispose  соединение автоматически закрывается, независимо от значения ConnectionMode.

Примеры

В следующем примере выполняться серия запросов к базе данных с использованием одного открытого соединения. При этом выполняется перехват исключений и ручное закрытие соединения с базой данных. Использование оператора using в данном случае невозможно.

// создаем экземпляр класса SqlClient
SqlClient client = new SqlClient();
// переключаемся в ручной режим управления соединением
client.ConnectionMode = ConnectionMode.Manual;
try
{
  // выполняем серию из пяти запросов в безопасном блоке кода
  client.ExecuteNonQuery("INSERT INTO table (date) VALUES (GETDATE());");
  client.ExecuteNonQuery("INSERT INTO table (date) VALUES (GETDATE());");
  client.ExecuteNonQuery("INSERT INTO table (date) VALUES (GETDATE());");
  client.ExecuteNonQuery("INSERT INTO table (date) VALUES (GETDATE());");
  client.ExecuteNonQuery("INSERT INTO table (date) VALUES (GETDATE());");
}
catch (Exception ex)
{
  // выводим сообщение об ошибке,  
  // если в процессе выполнения запросов возникнет исключение
  Console.WriteLine(ex.Message);
}
finally
{
  // вручную закрываем соединение с базой данных
  client.Disconnect();
}
См. также