我对access数据库操作,打开的连接有conn(OleDbConnection),dr(OleDbDataReader),adp(OleDbDataAdapter),操作完成后我都立刻关闭了连接:dr.Close()、conn.Close()、adp.Dispose();然后我需要将此数据库更名。
    大部分时候都是正常的,但是当操作比较频繁的时候(关闭连接后重命名,然后又打开连接,操作后再关闭连接,再重命名,再打开……),总会在成功操作一段时间之后在关闭连接之后依然出现“.ldb”文件(是在关闭连接之后,因为access只有打开数据库操作的时候才会出现和数据库同名的.ldb文件,表明该数据库被锁定编辑,这个时候无法重命名数据库,会提示“被别的进程占用”),导致我程序继续运行失败。
    为此我在各个连接关闭之后都加了Thread.Sleep(x)来休眠一段时间,期望系统来释放资源,但是仍然会出现。
    请问大家有什么办法能够有效的结束对access数据库的连接,或者我该加入什么样的判断来在重命名之前判断关闭的连接依然存在而做些处理,让它真正的释放并继续运行呢?谢谢!

解决方案 »

  1.   

    using(OleDbConnection conn=new OleDbConnection()
    {
      ....
    }
      

  2.   

    理论上应该不会了吧?尝试下用下面形式的代码:
    using(//定义的对象)
    {//连接数据库的代码}
      

  3.   


    using(OleDbConnection conn=new OleDbConnection()
    {
      ....
    }正解!
      

  4.   

    2楼的写法 和msdn例子里面用的一样 赞!
      

  5.   

    using(OleDbConnection conn=new OleDbConnection()
    {
      ....
    }
    using一结束后就会关闭
      

  6.   

    上面各位讲的using是一种方式,另一种方式,直接用Dispose关掉连接:
    conn.Dispose();
      

  7.   

    如果你觉得麻烦,那就稍微看一下MICROSOFT提供的ENTERPRISE LIBRARY 2.0
    具体步骤:
    using Microsoft.Practices.EnterpriseLibrary.Common;
    using Microsoft.Practices.EnterpriseLibrary.Data;
    using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
    把这些引进来, public static ArticleColumnRelationProperty GetArticleColumnRelation(int articleId, int columnId)
            {
                ArticleColumnRelationProperty relation = new ArticleColumnRelationProperty();
                Database db = DatabaseFactory.CreateDatabase(CmsConfiguration.Settings.ConnectionString);
                DbCommand dbCommand;
                dbCommand = db.GetSqlStringCommand("SELECT * FROM " + CmsConfiguration.Settings.Table.ArticleColumnRelation + " WHERE ArticleId = @ArticleId AND ColumnId = @ColumnId");
                db.AddInParameter(dbCommand, "ArticleId", DbType.Int32, articleId);
                db.AddInParameter(dbCommand, "ColumnId", DbType.Int32, columnId);
                using (IDataReader dbReader = db.ExecuteReader(dbCommand))
                {
                    if (dbReader.Read())
                    {
                        relation.ArticleId = (int)dbReader["ArticleId"];
                        relation.Column = ColumnService.FindById((int)dbReader["ColumnId"]);
                        relation.Order = (int)dbReader["Sequence"];
                        relation.TemplateId = (int)dbReader["TemplateId"];
                    }
                }
                return relation;
            }
    USING的使用保证了在适当的时间系统会自动释放不需要的资源.
    这个其实就是一种封装,把释放资源的操作也封装了,你就不需要手动释放了.
    一家之言,很片面,希望能够起到抛砖引玉的效果,谢谢.
      

  8.   

    感谢大家热心帮助,我加了using块,在调用改名之前也调用了垃圾收集,但是依然会出现这样的问题,正常运行时间长短不一,但还是出现提示“被别的进程占用”而导致操作失败
    这该怎么办?