rails:906
From: Kazuhiro Yoshida <moriq@m...>
Date: Fri, 27 Jan 2006 20:43:06 +0900
Subject: [rails:906] Re: ArgumentError: time out of range: SELECT * FROM
もりきゅうです。 Makoto Satoh wrote: > Linux上のRails 1.0で、Ruby-ODBC/iodbc/FreeTDS経由でSQLServerへつないでい > ます。 > sqlserverアダプタでmode: odbcとしています。 > > 普通にfind(:all)したのですが、下記のようなエラーが出ました。 > > ArgumentError: time out of range: SELECT * FROM ....... > |/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/abstract_adapter.rb:88:in > `log' ここの ....... は省略されていますか。 DBI::DBD::ODBC は出ていませんか。 > abstract_adapter.rbのlogを見ましたが、このメソッドの中で例外が投げられている > ようですが、logメソッドの中でTimeに関係しそうなのはBenchmarkモジュールく > らいかと > 思うのですが、まさかBenchmarkモジュールがそんなバグを含んでいるとは思い > にくく。 logメソッドに渡しているブロックの中で起きていることなので、logの実装には 関係しないと思います。 connection_adapters/abstract_adapter.rb: def select(sql, name = nil) rows = [] repair_special_columns(sql) log(sql, name) do @connection.select_all(sql) do |row| record = {} row.column_names.each do |col| record[col] = row[col] record[col] = record[col].to_time if record[col].is_a? DBI::Timestamp end rows << record end end rows end ここに出てくるオブジェクトを確認しておくと、 @connection は DBI.connect で返される DBI::DatabaseHandle です。 row は DBI::Row です。 row[col] は ODBC の対応する型によりますが、Time に関係しそうなのは DBI::Date, DBI::Time, DBI::Timestamp です。 > これはやはりBenchmarkモジュールではなく、ロードしようとしているデータ > ベースの > 行にEpochより前の時刻を表すTimeオブジェクトを作ろうとしたための例外と考える > ほうが良いでしょうか? と思います。 > これは、そういうデータを含むデータベースが悪いのか、sqlserver_adapter.rbの > 問題か、はたまたBenchmarkモジュールに何かあるのか、どこをどういう風に見て > 行けば良いか、アドバイスいただけましたらと思います。 例外を投げているのは、DBI か Ruby-ODBC だと思います。 -- ML: rails@r... 使い方: http://QuickML.com/
@ 905 2006-01-26 09:55 [satoh.makoto@g... ] ArgumentError: time out of range: SELECT * FROM -> 906 2006-01-27 12:43 ┗[moriq@m... ]