2014-02-10 3 views
1

Я работаю над проектом, который до сегодняшнего дня был в порядке. Однако теперь, когда я запускаю его, и он проходит через несколько различных Stored Procedure звонков он бросает InvalidOperationException с сообщением The connection was not closed. The connection's current state is open.SQL Connection Open Exception

Я понимаю, что я мог бы поставить в чеке, чтобы увидеть, если соединение уже открыто, но этот код hasn 't изменено (оно находится под Version Control и не изменяется), поэтому я ищу другие потенциальные объяснения.

Может ли быть некоторая блокировка в SQL, которая не выпущена? Есть ли процесс, который я должен искать и убивать?

Я не могу опубликовать код, так как его много, и он разбит на более мелкие методы, что затрудняет извлечение отдельных элементов. Например:

public SqlConnection Connection 
{ 
    get 
    { 
     this._connection.Open(); 
     return _connection; 
    } 
} 

public IDataReader RetrieveRecord(int Id) 
{ 
    //SP 
    SqlCommand cmd = this.Connection.CreateCommand(); 
cmd.CommandText = "SelectRecord"; 
    cmd.CommandType = CommandType.StoredProcedure; 

    //Parameters 
    cmd.Parameters.Add(new SqlParameter("@tID", Id)); 

    //instruct the data reader to close its connection when its Close method is   called by passing the CommandBehavior.CloseConnection 
    return cmd.ExecuteReader(CommandBehavior.CloseConnection); 
} 

Ничего массивно комплекс, я просто не понимаю, почему это соединение теперь бросает исключение.

+0

вы открываете соединение в общедоступной функции SqlConnection Connection(), но никогда не закрываете программу. –

ответ

0

отсортирован. Две перезагрузки очистили все, что поддерживало соединение.

+0

Я бы по-прежнему рассматривал рефакторинг кода, чтобы соединения были закрыты красиво. – Koen

+1

I 100% согласен. Проблема, как это почти всегда бывает, в том, чтобы убедить менеджера проекта в том, что тратить время на перезапись того, что технически работает, стоит того. – MattR

+0

Знайте это чувство. Однако, после того, как вы столкнулись с этой проблемой, у вас может быть смысл убедить его. Во всяком случае, удачи! ;-) – Koen

0

Проблема с линией

this._connection.Open(); 

Потому что вы пытаетесь открыть уже открытое подключение.

Попробуйте проверить перед открытием соединения:

if (this._connection.State == ConnectionState.Closed) 
      this._connection.Open(); 
+0

Yip Я знаю об этом, как я сказал в оригинальном посте, но я ищу любые другие потенциальные причины блокировки, учитывая, что класс не изменился и отлично работал месяцами. – MattR

1

DAL не достаточно стабильна:

Вы открываете соединение, которое не закрыто, если что-то пойдет не так в RetrieveRecord.

Вам необходимо создать новое соединение внутри RetrieveRecord и закрыть его в блоке finally.

Открытие соединения дешево благодаря подключению пулов.

0

Когда вы говорите об убийстве, я думаю, вы хорошо знаете C#.

Вы должны всегда использовать

using() 
{ 

} 

как:

using(SqlConnection con=new SqlConnection("connectionString")) 
{ 
    // Do something with con 
    using(SqlCommand cmd=new SqlCommand("cmdText",con)) 
    { 
     // Do something with cmd 
    } 
} 

Вы знаете, что SqlCommand и SqlConnection реализовать IDisposable

Так что, когда вы положили эти объекты в пределах using, закрытие соединения и чистый работа автоматически завершается.

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