重复最后一行查询

时间:2011-06-17 12:48:08

标签: ruby dbi

我正在使用ruby-dbi访问MS SQL数据库。问题是每当我从数据库中选择多行时,结果都包含正确的项目数,但它们都是相同的,当它们不应该是:

irb(main):001:0> require 'dbi'
=> true
irb(main):010:0> db=DBI.connect('dbi:ODBC:dataSource', 'userName', '****')
=> #<DBI::DatabaseHandle:0xff3df8 @handle=#<DBI::DBD::ODBC::Database:0xff3e88 @h
andle=#<ODBC::Database:0xff3f30>, @attr={}>, @trace_output=nil, @trace_mode=nil,
 @convert_types=true, @driver_name="odbc">
irb(main):009:0> db.select_all('select distinct top 10 id from rawdata')
=> [[308], [308], [308], [308], [308], [308], [308], [308], [308], [308]]

问题似乎是那个问题discussed here,但那里提出的解决方案(使用alias)对我不起作用(或者我误解了它)。

我该如何解决这个问题?

我在Windows上使用DBI 0.4.5和Ruby 1.9.2。

4 个答案:

答案 0 :(得分:1)

这看起来很奇怪,因为select_all应该返回DBI::Row个对象。尝试

rows = db.select_all('select distinct top 10 id from rawdata')
rows.each do |row|
  printf "ID: %d\n", row["id"]
end

答案 1 :(得分:1)

我只能推荐:去TinyTds

https://github.com/rails-sqlserver/tiny_tds

及其    - 更易于安装和配置   - 快点    - 更稳定

答案 2 :(得分:1)

最后,在实现(至少部分)我在谈论的问题中链接的帖子之后,我从DBI的源代码修改了文件row.rb:

我删除了代码

if RUBY_VERSION =~ /^1\.9/
    def __getobj__
        @arr
    end

    def __setobj__(obj)
        @delegate_dc_obj = @arr = obj
    end
else

和acommpanying end我也删除了继承:< DelegateClass(Array)

答案 3 :(得分:0)

我在使用ruby 1.9.2p180的MS-SQL数据库上遇到了同样的问题(2011-02-18)

这就是我解决它的方法:

def myDBIexecute(dbhash,query)

  begin
    # open the connection
    conn = DBI.connect('DBI:ODBC:'+dbhash['datasource'].to_s,dbhash['username'].to_s,dbhash['password'].to_s)
    sth = conn.prepare(query)
    sth.execute()

    outputme=[]

    while row = sth.fetch
      mrow={}
        sth.column_names.each{|aname|
        mrow[aname]=row[aname].to_s
        }
     outputme << mrow
    end

    sth.finish

    return outputme

  rescue DBI::DatabaseError => e
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
  ensure
     # disconnect from server
     conn.disconnect if conn
  end
end