我正在使用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。
答案 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)
答案 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