Verwenden von Sybase ASE 12.5.4 mit JTDS -Treibern mit Jruby
-
18-09-2019 - |
Frage
Problem
Ich versuche, ein kleines Ruby -Skript zu erstellen, das einmal am Tag mit JRUBY ausgeführt wird, um eine Verbindung zu einer Sybase ASE 12.5.4 -Datenbank herzustellen und eine komplexe Abfrage auszuführen.
Letztendlich beabsichtige ich, die Daten zu verarbeiten und die neuen Daten in einer MySQL -Tabelle für die Verwendung innerhalb einer Rails -Anwendung einzulegen.
Umfeld
- Jruby v1.4.0
- Java v1.6.0_15
- auf Ubuntu Karmic
Jruby installierte Edelsteine
- ActivereCord-JDBC-Adapter (0.9.1)
- Activerecord-2.3.4
Jruby Lib Directory
- JTDS-1.2.5
Anfrage
SET rowcount 10
SELECT * FROM TEST_TABLE
Code-Auszug
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 --)
Ich kann bestätigen, dass dies eine Verbindung zum DB verbindet. Obwohl ich Probleme habe, nur 10 Zeilen aus einer Datenbanktabelle auszuwählen.
Produziert
Zum ausführen Methode:
/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
Zum select_rows Methode:
/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
Der Fehler besagt, dass ich keine Ergebnisseset zurückgeben sollte, aber es spielt keine Rolle, welche Methode ich verwende, ausführen, select_rows usw. nichts funktioniert.
Eine weitere Sache in Bezug auf Fragen. Meine ursprüngliche Abfrage ist ziemlich komplex, ich entschließt Variablen, lasse temporäre Tabellen ab und erstelle temporäre Tabellen sowie aus der Fülle und wähle daraus. Mit Squirrel SQL kann ich einmal ausführen und ein Ergebnis erzielen. Mit DBI konnte ich dies in einer Ausführung nicht tun. Weiß jemand, ob ich das Ganze nur einmal ausführen kann, oder muss ich es aufteilen?
Würde mir jemand bitte Hilfe geben können? Verwende ich JTDs richtig? Vielen Dank im Voraus.
Lösung
Ich hatte die Sybase -Treiber für einige Zeit verwendet, wie von @lollipopman vorgeschlagen, was hilfreich war, um loszulegen, aber als ich komplexere Fragen aufbaute, habe ich immer wieder Probleme .
Finden Sie die Open Source JTDS -Treiber hier
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'} )
Und das ist alles, was erforderlich ist, um eine Verbindung zu Ihrer Sybase -Datenbank mit JRUBY und DBI herzustellen
Hoffe das hilft jemandem!
Andere Tipps
Nicht ganz relevant, aber dies ist erforderlich, was bei der Verwendung von JRUBY, SYBASE JDBC und DBI erforderlich ist:
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'} )
Hinweis: Sie sagen "ROWCount" und "Select". Dies sind zwei verschiedene Aussagen - beide erhalten Ergebnisse, auch wenn es sich um "0 Zeilen" handelt ... Sie erhalten also ein Ergebnis. Versuchen Sie, diese separat auszuführen.