将 Sybase ASE 12.5.4 与带有 JRuby 的 jTDS 驱动程序一起使用
Posted
技术标签:
【中文标题】将 Sybase ASE 12.5.4 与带有 JRuby 的 jTDS 驱动程序一起使用【英文标题】:Using Sybase ASE 12.5.4 with jTDS drivers with JRuby 【发布时间】:2009-09-29 06:46:53 【问题描述】:问题
我正在尝试构建一个小型 ruby 脚本 - 将使用 jruby 每天运行一次 - 以连接到 Sybase ASE 12.5.4 数据库并执行复杂的查询。
最终,我打算对数据进行一些处理,并将新数据插入 mysql 表中,以便在 Rails 应用程序中使用。
环境
jruby v1.4.0 java v1.6.0_15 在 Ubuntu Karmic 上JRuby 安装的 Gems
activerecord-jdbc-适配器 (0.9.1) activerecord-2.3.4Jruby 库目录
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? 提前谢谢了。
【问题讨论】:
SET rowcount 10
是您尝试执行的查询的一部分吗?
【参考方案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】:不完全相关,但这是使用 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 网站下载驱动程序:sybase.com/products/allproductsa-z/softwaredeveloperkit/… 注册并下载存档 - 您需要 jTDS3.jar和 jconn3.jar,可以在 classes 文件夹的存档中找到。我仍然更喜欢使用 ActiveRecord,并将继续研究如何解决这个问题。 @lollipopman 为什么是 DBI 驱动程序?这会给您带来更好的性能吗? 很高兴你在这里工作了,我没有在 Rails 上使用 ruby,所以 DBI 足以满足我的脚本需求。 @lollipopman:虽然我使用 Rails,但这是针对每天运行一次的 cron 进程并填充一个将由 rails 应用程序使用的表。我只是想在 ruby 脚本中使用活动记录正如我所说,我现在有一些工作,所以播种现在将继续这条路径 @lollipopman:您在使用 DBI 驱动程序获取列名时遇到任何问题吗? 我在这里发布了这个问题:***.com/questions/1530329/…【参考方案3】:注意: 你说的是“设置行数”和“选择”。这是两个不同的语句——它们都得到结果,即使它是“0 行”......所以你得到了一个结果集。 尝试分别执行。
【讨论】:
同意这是问题的一部分并已解决。我能否请教您关于使用哪种方法返回结果集的建议。我不断得到一个 FIXNUM 对象,即。一些结果。这对我来说都是实验性的以上是关于将 Sybase ASE 12.5.4 与带有 JRuby 的 jTDS 驱动程序一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Sybase ASE smalldatetime/datetime/bigdatetime 转换为标准格式
Sybase ASE 15.7 - 如何将两个数据库中的对象合并到一个数据库中?