3

問題

Sybase ASE 12.5.4データベースに接続して複雑なクエリを実行するために、1日1回jrubyを使用して実行される小さなrubyスクリプトを作成しようとしています。

最終的には、データに対して何らかの処理を行い、新しいデータを MySQL テーブルに挿入して、Rails アプリケーション内で使用するつもりです。

環境

  • jruby v1.4.0
  • Java v1.6.0_15
  • Ubuntu カルミックで

JRuby にインストールされた Gem

  • activerecord-jdbc-adapter (0.9.1)
  • アクティブレコード-2.3.4

Jruby Lib ディレクトリ

  • jtds-1.2.5

クエリ

SET rowcount 10 
SELECT * FROM TEST_TABLE

コードスニペット

require 'java'
require 'jtds-1.2.5.jar'
require 'rubygems'
require 'active_record'

config = {
    :username => 'railstest',
    :password => 'railstest',
    :adapter  => 'jdbc',
    :dialect  => 'sybase',
    :host     => 'localhost',
    :database => 'railstest',
    :port     => '5000',
    :driver   => 'net.sourceforge.jtds.jdbc.Driver',
    :url      => 'jdbc:jtds:sybase://localhost:5000/railstest'
}
ActiveRecord::Base.establish_connection(config).connection.execute(-- QUERY --)

これがDBに接続されていることを確認できます。データベーステーブルから10行を選択するだけで問題がありますが。

プロデュース

実行方法の場合:

/usr/local/bin/jruby-1.4.0/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract_adapter.rb:219:in `log': ActiveRecord::ActiveRecordError: The executeUpdate method must not return a result set.: SET rowcount 10 SELECT * FROM TEST_TABLE  (ActiveRecord::StatementInvalid)
        from /usr/local/bin/jruby-1.4.0/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.2/lib/active_record/connection_adapters/jdbc_adapter.rb:559:in `execute'
        from db-test.rb:21

select_rowsメソッドの場合:

/usr/local/bin/jruby-1.4.0/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract_adapter.rb:219:in `log': ActiveRecord::ActiveRecordError: The executeUpdate method must not return a result set.: SET rowcount 10 SELECT * FROM TEST_TABLE (ActiveRecord::StatementInvalid)
        from /usr/local/bin/jruby-1.4.0/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.2/lib/active_record/connection_adapters/jdbc_adapter.rb:559:in `execute'
        from /usr/local/bin/jruby-1.4.0/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.2/lib/active_record/connection_adapters/jdbc_adapter.rb:629:in `select'
        from /usr/local/bin/jruby-1.4.0/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.2/lib/active_record/connection_adapters/jdbc_adapter.rb:550:in `select_rows'
        from db-test.rb:21

エラーは、結果セットを返すべきではないと述べていますが、使用するメソッド、execute、select_rows などは関係ありません。

クエリに関してもう 1 つ。私の元のクエリはかなり複雑です。変数を宣言し、一時テーブルを削除して一時テーブルを作成し、データを入力して選択します。Squirrel SQL を使用すると、一度実行して結果を得ることができます。DBI を使用すると、1 回の実行でこれを行うことができませんでした。すべてを 1 回だけ実行できるか、それとも分割する必要があるかを知っている人はいますか?

誰でも私に何か助けてもらえますか?jTDS を適切に使用していますか? よろしくお願いします。

4

3 に答える 3

1

@lollipopmanが提案したように、Sybaseドライバーをしばらく使用していましたが、これは作業を進めるのに役立ちましたが、より複雑なクエリを作成するにつれて問題が発生し続けたため、元の問題を再検討し、1時間ほどで動作しました.

ここでオープン ソースの jTDS ドライバーを見つけます

require java
require jtds-1.2.5.jar
require rubygems
require dbi

dbh = DBI.connect('dbi:Jdbc:jtds:sybase://<host>:<port>/<db>', <username>, <password>, {'driver' => 'net.sourceforge.jtds.jdbc.Driver'} )

JRuby と DBI を使用して Sybase データベースに接続するために必要なことはこれだけです。

これが誰かを助けることを願っています!

于 2010-01-18T04:11:45.743 に答える
0

注:あなたは「行数を設定する」と「選択する」と言っています。これらは 2 つの異なるステートメントです。「0 行」であっても、どちらも結果を取得します。つまり、結果セットを取得しています。それらを個別に実行してみてください。

于 2010-01-19T20:26:42.867 に答える