Ruby 重复查询的最后一行

Ruby 重复查询的最后一行,ruby,dbi,Ruby,Dbi,我正在使用ruby dbi访问MS SQL数据库。问题是,每当我从DB中选择多行时,结果包含正确数量的项,但所有项都是相同的,而它们不应该是: irbmain:001:0>要求“dbi” =>正确 irbmain:010:0>db=DBI.connect'DBI:ODBC:dataSource','userName','***' => irbmain:009:0>db.选择所有“从原始数据中选择不同的前10个id” => [[308], [308], [308], [308], [308],

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

irbmain:001:0>要求“dbi” =>正确 irbmain:010:0>db=DBI.connect'DBI:ODBC:dataSource','userName','***' => irbmain:009:0>db.选择所有“从原始数据中选择不同的前10个id” => [[308], [308], [308], [308], [308], [308], [308], [308], [308], [308]] 问题似乎与问题相同,但使用alias提出的解决方案对我不起作用,或者我可能误解了它

我怎样才能解决这个问题


我在Windows上使用DBI0.4.5和Ruby1.9.2。

这看起来有点奇怪,因为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

这看起来有点奇怪,因为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

我只能推荐:选择TinyTds

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

我只能推荐:选择TinyTds

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

最后,在至少部分了解我在问题中所链接的帖子之后,我修改了DBI源代码中的row.rb文件:

我删除了密码

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

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

我也删除了继承:最后,在至少部分了解了我在问题中所链接的帖子之后,我修改了DBI源代码中的row.rb文件:

我删除了密码

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

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

我还删除了继承:我在使用ruby 1.9.2p180 2011-02-18的MS-SQL数据库上遇到了相同的问题

我就是这样解决的:

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

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

我就是这样解决的:

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

它打印了身份证号码308的十倍。还有行[0]。类返回DBI::Row,所以我认为它们就是这样。奇怪。我假设不是在SQL Management Studio中执行相同的查询时?不,在最后一行返回308,但其他行则不同。我最好的选择是在Ruby 1.8.7下尝试它,它打印出ID:308的十倍。还有行[0]。类返回DBI::Row,所以我认为它们就是这样。奇怪。我假设不是在SQL Management Studio中执行同一查询时?不,在最后一行返回308,但其他行则不同。我的最佳选择是在Ruby 1.8.7下尝试。您运行的是什么版本的Ruby odbc?我使用的是ruby-odbc-0.2.5,这是rubygems的最新版本。我的意思是,我使用的是dbd-odbc-0.25和ruby-odbc-0.99994。您运行的是什么版本的ruby odbc?我使用的是ruby-odbc-0.2.5,这是rubygems的最新版本。我的意思是,我使用的是dbd-odbc-0.25和ruby-odbc-0.99994。是的,TinyTDS更简单。只需安装ActiveRecord适配器并使用它,这也是我们的wiki页面。您也可以使用原始TinyTDS进行连接。无论您想要达到什么样的低或高级别,但DBI和ODBC都很慢!!!是的,TinyTDS更容易。只需安装ActiveRecord适配器并使用它,这也是我们的wiki页面。您也可以使用原始TinyTDS进行连接。无论您想要达到什么样的低或高级别,但DBI和ODBC都很慢!!!