Как закрыть DataReader при исключении

У меня есть следующий код в некоторых методах моего уровня данных:

StringBuilder sb = new StringBuilder();
SqlCommand s = new SqlCommand(sb.ToString(), conn);
try 
{ 
    SqlDataReader dr = s.ExecuteReader(); 
    while(dr.Read())
      DoSomething(dr);
}
catch (Exception ex)
{ 
    sb.Append(Util.ExceptionRecursive(ex)); 
}

Дело в том, что dr никогда не закрывается в случае исключения. И когда другой метод пытается получить доступ к другому считывателю данных,это вызывает другое исключение, которое говорит что-то вроде «Другой Datareader подключен к базе данных»

Я хочу закрыть мой DataReader в любом случае. Но это:

sb = new StringBuilder();
SqlCommand s = new SqlCommand(sb.ToString(), conn);
SqlDataReader dr;
try 
{
    dr = s.ExecuteReader(); 
    while(dr.Read())
      DoSomething(dr);
}
catch (Exception ex)
{ 
    sb.Append(Util.ExceptionRecursive(ex)); 
}
finally
{
    dr.Close();
}

Не будет работать, потому что в случае исключения dr может не иметь данных и не будет компилироваться.

Как мне тогда это сделать?

5
задан apacay 5 July 2011 в 20:13
поделиться