3

问题

我正在尝试构建一个小的 ruby​​ 脚本 - 每天使用 jruby 运行一次 - 以连接到 Sybase ASE 12.5.4 数据库并执行复杂的查询。

最终,我打算对数据进行一些处理,并将新数据插入 MySQL 表中,以便在 Rails 应用程序中使用。

环境

  • jruby v1.4.0
  • java v1.6.0_15
  • 在 Ubuntu 业力

JRuby 安装的 Gems

  • activerecord-jdbc-适配器 (0.9.1)
  • 活动记录-2.3.4

Jruby 库目录

  • jtds-1.2.5

询问

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?提前谢谢了。

4

3 回答 3

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'} )
于 2009-10-02T13:13:59.590 回答
1

根据@lollipopman 的建议,我已经使用 Sybase 驱动程序有一段时间了,这对开始很有帮助,但是当我构建更复杂的查询时,我一直遇到问题,所以我尝试重新审视最初的问题,大约一个小时后我就开始工作了.

在此处查找开源 jTDS 驱动程序

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 数据库所需的全部内容

希望这对某人有帮助!

于 2010-01-18T04:11:45.743 回答
0

注意:您说的是“设置行数”和“选择”。这是两个不同的语句——它们都得到结果,即使它是“0 行”......所以你得到了一个结果集。尝试分别执行这些。

于 2010-01-19T20:26:42.867 回答