在上一篇Ruby On Rails Connection To MicroSoft SQL Server[Part 1]中我提出关于ROR[Ruby on Rails]连接MSSQL的几个问题.一方面由于篇幅过长怕看着容易疲劳. 另外一方面当时确实没有解决问题的具体头绪和思路. 当时也翻阅大量资料,足足也郁闷一个上午.既然出现了问题,通过在Ruby Guides社区和多位SunSky_Grouper成员交流后.终于获得相关说明和解决方案.这个问题也是很多RoR Developer经历Rails版本迭代后出现一系列常见问题.本篇主要目的是解决前一篇提出几个问题.并以一个初学者摸索态度对ROR连接MSSQL细节加以详细的说明和概述.我会尽自己最大努力来保证文章在技术上严谨和准确性.如有纰漏或错译 请及时指出 我会及时更正并不断加以完善.
A:准备工作
可以说很多ROR的Developer都会因为版本迭代引发一系列问题.所以在进行编程有效测试前.我个人觉得非常有必要说明ROR开发环境参数:
在和Grouper成员交流时.我也相关询问他们对于在实际Team coding时如何控制RoR的版本问题.TeamWork时他们会利用一个控制RoR版本更新工具进行各成员之间关联.[当然他们并没有给我看这个工具] 有点类似VSS对源码管理.当实际项目中真需要更新时统一的把项目组成员所有开发环境进行升级. 但是从他们口中我也得知他们对ROR版本升级态度也相当的忌讳的. 一方面出于对产品运行环境稳定和可依赖性考虑. 另外一个就是他们一直在强调使用ROR的初衷 High Efficiency -高效和TeamWork Disengaged 团队合作的自由.
在和这些国外开发人员进行简短交流时. 我们也可以"管中窥豹" 大概能看出他们在实际项目编码中对RoR版本问题相关处理.
B:问题解决
<1>ADO.RB文件在0.4.0版本中无法找到?
上一篇中我提出一个RoR连接MSSQlServer时需要ADO.rb文件在最新的0.4.0—0.4.3四个版本中始终无法问题?
针对这个问题有多个来源: 一方面有些刚接触ROR Dvper通过<<Agile Web Development With Rails>>入门时也发现同样问题.因为这本书在06年出版.当时DBI最新版本是0.2.1DBI才是和书中进行对应的. 这也就到导致网上很多Copy版本都在统一说 下载最新的DBI. 而历经几年发展目前DBI已经发展到0.4.3DBI. 所以在下载之前官方已经提示查看相关的修改日志Release Note/ChangeLog:来查看如何发生哪些变化:
在0.2.0—0.2.2版本中ADO.Rb文件都是存在.但是从0.4.0后ADO.RB文件就无法找到. 我们来看一下官方在这0.4.0版本间修改日志:
you See.在第五条明确提出从0.2.0版本后停止ADO开发并删除相关的目录,Ruby分发包不会安装DBI的ADO驱动,只能在0.2.2版本及之前的版本以前找到相关的ADO.rb文件.
这也就能够解释为什么在0.4.0—0.4.3版本中无法找到ADO.RB文件的原因.
至此这个ADO.RB文件关于版本问题算是彻底搞清楚 是怎么回事.下一步来测试ROR 连接SQLServer数据库
<2>连接SQLServer数据库
首先说明连接SQLServer数据库的版本是MSSQLServer 2005[开发版],上一篇已经很详细说明连接前的相关配置等信息.当然如果你觉得接触过RedRails这款编译工具 也没有关系. 你可以直接打开CMD输入创建命令格式:
在CMD中Rails快速为我们创建批量文件:
创建完成后需要在Config/database.yml简短的修改一下Develop开发环境数据库配置:
注意上面利用RedRails工具来对DataBase.yml文件进行修改配置. 利用工具直接保存如果没有异常则可以证明与底层SQLServer数据库链接成功.
当然如果你没有下载RedRails这款工具也没有关系, 我们可以用Ruby一个测试数据库链接的RubyConDB来测试:
- require 'dbi'
- #add ADO.rb to $RUBY_HOME/lib/ruby/site_ruby/1.8/DBD/ADO
- DBname = 'master'
- username = 'sa'
- password = ''
- url = "DBI:ADO:Provider=SQLOLEDB;Data Source=127.0.0.1,1433;" \
- + "Initial Catalog=#{DBname};User Id=#{username};Password=#{password};"
- conn = DBI.connect("#{url}")
- conn.disconnect
当然这只是为了测试SQLSErver链接状态.对安全编码上名没有做任何控制. 在实际编码一般采用定义一个RubyConDB类来测试数据库链接:
- require 'dbi'
- class RubyConDB
- attr_reader :name
- def initialize(name, username, password, database)
- @server_name=name
- @username = username
- @password = password
- @database = database
- @dbh=DBI.connect("DBI:ADO:Provider=SQLNCLI;Data Source=#{name};Persist Security Info=False;User ID=#{@username};password=#{@password};Initial Catalog=#{database};")
- end
- def databases
- db=Array.new
- @dbh.select_all('SELECT name FROM master.sys.databases ORDER BY 1') do | row |
- db.<< Database.new(@dbh,row[0])
- end
- db
- end
- end
- class Database
- attr_reader :name
- def initialize(dbh,name)
- @dbh=dbh
- @name=name
- end
- end
- condb=RubyConDB.new("hostname","username","password","database_name")
- condb.databases.each {|x| puts x.name}
如上基本解决ROR连接MSServer数据库问题. 当然链接SQLServer数据库还有其他方式在类似通用方式ODBC方式.这个ODBC链接数据库的.rb文件不需要下载的我们直接能在相关目录下:C:\ruby\lib\ruby\site_ruby\1.8\DBD\ODBC
C:尾语
这个问题关于ROR连接MSSqlServer足足耽误两天时间. 当然也是一种作为一个初学者摸索过程. 而在必要探索精神 我们也有必要跳出自己圈子能够快速有效的和他人或同行进行.也能快速的打开相关的解决问题的思路.如有任何疑问请直接留言中回复我.,
本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/764749