1

したがって、RubyでMS SQLデータベースへのクエリを実行していますが、すべて問題ありません。FreeTDS / ODBCのセットアップがあり、笑っています。どこからともなく、クエリの1つでこのエラーが発生します。

/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'

なに?さて、他のクエリは問題ありませんが、何らかの理由でこれは失敗します。クエリは「select*from[Provider]」です。かなり簡単です。クエリはMSSQLServerで問題なく実行されます。このクエリは、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マシンはオフィスLAN上にあります)。初めてこのようなエラーを見ました。

誰かアイデアはありますか?

4

1 に答える 1

1

dbi + dbd-odbcは非常に古く、「最新」ではないようです。

TinyTDSを試してみてください。これは、ruby用にTDSプロトコルを直接実装します。

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

于 2012-04-16T18:31:09.253 に答える