Ruby操作MS Access数据库

分享RubyAccess数据库 by 达达 at 2007-06-15

昨天尝试用Ruby操作MS Access数据库。一番折腾后才实验成功,所以觉得有必要做个总结。

我用的是Ole DB连接Access,一开始尝试用如下代码连接数据库,总是报类型错误。。。

require 'dbi'

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

后来仔细在网上搜索,发现很多人遇到这样问题,找到一些帖子说需要装DBI的ADO驱动器,一个ADO.rb文件。原来我用的Windows一键安装的Ruby,只装了DBI的壳,没有驱动器的。DBI的更多内容可以从这里下载,载ruby-dbi就可以,然后找到ADO.rb,把它复制到 $Ruby Root$\lib\ruby\site_ruby\1.8\DBD\ADO 中。

有了这个文件就可以连接到MS Access数据库了。说来也挺简单的。

当我连上数据库,然后用DBI帮助中的范例代码操作我建的数据库时,竟然总是报什么不合法的SQL语句之类的错误。。。又花了我一些时间,最后才想起来,我的表名User用了Access的关键字。。。晕。

这是我最后测试用的代码。

require 'dbi'

DBI.connect("DBI:ADO:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb;") do | dbh |

   sql = "insert into sysuser (user_name) VALUES (?)"

   dbh.prepare(sql) do | sth |
      1.upto(13) { |i| sth.execute("Song 你好! -- ' where 1=1 #{i}") }
   end

   dbh.select_all('select * from sysuser') do | row |
      p row
   end

   #dbh.do('delete from simple01 where internal_id > 10')

   dbh.commit
end

注意,如果在Block中最后没有执行dbh.commit的话,操作不会保存到数据库,由此可见DBI默认使用了事务处理。另外还有一点,我在网上有看到别人提到要保存中文只能用ODBC,经过我实验证明,根本没这回事,我的实验程序一样可以保存中文。不过你要注意你的.rb脚本的编码,我放在UTF-8编码的文件中,结合eRuby生成HTML,结果保存到数据库里的中文变乱码,后来脚本另存为ANSI编码就好了。