Pergunta

Problema

Estou tentando criar um pequeno script Ruby - que será executado usando o Jruby uma vez por dia - para conectar -se a um banco de dados Sybase ASE 12.5.4 e executar uma consulta complexa.

Por fim, pretendo fazer algum processamento nos dados e inserir os novos dados em uma tabela MySQL para uso em um aplicativo Rails.

Meio Ambiente

  • Jruby v1.4.0
  • Java v1.6.0_15
  • no Ubuntu Karmic

Jruby instalou gemas

  • ActiveRecord-JDBC-AdApter (0.9.1)
  • ActiveRecord-2.3.4

Diretório Jruby Lib

  • JTDS-1.2.5

Consulta

SET rowcount 10 
SELECT * FROM TEST_TABLE

Fragmento de código

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

Posso confirmar que isso se conecta ao banco de dados. Embora eu esteja tendo problemas apenas selecionando 10 linhas de uma tabela de banco de dados.

Produz

Por executar método:

/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

Por SELECT_ROWS método:

/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

O erro afirma que não devo retornar um conjunto de resultados, mas não importa qual método eu uso, execute, select_rows etc., nada funciona.

Mais uma coisa sobre consultas. Minha consulta original é bastante complexa, decalme variáveis, solto tabelas temporárias e cria tabelas temporárias, além de preencher e selecionar a partir delas. Usando o SQL SQL, posso executar uma vez e obter um resultado. Usando o DBI, não consegui fazer isso em uma execução, alguém sabe se posso simplesmente executar tudo uma vez ou terei que dividi -la?

Alguém seria capaz de me dar alguma assistência, por favor? Estou usando JTDs corretamente? Muito obrigado antecipadamente.

Foi útil?

Solução

Eu estava usando os drivers do Sybase há algum tempo, conforme sugerido por @lollipopman, que foi útil para começar, mas, ao criar consultas mais complexas, continuei enfrentando problemas, então tentei revisitar o problema original e com uma hora ou assim eu vou trabalhar .

Encontre os drivers JTDs de código aberto aqui

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

E isso é tudo o que é necessário para se conectar ao seu banco de dados Sybase com Jruby e DBI

Espero que isso ajude alguém!

Outras dicas

Não é totalmente relevante, mas é isso que é necessário ao usar Jruby, Sybase JDBC e 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'} )

Nota: Você está dizendo "Set RowCount" e "Selecione". Essas são duas declarações diferentes - ambos obtêm resultados, mesmo que sejam "0 linhas" ... então você está obtendo um ResultSet. Tente executá -los separadamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top