2008年03月23日 星期天

OleDbDataReader使用后不关闭会有什么后果呢?

     今天写Web程序中遇到一个有趣的问题。如果OleDbDataReader在使用后忘了Close().会出现刷新3次,提示无法找到对象!
    经过我不反复的测试,发现出现每刷新3此就提示一个无法找到对象的错误。不多不少就3次,真的很奇怪。我就查代码发现OleDbDataReader objDR在使用后没有关闭,于是我把它关闭再测试就不再出现以上问题。
    难道.net只允许打开3个objDR吗??这会不会引起性能上的瓶颈呢?希望高手能给个彻底的分析。
    相关代码如下:
        //这是在Channel类中定义的
        public void GetChannelDetails()
        {
            string strGetSql = string.Format("select * from Channel where ID={0}", intID.ToString());
            OleDbDataReader objDR = null;
            try
            {
                objDR = Tsing.AccessHelper.ExecuteDataReader(strGetSql);
                            //这是一个数据库访问类,返回一个OleDbDataReader
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                return;
            }
            while (objDR.Read())
            {
                strTitle = objDR.GetString(1);
                strDirName = objDR.GetString(2);
                strDetails = objDR.GetString(3);
            }
            objDR.Close();
        }
        //这是在一个Admin_Admin_EditChannel : System.Web.UI.Page类中定义的。
 protected void EditChannel()
    {
        if (Request.QueryString["ID"] != null)
        {
            WebObject.Channel channel = new WebObject.Channel();
            channel.ID = int.Parse(Request.QueryString["ID"]);
            try
            {
                channel.GetChannelDetails();
            }
            catch (Exception ex)
            {
                Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), "ErrorMessage", string.Format("<script>alert(\"{0}\")</script>", ex.Message));
                return;
            }
            txtTitle.Text = channel.Title;
            txtDirName.Text = channel.DirName;
            txtDetails.Text = channel.Details;
        }
    }