搜索
您的当前位置:首页正文

ruby调用OfficeJet引擎压缩access数据库

2020-11-09 来源:抵帆知识网

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

由于单位业务需要,搭建一台服务器专门用来做数据存储。因为数据流很小,遂采用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
 	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
Top