2014-02-10 97 views
1

我正在研究一直到今天为止的项目。但是现在,当我运行它,它经历了几个不同的Stored Procedure调用它与消息The connection was not closed. The connection's current state is open.SQL连接打开异常

,我感到我可以把在一个检查,看看是否连接已经打开抛出InvalidOperationException,但是这个代码不是招没有改变(它在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

我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块中关闭它。

由于Connection Pooling的关系,打开连接很便宜。

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将为您完成工作。