Вопрос

Проблема

Я пытаюсь создать небольшой сценарий Ruby, который будет запускаться с использованием jruby один раз в день, для подключения к базе данных Sybase ASE 12.5.4 и выполнения сложного запроса.

В конечном итоге я намерен выполнить некоторую обработку данных и вставить новые данные в таблицу MySQL для использования в приложении Rails.

Среда

  • jruby v1.4.0
  • Java v1.6.0_15
  • на Ubuntu Кармик

Установленные драгоценные камни JRuby

  • activerecord-jdbc-адаптер (0.9.1)
  • активная запись-2.3.4

Каталог библиотек Jruby

  • 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 --)

Я могу подтвердить, что это связано с БД.Хотя у меня возникают проблемы с выбором 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

Ошибка гласит, что я не должен возвращать набор результатов, но не имеет значения, какой метод я использую, выполняю, select_rows и т. д., ничего не работает.

Еще один момент, касающийся запросов.Мой исходный запрос довольно сложен: я декалирую переменные, удаляю временные таблицы и создаю временные таблицы, а также заполняю их и выбираю из них.Используя Squirrel SQL, я могу выполнить его один раз и получить результат.Используя DBI, мне не удалось сделать это за одно выполнение. Кто-нибудь знает, смогу ли я просто выполнить все это один раз или мне придется разделить его?

Кто-нибудь сможет мне помочь, пожалуйста?Правильно ли я использую jTDS?Спасибо заранее.

Это было полезно?

Решение

Я некоторое время использовал драйверы Sybase, как это предложил @Lollipopman, который был полезен в работе, но, когда я создавал более сложные запросы, я продолжал сталкиваться с проблемами, поэтому я пытался вернуться к первоначальной проблеме и с часом или около того, я работаю, работаю Анкет

Найдите драйверы JTD с открытым исходным кодом здесь

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'} )

И это все, что необходимо для подключения к вашей базе данных Sybase с Jruby и DBI

Надеюсь, это кому -то поможет!

Другие советы

Не совсем актуально, но это то, что требуется при использовании Jruby, Sybase JDBC и DBI:

require 'java'
require './jars/jTDS3.jar'
require './jars/jconn3.jar'
require "rubygems"
require "dbi"

dbh = DBI.connect('dbi:Jdbc:sybase:Tds:foobar:2460/testdb', 'sa', 'password',
  {'driver' => 'com.sybase.jdbc3.jdbc.SybDriver'} )

Примечание :вы говорите «установить количество строк» ​​и «выбрать».Это два разных утверждения — они оба получают результат, даже если это «0 строк»…Итак, вы получаете набор результатов.Попробуйте выполнить их отдельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top