Использование Sybase ASE 12.5.4 с драйверами jTDS с JRuby
-
18-09-2019 - |
Вопрос
Проблема
Я пытаюсь создать небольшой сценарий 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 строк»…Итак, вы получаете набор результатов.Попробуйте выполнить их отдельно.