我正在开展一个到目前为止一直很好的项目。但是现在,当我运行它并进行一些不同的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);
}
没有什么大概复杂的,我只是不明白为什么这个连接现在抛出异常。
答案 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
将为您完成工作。