由于单位业务需要,搭建一台服务器专门用来做数据存储。因为数据流很小,遂采用access库作为DB。开始还好,但是后来发现access数据库有一问题,就是表空间会随着使用越来越大,哪怕表里没有数据。因为表中单次存放的内容是很小的,每隔几分钟会全删除然后再写入,所以表也会越来越大啊!

开始是用VB写的一个压缩软件,因为是M$自家的语言嘛,自然对Office系列支持很好,后来发现ruby中也可以通过Win32ole访问Jet引擎,为何不用ruby来写呢?因为是以前写的代码神马都用class来搞,稍显夸大,但效果还好。

#hb table write by hopy 2012
require 'win32ole'
require 'oci8'

class Hb
  def initialize
    @oci = OCI8.new("xxx","***","xxx")
  end

  def open
    unless @acs
      conn_str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#{Dir.pwd}/hb.mdb"
      #conn_str = "driver={SQL Server};database=xxx;server=localhost,1433;uid=sa;pwd=sa"
      @acs = WIN32OLE.new('ADODB.Connection')
      @acs.Open(conn_str)
    end
  end

  def close
    (@acs.Close;@acs=nil) if @acs
  end

  def cls
    self.open
    sql = "DELETE * from InTable";@acs.Execute(sql)
    sql = "DELETE * from OutTable";@acs.Execute(sql)
  end

  def zip
    start = Time.now
    self.close
    jet = WIN32OLE.new('JRO.JetEngine')
    path = Dir.pwd+"/hb.mdb"
    new_path=Dir.pwd+"/hb_ziped.mdb"
    File.delete(new_path) if File.exist?(new_path)
    sp = "Provider=Microsoft.Jet.OLEDB.4.0"
    ss = sp+";Data Source="+path
    sd = sp+";Data Source="+new_path
    jet.CompactDatabase(ss,sd)
    File.delete(path)
    File.rename(new_path,path)
    puts "access ziped , take #{Time.now - start} s"
  end

  def sync
    self.cls
    self.open

    zb = [64981,57520]

    i = 0;start = Time.now
    ret = @oci.exec('select * from DBO.DPXS_ARRIVAL') do |r|
      next if r[7].unpack("v*") != zb

      zt = if r[24] == "Arrived"
        r[23]
      elsif r[25]
        r[25]
      else
        r[23]
      end

      tm = if r[12]
        r[12]
      elsif r[11]
        r[11]
      else
        r[10]
      end

      @acs.Execute("INSERT INTO InTable VALUES('#{r[0]}','#{tm}','#{r[13]}','#{zt}')");i+=1
    end
    <span style="white-space:pre">	</span>puts "sync #{i} arrival flights , take #{Time.now - start} s"

    i = 0;start = Time.now
    ret = @oci.exec('select * from DBO.DPXS_DEPARTURE') do |r|
      next if r[7].unpack("v*") != zb

      tm = if r[13]
        r[13]
      elsif r[12]
        r[12]
      else
        r[11]
      end

      @acs.Execute("INSERT INTO OutTable VALUES('#{r[0]}','#{tm}','#{r[14]}','#{r[27]}')");i+=1
    end
    puts "sync #{i} departure flights , take #{Time.now - start} s"
  end
end

INTERVAL_sec = 10
hb = Hb.new
t = 0
loop do
  sleep(INTERVAL_sec);t+=INTERVAL_sec
  hb.sync
  (hb.zip;t=0) if t >= 60
  #t=0 if t >= 60
end

