2008-09-19 2 views
5

Если вам нужно открыть SqlConnection перед выпуском запросов, можете ли вы просто обрабатывать все не-Open ConnectionStates таким же образом? Например:Работа с различными ConnectionStates перед открытием SqlConnection

if (connection.State != ConnectionState.Open) 
    { 
     connection.Open(); 
    } 

Я где-то читал, что для ConnectionState.Broken соединение должно быть закрыто до его повторного открытия. У кого-нибудь есть опыт? Thanks-

ответ

5

http://msdn.microsoft.com/en-us/library/system.data.connectionstate.aspx

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

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

4

Это не напрямую отвечает на ваш вопрос, но лучше всего открыть и закрыть соединение для каждого доступа к базе данных. Пул соединений ADO.NET гарантирует, что это хорошо работает. Особенно важно это делать в серверных приложениях (например, ASP.NET), но я бы сделал это даже в приложении WinForms, которое напрямую обращается к базе данных.

Пример:

using(SqlConnection connection = new SqlConnection(...)) 
{ 
    connection.Open(); 
    // ... do your stuff here 

} // Connection is disposed and closed here, even if an exception is thrown 

Таким образом, вы никогда не нужно, чтобы проверить состояние соединения при открытии соединения.

+0

Вы не должны ждать GC, чтобы закрыть и утилизировать соединение. Вы должны явно закрыть соединение, как только вы это сделаете. – ddc0660 2008-09-19 17:27:08

3

Вы можете обрабатывать его таким же образом. Я получал множество состояний соединения ==, разбитых при использовании IE9. В IE7 есть что-то принципиально неправильное, так как ни один другой браузер не имел этой проблемы с разбитыми состояниями соединений после 5 или 6 обновлений таблиц базы данных. Поэтому я использую контекст объекта. Поэтому в основном просто закройте его и снова откройте.

У меня есть этот код, прежде чем все мои чтения и обновления в businss логическом уровне:

if (context.Connection.State == System.Data.ConnectionState.Broken) 
{ 
    context.Connection.Close(); 
    context.Connection.Open(); 
} 
Смежные вопросы