SQL连接打开异常

时间:2014-02-10 11:51:41

标签: c# asp.net sql-server

我正在开展一个到目前为止一直很好的项目。但是现在,当我运行它并进行一些不同的Stored Procedure调用时,它会抛出InvalidOperationException消息The connection was not closed. The connection's current state is open.

我知道我可以检查连接是否已经打开,但是这段代码没有改变(它在Version Control下并且未被修改)所以我正在寻找其他可能的解释。

SQL中是否存在一些未被释放的锁定?是否有一个我应该注意并杀死的过程?

我不能真正发布代码,因为它有很多,并且它被分成更小的方法,这使得更难以提取单个项目。 E.g:

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);
}

没有什么大概复杂的,我只是不明白为什么这个连接现在抛出异常。

4 个答案:

答案 0 :(得分:1)

DAL不够稳定:

如果RetrieveRecord出现问题,则打开未关闭的连接。

您应该在RetrieveRecord中创建一个新连接,并在finally块中将其关闭。

由于连接池,打开连接很便宜。

答案 1 :(得分:0)

问题在于

this._connection.Open();

因为您正在尝试打开已打开的连接。

在打开连接之前尝试检查:

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

答案 2 :(得分:0)

排序。两次重新启动都清除了保持连接打开的任何内容。

答案 3 :(得分: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将为您完成工作。