Domanda

problema

Sto cercando di costruire un piccolo script Ruby - che verrà eseguito utilizzando JRuby una volta al giorno - per connettersi a un database di Sybase ASE 12.5.4 ed eseguire una query complessa.

In definitiva ho intenzione di fare un po 'di elaborazione sui dati e inserire i nuovi dati in una tabella di MySQL per l'uso all'interno di un'applicazione rails.

Ambiente

  • JRuby v1.4.0
  • java v1.6.0_15
  • su Ubuntu Karmic

Gems JRuby installati

  • activerecord-jdbc-adattatore (0.9.1)
  • activerecord-2.3.4

JRuby lib

  • jtds-1.2.5

Query

SET rowcount 10 
SELECT * FROM TEST_TABLE

Snippet di codice

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 confermare questo si collega al DB. Anche se io sto avendo problemi solo selezionando 10 righe da una tabella del database.

Produce

execute Metodo:

/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 Metodo:

/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

Gli stati di errore che non deve restituire un set di risultati, ma non importa quale metodo che uso, eseguire, select_rows ecc niente funziona.

Una cosa più per quanto riguarda le query. La mia domanda originale è piuttosto complesso, ho decalre variabili, eliminare tabelle temporanee e creare tabelle temporanee, nonché Populate e selezionare da loro. Utilizzando Squirrel SQL posso eseguire una volta e di ottenere un risultato. Utilizzando DBI ero in grado di farlo in un'esecuzione, qualcuno sa se posso solo eseguire il tutto una o dovrò dividere in su?

Qualcuno in grado di darmi alcuna assistenza per favore? Sto usando jTDS correttamente? Molte grazie in anticipo.

È stato utile?

Soluzione

Avevo usato i driver Sybase per qualche tempo, come suggerito dal @lollipopman che è stato utile per ottenere in corso, ma come ho costruito query più complesse ho continuato a correre in problemi così ho cercato di rivisitare il problema originale e con un'ora o così mi andare a farlo funzionare.

Trova i driver open source jTDS qui

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 questo è tutto ciò che è necessario per la connessione al database Sybase con JRuby e DBI

Spero che questo aiuti qualcuno!

Altri suggerimenti

non del tutto rilevante, ma questo è ciò che è necessario quando si utilizza 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: che stai dicendo "SET ROWCOUNT" e "selezionare". Si tratta di due affermazioni diverse - entrambi ottengono risultati, anche se è "0 righe" ... Quindi hai trovato un gruppo di risultati. Provate ad eseguire quelle separatamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top