2009-09-29 28 views
3

ProblèmeUtilisation de 12.5.4 avec les pilotes de JTDS avec JRuby

Je suis en train de construire un petit script Ruby - qui sera exécuté à l'aide JRuby une fois par jour - pour se connecter à un Sybase ASE 12.5.4 base de données et effectuer une requête complexe. En fin de compte, j'ai l'intention de faire un peu de traitement sur les données et d'insérer les nouvelles données dans une table MySQL pour une utilisation dans une application de rails.

Environnement

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

JRuby Gems installés

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

jruby Lib Directory

  • jtds-1.2.5

Query

SET rowcount 10 
SELECT * FROM TEST_TABLE 

Code Snippet

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

je peux le confirmer se connecte au DB. Bien que j'ai des problèmes en sélectionnant simplement 10 lignes d'une table de base de données.

Produit

Pour exécuter la méthode:

/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 

Pour select_rows méthode:

/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 

Les états d'erreur que je ne devrais pas retourner un jeu de résultats mais il n'a pas d'importance quelle méthode J'utilise, exécute, select_rows etc rien ne fonctionne.

Encore une chose concernant les requêtes. Ma requête d'origine est plutôt complexe, je décale les variables, supprime les tables temporaires et crée des tables temporaires, les remplit et les sélectionne. En utilisant Squirrel SQL, je peux exécuter une fois et obtenir un résultat. En utilisant DBI, j'ai été incapable de le faire en une seule exécution, est-ce que quelqu'un sait si je peux simplement exécuter le tout une fois ou dois-je le séparer?

Quelqu'un pourrait-il m'aider s'il vous plaît? Est-ce que j'utilise jTDS correctement? Merci beaucoup d'avance.

+0

Est-ce que la partie 'SET rowcount 10' de la requête que vous essayez d'exécuter? –

Répondre

1

j'avais utilisé les pilotes Sybase pour quelque temps comme suggéré par @lollipopman qui était utile pour obtenir d'aller mais comme je construisais des requêtes plus complexes, je continuais à rencontrer des problèmes, alors j'ai essayé de revisiter le problème original et avec une heure ou deux je le fais fonctionner.

Trouver les JTDS open source pilotes here

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

Et ce qui est tout ce qui est nécessaire pour se connecter à votre base de données Sybase avec JRuby et DBI

Hope this helps quelqu'un!

1

pas tout à fait pertinente, mais c'est ce qui est nécessaire lors de l'utilisation JRuby, sybase jdbc et 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

J'ai essayé ceci et je peux me connecter à ma base de données - merci lollipopman Pour ceux qui lisent ceci, vous devez télécharger les pilotes sur le site Web de Sybase: http://www.sybase.com/products/allproductsa-z/softwaredeveloperkit/jconnect Enregistrez et téléchargez l'archive - vous avez besoin de jTDS3.jar et jconn3.jar qui se trouvent dans l'archive du dossier classes. Je préférerais toujours utiliser ActiveRecord et je chercherai comment résoudre ce problème. @lollipopman pourquoi les pilotes DBI? Cela vous donne-t-il de meilleures performances? – Spasm

+0

Heureux d'ici que vous l'ayez fait fonctionner, je n'utilise pas ruby ​​sur les rails DBI est suffisant pour mes besoins de script. – user183092

+0

@lollipopman: Bien que j'utilise des rails, ceci est pour un processus cron qui fonctionnera une fois par jour et peuplera une table qui sera utilisée par l'application rails. Je voulais juste utiliser un enregistrement actif dans le script ruby ​​ Comme je l'ai dit, j'ai quelque chose qui fonctionne maintenant sow continuera avec ce chemin pour l'instant – Spasm

0

Remarque: vous dites "set rowcount" et "select". Ce sont deux déclarations différentes - elles obtiennent toutes les deux des résultats, même si c'est "0 lignes" ... Donc vous obtenez un résultat. Essayez d'exécuter ceux-ci séparément.

+0

D'accord ceci fait partie de la question et ont résolu. Puis-je demander votre avis sur la méthode à utiliser pour retourner un ensemble de résultats. Je continue à obtenir un objet FIXNUM c'est à dire. un certain nombre de résultats. Tout cela est très expérimental pour moi – Spasm