阅读338 返回首页    go 阿里云 go 技术社区[云栖]


使用ruby与MS Access数据库交互

ruby常规访问access数据库的方法应该是使用DBI库

 

require 'dbi' DBI.connect("DBI:ADO:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb;")

 

可是 简单尝试之后没能成功,提示找不到驱动器ADO,懒得再试,遂找其他方法。

一番搜索之后,发现可以用WIN32OLE来访问access,写一个简单的类包装之:

 

require 'win32ole' class AccessDb attr_accessor :mdb, :connection, :data, :fields def initialize(mdb=nil) @mdb = mdb @connection = nil @data = nil @fields = nil end def open connection_string = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' connection_string << @mdb @connection = WIN32OLE.new('ADODB.Connection') @connection.Open(connection_string) end def query(sql) recordset = WIN32OLE.new('ADODB.Recordset') recordset.Open(sql, @connection) @fields = [] recordset.Fields.each do |field| @fields << field.Name end begin @data = recordset.GetRows.transpose rescue @data = [] end recordset.Close end def execute(sql) @connection.Execute(sql) end def close @connection.Close end end

 

使用方法如下:

db=AccessDb.new('f:/db.mdb')

db.open

db.query('select * from foods')

db.fields

db.data

db.execute("insert into foods values (3,'xxx',299,'xo','good!');"

db.close

 

下面再给出使用ruby压缩修复access数据库的例子:


require 'win32ole' def fixaccess(path,newpath) jet=WIN32OLE.new('JRO.JetEngine') File.delete(newpath) if File.exist?(newpath) sp="Provider=Microsoft.ACE.OLEDB.12.0" ss=sp+";Data Source="+path sd=sp+";Data Source="+newpath+";Jet OLEDB:Engine Type=5" jet.CompactDatabase ss,sd end

 

比如要求压缩db.mdb文件,压缩后的文件名为new_db.mdb操作如下:

fixaccess('f:/db.mdb','f:/new_db.mdb')

 

方法fixaccess中的sp在安装了office2007的系统上测试成功,其他版本

的office可能要修改sp中的Provider.

 


最后更新:2017-04-02 06:51:17

  上一篇:go 析JAVA之垃圾回收机制
  下一篇:go magento 开发-- 单页结账时根据选择的配送方式来控制支付方式的显示