zoukankan      html  css  js  c++  java
  • 解决Access文件越来越大的问题

    有时候在使用Access文件的时候,随着增删改的不断的连续,会导致文件越来越大。即使手动删除或者使用delete语句删除了大量的数据记录,会发现文件的大小依然没有减掉,而且随着你再往里写数据,又会增大。

    产生这个现象的原因跟Access本身的机制有关,具体也不清楚,好像是有什么历史记录还是什么存储碎片。ACCESS数据库在进行删除操作后,并不从该数据库中把数据清除掉,而是删除其索引相关的东西,虽然显示不出来,但是那些东西还是在文件中存在的,所以会引起ACCESS数据库文件越来越大。即使是我们不通过代码来访问access文件,而只是通过用户界面访问,随着文件的增大,也会带来一系列的问题。其症状包括:对象可能打开得更慢,查询可能比正常情况下运行的时间更长,各种典型操作通常似乎也需要使用更长时间。更何况如果在网站应用中,采用的是Access作为数据库的话,这里就有了性能上的问题。文件越来越大,会影响查询的速度,而且ACCESS是采用独占方式工作的,也就是说一次只能一个进程打开这个数据库执行操作,如果是多个用户的话就要"排队"了,所以ACCESS数据库如果变为很大的话,执行一个查询时间就会变长,而进程"排队"的等待时间也就会变得很久,专业型的数据库就不同,可以同时接收多个并发的访问,可以采用SQL数据库或其它大型并发数很强的数据库。

    但是很多时候我们是需要Access文件,往不同的地方拷贝的,比如说,一个Server上生成了一个Access文件,需要拷贝到另外的Server上,而且Server间如果网速不是很好的话,会需要很长的时间来传输这个文件。所以这时候我们希望这个文件在内容不变的前提下,越小越好。所以我们可以去除这个Access的冗余信息。

    Office Access本身就有这种功能,我们可以通过菜单找到这个工具,然后单击这个图标手动压缩。

    但是如果觉得每次手动去压缩的话很麻烦,我们可以设置每次关闭Access的时候,让它自己完成压缩。只要勾选下边的选框就可以。

    但是注意,上边的解决方案前提是,机器上安装了Office Access. 

    比如说在一个服务器上,我有一个应用是以Access做数据库的,但是只是通过C#代码来操作这个文件,服务器上根本没有安装Office Access.随着代码不断的操作这个文件,这个文件还是会变大。然后我们如果想拷贝这个文件,但是越来越大,越来越慢。此时我们怎么压缩?我们可以在代码中加入一些代码,这些代码可以在功能完成后,自动的压缩Access文件。可以把这些代码加入到你的业务逻辑代码后边。等所有的东西都完成了,执行以下这几句代码就可以了。

    首先引用C:Program FilesCommon FilesSystemadomsadox.dll,该DLL包含ADOX命名空间; 
    接着引用C:Program FilesCommon FilesSystemadomsjro.dll,该DLL包含JRO命名空间 
    注意:如,导入dll不成功,手动把com组件 导入为 .net组件,在用vs.net工具导入 

     1 ///压缩修复ACCESS数据库,mdbPath为数据库绝对路径
     2         public void Compact(string mdbPath)
     3         {
     4             if (!File.Exists(mdbPath)) //检查数据库是否已存在
     5             {
     6                 throw new Exception("目标数据库不存在,无法压缩");
     7             }
     8             //声明临时数据库的名称
     9             string temp = DateTime.Now.Year.ToString();
    10             temp += DateTime.Now.Month.ToString();
    11             temp += DateTime.Now.Day.ToString();
    12             temp += DateTime.Now.Hour.ToString();
    13             temp += DateTime.Now.Minute.ToString();
    14             temp += DateTime.Now.Second.ToString() + ".bak";
    15             temp = mdbPath.Substring(0, mdbPath.LastIndexOf("\") + 1) + temp;
    16             //定义临时数据库的连接字符串
    17             string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + temp;
    18             //定义目标数据库的连接字符串
    19             string mdbPath2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbPath + ";Jet OLEDB:Database Password=l1epc2";
    20             //创建一个JetEngineClass对象的实例
    21             JetEngineClass jt = new JetEngineClass();
    22             //使用JetEngineClass对象的CompactDatabase方法压缩修复数据库
    23             jt.CompactDatabase(mdbPath2, temp2);
    24             //拷贝临时数据库到目标数据库(覆盖)
    25             File.Copy(temp, mdbPath, true);
    26             //最后删除临时数据库
    27             File.Delete(temp);
    28         }
    QQ:254595754 手机号:15074704856
  • 相关阅读:
    [转载]Python爬虫之xpath使用技巧
    手机自动化脚本
    英镑像素转换
    小程序路径存入数据库
    avalonia项目在银河麒麟操作系统arm架构上运行报错:default font family is not be null or empty
    http 301、304状态码
    一文完全理解IP
    TCP是如何保证可靠传输的?
    一文弄懂TCP常见面试题
    一文弄懂HTTP常见面试题
  • 原文地址:https://www.cnblogs.com/xiongyunsheng/p/13437148.html
Copyright © 2011-2022 走看看