Ruby で SQL server に接続

RubySQL server に接続できたのでメモ。

#!ruby -Ks
require 'win32ole'

module OpenRecordset
  def [] field
    self.Fields.Item(field).Value
  end

  def []= field,value
    self.Fields.Item(field).Value = value
  end
  
  def each_record
    if self.EOF or self.BOF
      return 
    end
    self.MoveFirst
    until self.EOF or self.BOF
      yield self
      self.MoveNext
    end
  end
end

class ADODB
  def initialize(provider,host,db_name,uid,passwd)
    @ado = WIN32OLE.new("ADODB.Connection")
    @connstr = "Provider=#{provider};Password=#{passwd};User ID=#{uid};Initial Catalog=#{db_name};Data Source=#{host}"
  end

  def startADO
    begin
      @ado.Open @connstr
    rescue
      raise "接続出来ません。処理を終了します。#{@connstr}"
    end

    begin 
      yield @ado
    ensure
      @ado.Close
    end
  end

  def sql_read(sql)
    db_dat = []
    startADO do |cn|
      fields = Array.new
      begin
        rs = cn.Execute(sql)
        rs.extend OpenRecordset
        (0...rs.Fields.Count).each{|i| fields.push rs.Fields(i).Name }
        rs.each_record do |rs|
          values = fields.map{|field| rs[field] }
          read_hash = Hash.new
          n = 0;
          values.each{|dat| read_hash[fields[n]]= dat;n+=1}
          db_dat.push read_hash
        end
      rescue
        raise "SQL:#{sql} を実行出来ません。処理を終了します。"
      end
    end
    db_dat
  end
end 

provider  = "SQLNCLI.1"
# provider= "SQLOLEDB.1"
server    = "192.168.1.123"
port      = 1433
host="tcp:#{server},#{port}"

ado = ADODB.new(provider,host,"bd_name","user","password")
p ado.sql_read("SELECT * FROM tbl")

プロバイダは SQLNCLI でも、SQLOLEDB でも OK だが違いを理解していません。