问题
我正在尝试构建一个小的ruby脚本 - 它将每天使用jruby运行一次 - 以连接到Sybase ASE 12.5.4数据库并执行复杂查询。
最终,我打算对数据进行一些处理,并将新数据插入MySQL表中,以便在rails应用程序中使用。
环境
JRuby已安装的宝石
Jruby Lib目录
查询
SET rowcount 10
SELECT * FROM TEST_TABLE
代码段
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 --)
我可以确认这是连接到数据库。虽然我在从数据库表中选择10行时遇到问题。
可生产
对于执行方法:
/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 方法:
/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
错误表明我不应该返回结果集,但是无论我使用哪种方法,执行,select_rows等都无关紧要。
关于查询还有一件事。我的原始查询相当复杂,我对变量进行十进制,删除临时表并创建临时表以及填充和选择它们。使用Squirrel SQL我可以执行一次并获得结果。使用DBI我无法在一次执行中执行此操作,是否有人知道我是否可以执行整个操作一次或者我是否必须将其拆分?
有人能给我任何帮助吗?我正确使用jTDS吗? 提前谢谢了。
答案 0 :(得分:1)
并不完全相关,但这是使用jruby,sybase jdbc和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'} )
答案 1 :(得分:1)
我已经按照@lollipopman的建议使用Sybase驱动程序,这有助于开始,但是当我构建更复杂的查询时,我一直遇到问题所以我试着重新审视原来的问题,并且花了一个小时左右我去吧。
查找开源jTDS驱动程序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'} )
这就是使用JRuby和DBI连接到Sybase数据库所需的全部内容
希望这有助于某人!
答案 2 :(得分:0)
注意: 你说的是“set rowcount”和“select”。这是两个不同的陈述 - 它们都得到结果,即使它是“0行”......所以你得到一个结果集。 尝试单独执行这些。