1

所以我在 Ruby 中对 MS SQL 数据库执行查询,一切都很好。我有 FreeTDS/ODBC 设置,我在笑。不知从何而来,我在我的一个查询中得到了这个错误:

/home/jarrett/.rvm/gems/ruby-1.9.2-p318/gems/dbd-odbc-0.2.5/lib/dbd/odbc/statement.rb:41:in `fetch': negative string size (or size too big) (ArgumentError)
            from /home/jarrett/.rvm/gems/ruby-1.9.2-p318/gems/dbd-odbc-0.2.5/lib/dbd/odbc/statement.rb:41:in `fetch'
            from /home/jarrett/.rvm/gems/ruby-1.9.2-p318/gems/dbi-0.4.5/lib/dbi/handles/statement.rb:220:in `fetch'

什么?好的,所以其他查询很好,但由于某种原因,这个问题很糟糕。查询是“从 [Provider] 中选择 *”。很直接。查询在 MS SQL Server 上运行得很好。这个查询曾经在我用 Ruby + FreeTDS + ODBC 设置的另一台机器上运行。唔..

然后我用这个快速制作一个 ruby​​ 文件:

#!/usr/bin/env ruby

require 'dbi'

db = DBI.connect('dbi:ODBC:MYDB', 'blahblah', 'blahblah')

select = db.prepare('select * from [Provider]')
select.execute
while rec = select.fetch do
puts rec.to_s
end
db.disconnect

它疯了。然后我只选择几列(而不是 *),如下所示:

#!/usr/bin/env ruby

require 'dbi'

db = DBI.connect('dbi:ODBC:MYDB', 'blahblah', 'blahblah')

select = db.prepare('select Address1, Address2 from [Provider]')
select.execute
while rec = select.fetch do
puts rec.to_s
end
db.disconnect

它工作正常!因此,我将查询更改为仅选择单个列(在我的查询中仅使用大约 13 列),它工作正常。我数了一下表中的总列数,有 103 个。

所以,我想我很好奇:为什么这会对我产生影响?103 列是否太多而无法处理?

我在 64 位 Debian 机器上运行,通过 VPN 连接到办公室(MS SQL Server 机器在办公室局域网上)。我第一次看到这样的错误。

有人有想法么?

4

1 回答 1

1

dbi + dbd-odbc 很旧,似乎不是“最新的”。

你应该试试 TinyTDS,它直接为 ruby​​ 实现了 TDS 协议:

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

于 2012-04-16T18:31:09.253 回答