ruby调用Office Jet引擎压缩access数据库的更多相关文章

  1. 备份和还原SQL Server及压缩Access数据库

    功能说明:备份和恢复SQL Server数据库 * 作者: 刘功勋; * 版本:V0.1(C#2.0);时间:2007-1-1 * 当使用SQL Server时,请引用 COM组件中的,SQLDMO. ...

  2. Access数据库在线压缩的实现方法

    如果在 Access 数据库中删除数据或对象,或者在 Access 项目中删除对象,Access 数据库或 Access 项目可能会产生碎片并会降低磁盘空间的使用效率.压缩 Access 数据库或Ac ...

  3. 实现压缩access(*.mdb)数据库的方法

    下面的函数用来压缩access数据库 需要增加ComObj单元 //压缩与修复数据库,覆盖源文件 function CompactDatabase(AFileName,APassWord:string ...

  4. IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库

    在网站发布后,访问网站会有80004005的错误提示. 项目环境 项目基于Access数据库,server2012,文件系统为NTFS格式. 错误信息 Microsoft JETDatabase En ...

  5. Access数据库及注入方法

    目录 Access数据库 Access数据库中的函数 盲注Access数据库 Sqlmap注入Access数据库 Access数据库 Microsoft Office Access是由微软发布的关系数 ...

  6. ADO访问Access数据库错误解决心得随笔

    最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~ ...

  7. 【转】如何将ACCESS数据库后缀名accdb改为mdb

    office 2007中的ACCESS数据库保存时,默认的后缀名是*.accdb, 但是在数据库编程中,用到的后缀名却是*.mdb, 不能直接将后缀名由 accdb 改为 mdb,虽然没有出错,但是编 ...

  8. Err.number错误号和可捕获的 Microsoft access 数据库引擎和 DAO错误说明

    错误码        信息2420        数字语法错误2421        日期语法错误2422        字符串语法错误2423        ‘.’.‘!’.或 ‘()’的使用无效2 ...

  9. C# - Excel - Microsoft Access 数据库引擎找不到对象

    我几乎要无语了,疯掉了,以为是office本身的问题,换了好多次office2007,安装又不顺利,换到了office2010,想想大部分应该兼容2007,所以用着office2010了. 甚至差点要 ...

随机推荐

  1. android6.0SDK 删除HttpClient的相关类的解决方法

    本文转载自博客:http://blog.csdn.net/yangqingqo/article/details/48214865 android6.0SDK中删除HttpClient的相关类的解决方法 ...

  2. 使用Hash函数和MAC产生伪随机数

    基于Hash函数的PRNG 流程非常类似于对称密码的CTR工作模式 算法的伪码如下 m = ⌈n/outlen⌉ data = V W = the null String for i = 1 to m ...

  3. ROS_Kinetic_13 ROS数据录制与回放

    ROS_Kinetic_13 ROS数据录制与回放 官网教程:http://wiki.ros.org/cn/ROS/Tutorials/Recording%20and%20playing%20back ...

  4. 《java入门第一季》之tcp协议下的编程实现键盘录入数据不断地往服务器端发送数据案例

    这里要封装通道流,封装键盘录入数据流. 同样地,还是两台电脑.一个客户端,一个服务器. 客户端代码: import java.io.BufferedReader; import java.io.Buf ...

  5. Swift基础之实现下拉变大和OC下拉变大上拉缩小Demo

    Swift语言实现下拉变大效果:(上拉缩小效果随后研究......) 关键代码:方法一: self.automaticallyAdjustsScrollViewInsets = false;      ...

  6. Android进阶(八)Can't create handler inside thread that has not called Looper.prepare()

    Error:Can't create handler inside thread that has not called Looper.prepare() 原代码: //利用Handler消息传递机制 ...

  7. linux下重启weblogic(关闭和启动)

     ssh远程连接Linux服务器! 开启weblogic: 1.找到/Oracle/Middleware/user_projects/domains/用户_domain目录, 2.执行nohup ...

  8. 【Android 应用开发】 Fragment 详解

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191 本博客代码地址 : -- 单一 Fragmen ...

  9. 敏捷测试(2)--ATDD概念

    什么是验收测试驱动开发 在准备实施一个功能或特性之前,首先团队需要定义出期望的质量标准和验收细则,以明确而且达成共识的验收测试计划(包含一系列测试场景)来驱动开发人员的TDD实践和测试人员的测试脚本开 ...

  10. 基于Bootstrap的Metro风格模板

    这几天在看Bootstrap的一些书,这里整理一下书中的一些模板,方便以后使用. 1.BootMetro http://www.guoxiaoming.com/bootmetro/ 2.Bootswa ...