Pregunta

Problema

Estoy intentando crear un pequeño script Ruby, que se ejecutará utilizando jruby una vez al día, para conectarme a una base de datos Sybase ASE 12.5.4 y realizar una consulta compleja.

En última instancia, tengo la intención de procesar algunos datos e insertar los nuevos datos en una tabla MySQL para usarlos dentro de una aplicación Rails.

Ambiente

  • jruby v1.4.0
  • javav1.6.0_15
  • en Ubuntu Kármico

JRuby instaló gemas

  • adaptador-jdbc-activerecord (0.9.1)
  • registro activo-2.3.4

Directorio de biblioteca de Jruby

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

Puedo confirmar que esto se conecta a la base de datos.Aunque tengo problemas al seleccionar 10 filas de una tabla de base de datos.

produce

Para ejecutar 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

Para seleccionar_filas 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

El error indica que no debo devolver un conjunto de resultados, pero no importa qué método use, ejecute, seleccione_rows, etc., nada funciona.

Una cosa más respecto a las consultas.Mi consulta original es bastante compleja, declaro variables, elimino tablas temporales y creo tablas temporales, además de completarlas y seleccionarlas.Usando Squirrel SQL puedo ejecutar una vez y obtener un resultado.Usando DBI no pude hacer esto en una sola ejecución, ¿alguien sabe si puedo ejecutar todo una vez o tendré que dividirlo?

¿Alguien podría darme alguna ayuda por favor?¿Estoy usando jTDS correctamente?Muchas gracias de antemano.

¿Fue útil?

Solución

Yo había estado utilizando los controladores de Sybase por algún tiempo como lo sugiere @lollipopman que era útil para conseguir ir, pero como he construido consultas más complejas Seguí corriendo en problemas, así que traté de volver a examinar el problema original y con una hora o así lo vaya que funcione.

Para los controladores de código abierto jTDS aquí

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

Y eso es todo lo que se necesita para conectarse a la base de datos de Sybase con JRuby y DBI

Espero que esto ayude a alguien!

Otros consejos

no es del todo relevante, pero esto es lo que se requiere cuando se utiliza jruby, JDBC Sybase y 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: que está diciendo "set recuento de filas" y "seleccionar". Se trata de dos declaraciones diferentes - los dos obtienen resultados, incluso si es "0 filas" ... Así que está recibiendo un conjunto de resultados. Trate de ejecutar a las personas por separado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top