日期:2014-05-17  浏览次数:20316 次

求助,很怪异问题。
            OpenSqlConnection();            
            OleDbCommand cmd = new OleDbCommand(p_sSqlString, l_sqlConnection);
            ddr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

用asp.net + access做了个网站,出现上传资料后,大约2个小时左右后,在正常页面上会出问题,就是上面代码第2行会表明连接是没有打开的,而出现问题。上传过程后,会关闭连接。连接是写到一个单独的类里面。这个类的实例是各个页面类的私有成员。上传页面和显示页面不是一个页面。按理连接也是不该相互影响的,但是现实确实出现上传资料后,大约两个小时会出现上面代码第2行会表明连接是没有打开的情况。
求助啊。分不多,见谅。

------解决方案--------------------
l_sqlConnection最好别声明为static类型的。
------解决方案--------------------
OpenSqlConnection();方法里的connection不是new出来的?
------解决方案--------------------
你的render 关了它就关了。这只能说明reader 已经关闭了。
你可以调试下。你读完文件后就关闭了,但你是不是还在做其他操作。
------解决方案--------------------
我怎么记得reader不支持关闭着读数据的?
我估计是这个CommandBehavior.CloseConnection的问题
你试试在使用reader以后,自己控制关闭连接

try
{
  excuteReader();
}
finally
{
   conn.close();
}
------解决方案--------------------
在编历reader返回的数据集的过程中,好像是要保持conn一直是连接状态的。
你取得了这个ddr,然后一行一行读的时候,conn要保持连接。
这个CommandBehavior.CloseConnection可以智能到知道你什么时候用完了这个ddr了,然后关闭连接吗?
------解决方案--------------------
你做个log吧,建立连接的那个catch里什么也不写,怎么找问题呢
------解决方案--------------------
我感觉LZ的问题是:你第一次和数据库交互的时候打开连接,但是没有关闭。第二次和数据库交互的时候会出现异常,跳到catch强制执行关闭。第三次和数据哭交互的时候就报连接没有打开!

所以你在代码里找看那块和数据库交互完后没有关闭连接!
------解决方案--------------------
1.conn不要使用静态
2.尽量少用datareader,虽然某些高手会告诉你dataTable内部也用了datareader,但是他一遍快速扫描完了就立刻断开了。如果你自己的代码,在处理复杂的玩意的时候没有立刻释放conn,那么情况就悲剧了,比如某些级联查询,第一个datareader在循环的同时,又在不断的根据条件开启其他的dr,尤其是为了省事公用了同一个conn,那线程池就占用严重了

所以静态,datareader不是可以用,而是你的自己明确的知道怎么控制才不出问题的情况下可以用,所以对于一般人我倒是建议datatable比较健壮