Ruby操作MS Access数据库
昨天尝试用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编码就好了。