yqm的.net之园

writing down what i am experiencing or creating
有关datareader和datatable,现在更爱datatable了。

网站采用access数据库,由于之前没有用过asp.net操作access数据库,有些地方还是跟sql server不一样。网站做完后,给测试部门测试,结果没测试两分钟就报错。莫名的未指定错误。在我自己机子上怎么浏览都没有问题。调试都不给机会,重新传下web.config或者dll文件后,恢复正常,可没一会就错了。
到csdn论坛上问了一下,大部分人都表示是连接太多了,数据库打开后没有及时关闭。这个影响后,导致所有带连接数据库的整个服务器站点都无法访问...


根据大家的解答,检查了一下数据库操作类,并做了些修改.所有的建立连接对象都用:
using (OleDbConnection connection = new OleDbConnection(connectionString));

但是有一处不行.就是返回datareader处.因为datareader需要连接维持,如果在函数中就关闭连接的话,在调用的时候就出错了。于是修改了这句:
OleDbDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

错误依据存在!苦恼。。。

查了下资料说,这样并不能保证连接被关闭."只有当您在 ASP.NET Web 应用程序中使用复杂的绑定控件时,该选项才以这种方式工作。在整个 DataReader 结果集中循环到其行集的末尾(也就是说,当 Dr.Read — DataReader 的 Read 方法 — 返回 False 时)还不足以触发连接的自动关闭。不过,如果您绑定到一个复杂的绑定控件(例如,DataGrid),该控件则会关闭 DataReader 和连接 — 前提条件是您设置了 CommandBehavior.CloseConnection 选项。
"摘自<NET 连接池救生员>

这么说,我就是要在读完reader后需要手动关闭connection,可这reader是函数中返回来的。connection根本无法在这被关闭。

再苦恼。。。

没有别的办法了,最后我把所有的datareader全部改成datatable。真多啊,烦死了。但最后问题就不再出现了。

小结:asp.net访问access时,都要建立一个临时文件,如果你在访问后没有及时关闭连接,你就可以在目录中看到这个该死的文件。这个文件在打开后只对建立文件的连接是开放的,对其他都是只读权限,当有第二个连接同时访问数据库并要做修改时,错误就发生了。(胡扯,也不知道对不对)

datareader与datatable不一样,它需要连接的维持,也是只读的,如果连接断开是无法读取的,而datatable就不一样,它是作为一个单独数据集可以独立存在并且可以编辑的。

我以前用sql server也有时打开连接不关闭,但没有出现这么严重的问题。可能是sql server机制跟access不大一样。

以后写程序的时候,务必在连接使用完后及时关闭。

 感觉自己的基础不扎实,有些东西知其一不知其二。原理性的东西好多不了解。(DataReader比较节省内存,性能较高,但又会遇到连接不好关闭的问题,DataTable占内存比较大,但可编辑,又不需要连接维持。我该使用那个好呢?不可能总都用DataTable吧。)

posted on 2006-10-23 01:35  YQM  阅读(1950)  评论(5编辑  收藏  举报