ruby调用Office Jet引擎压缩access数据库
Jun 07, 2016 pm 03:50 PM由于单位业务需要,搭建一台服务器专门用来做数据存储。因为数据流很小,遂采用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 <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

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Bagaimana untuk melihat dokumen perkataan dalam vscode Bagaimana untuk melihat dokumen perkataan dalam vscode

Apa yang perlu dilakukan jika fail xlsx tidak boleh dibuka pada telefon bimbit

WPS dan Office tidak mempunyai fon Cina, dan nama fon Cina dipaparkan dalam bahasa Inggeris.

Xiaomi Mi Pad 6 siri melancarkan Pejabat WPS peringkat PC dalam kuantiti penuh

Xiaomi Mi Pad 6 siri melancarkan WPS peringkat PC dalam jumlah penuh! Susun atur dan operasi yang sama seperti komputer

Bagaimanakah MathType menambah formula pada persembahan PPT_MathType menambah formula pada persembahan PPT

Kaedah terperinci merujuk data lembaran kerja Excel dalam dokumen perkataan
