2009-09-29 83 views
3

问题使用Sybase ASE 12.5.4与JTDS驱动程序使用JRuby

我试图建立一个小型的Ruby脚本 - 将使用JRuby每天一次运行 - 连接到的Sybase ASE 12.5.4数据库并执行一个复杂的查询。

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

环境

  • 的jruby V1.4.0
  • 的java v1.6.0_15
  • 在Ubuntu业报

JRuby的安装宝石

  • 的ActiveRecord-JDBC适配器(0.9.1)
  • 的ActiveRecord-2.3.4

JRuby的lib目录

  • 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等没有任何作品。

关于查询还有一件事。我原来的查询是相当复杂的,我decalre变量,删除临时表和创建临时表以及填充和选择它们。使用Squirrel SQL,我可以执行一次并获得结果。使用DBI我无法在一次执行中执行此操作,是否有人知道我是否可以只执行一次该操作,还是必须将其分开?

任何人都可以给我任何援助吗?我是否正确使用jTDS? 非常感谢提前。

+0

您尝试执行的查询中的“SET rowcount 10”部分是? – 2010-01-21 07:42:59

回答

1

使用了一段时间了SYBASE司机通过@lollipopman这是要去有帮助的建议让我一直但是当我构建更复杂的查询时,我一直在遇到问题,所以我试图重新审视原始问题,并且一个小时左右我就开始工作。

找到开源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数据库可以帮助别人!

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

我试过了,我可以连接到我的数据库 - 谢谢lollipopman 对于阅读此内容的任何人,您需要从Sybase网站下载驱动程序:http://www.sybase.com/products/allproductsa-z/softwaredeveloperkit/jconnect 注册并下载档案 - 您需要jTDS3.jar和jconn3.jar,它们可以在classes文件夹的档案中找到。 我仍然希望使用ActiveRecord,并会继续如何解决这个问题。 @lollipopman为什么DBI驱动程序?这是否给你更好的表现? – Spasm 2009-10-05 01:20:54

+0

很高兴在这里你得到它的工作,我没有在rails上使用ruby,所以DBI足以满足我的脚本需求。 – user183092 2009-10-05 12:57:05

+0

@lollipopman:虽然我使用rails,但这是针对每天运行一次的cron进程并填充将由rails应用程序使用的表。我只想在ruby脚本中使用活动记录 正如我所说我现在有一些工作,现在母猪将继续使用此路径 – Spasm 2009-10-07 04:29:54

0

说明: 您在说“set rowcount”和“select”。这些是两种不同的陈述 - 它们都得到结果,即使它是“0行”...所以你得到一个结果集。 尝试单独执行这些操作。

+0

同意这是部分的问题并已解决。我可以问你的建议,使用哪种方法返回结果集。我不断得到一个FIXNUM对象即。一些结果。这对我来说都是非常实验性的 – Spasm 2010-01-20 00:39:29

相关问题