Jdbc 使用Sybase ASE 12.5.4和JRuby的jTDS驱动程序

Jdbc 使用Sybase ASE 12.5.4和JRuby的jTDS驱动程序,jdbc,jruby,sap-ase,jtds,activerecord-jdbc,Jdbc,Jruby,Sap Ase,Jtds,Activerecord Jdbc,问题 我正在尝试构建一个小型ruby脚本,它将使用jruby每天运行一次,以连接到Sybase ASE 12.5.4数据库并执行复杂的查询 最后,我打算对数据进行一些处理,并将新数据插入MySQL表中,以便在rails应用程序中使用 环境 require 'java' require 'jtds-1.2.5.jar' require 'rubygems' require 'active_record' config = { :username => 'railstest',

问题

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

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

环境

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 --)
  • jruby v1.4.0
  • java v1.6.0_15
  • 论因果报应
JRuby安装的Gems

  • ActiveRecordJDBC适配器(0.9.1)
  • activerecord-2.3.4
Jruby Lib目录

SET rowcount 10 
SELECT * FROM TEST_TABLE
  • 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
/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
对于选择_行方法:

/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
/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
错误说明我不应该返回结果集,但不管我使用哪种方法,执行、选择行等等,都不起作用

关于查询还有一件事。我的原始查询相当复杂,我删除变量,删除临时表,创建临时表,并从中填充和选择。使用squirrelsql,我可以执行一次并获得一个结果。使用DBI,我无法在一次执行中完成这项任务,有人知道我是否可以只执行一次整个任务,还是必须将其拆分

有人能给我一些帮助吗?我是否正确使用JTD?
非常感谢

不完全相关,但这是使用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'} )

我已经按照@lollipopman的建议使用Sybase驱动程序一段时间了,这有助于开始工作,但随着我构建更复杂的查询,我不断遇到问题,因此我尝试重新审视原始问题,用了一个小时左右的时间,我开始工作

查找开源jTDS驱动程序

需要java
需要jtds-1.2.5.jar
需要rubygems
需要dbi
dbh=DBI.connect('DBI:Jdbc:jtds:sybase://://',{'driver'=>'net.sourceforge.jtds.Jdbc.driver'})
这就是使用JRuby和DBI连接到Sybase数据库所需的全部内容

希望这对别人有帮助

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

我尝试了这个方法,我可以连接到我的数据库-感谢lollipopman让所有阅读本文的人阅读本文。您需要从Sybase网站下载驱动程序:注册并下载存档文件-您需要jTDS3.jar和jconn3.jar,它们可以在classes文件夹的存档文件中找到。我仍然更愿意使用ActiveRecord,并将继续研究如何解决这个问题@棒棒糖男为什么是DBI司机?这会给您带来更好的性能吗?很高兴您能让它工作起来,我没有使用ruby on rails,所以DBI足以满足我的脚本需求。@lollipopman:虽然我使用rails,但这是用于cron进程的,它将每天运行一次,并填充rails应用程序将使用的表。我只是想在ruby脚本中使用ActiveRecord,因为我说过我现在有些东西正在工作,所以sow将继续使用此路径now@lollipopman:您在使用DBI驱动程序获取列名时遇到任何问题吗?我在此处发布了此问题:同意这是问题的一部分,并已解决。我可以请教您关于使用哪种方法返回结果集的建议吗。我一直在得到一个FIXNUM对象,也就是一系列结果。这对于meIs来说都是非常实验性的,您试图执行的查询的
设置行数10
部分?