2012-02-22 101 views
3

我需要從Ruby連接到一個相當舊的Sybase數據庫。ruby​​的sybase:連接到Sybase的JDBC

我結束了使用JRuby,只是因爲我無法連接到Sybase從MRI工作的任何方式;如果有一種方法可以實際工作,並且不會爲創建一箇舊版Sybase的Sybase連接而瘋狂,那就太好了。但是,我一頭撞在牆上,我認爲沒有。

所以我最終在jRuby中使用JDBC。我確實有一個可以連接到Sybase的JDBC.jar文件。

我知道我可以使用JDBC API在jRuby中編寫原始JDBC代碼,就像在Java中一樣。但是JDBC API非常適合工作,尤其是在逃避/注入保護方面很差(或者我可能只是不理解如何正確使用它,請參閱'難以配合',至少對於我)。

是將要在JRuby的工作,作爲一個任意JDBC的包裝有紅寶石「包裝」庫?如果我能使它與ActiveRecord一起工作,那可能很酷,但實際上並不是必需的。

我一直在使用Ruby'DBI'包,它實際上效果很好。但Ruby DBI包似乎沒有維護,對我來說變得越來越困難;有一系列的拉請求(https://github.com/erikh/ruby-dbi/issues)與使它在1.9.3下工作,沉默貶低警告等有關,這些提交者沒有關注這些請求。我向github項目所有者發送電子郵件,詢問他們是否有機會參與其中,並收到一個單詞回答「否」,但沒有解釋。不知道發生了什麼事。

那麼,我有什麼選擇從Ruby使用jRuby JDBC或其他連接到Sybase?我會補充說我使用RHEL 5作爲操作系統,但如果答案是「一旦你安裝了FreeTDS,你可以像這樣做X,Y和Z」,我可以設法自己安裝FreeTDS,過去,即使在主機上安裝FreeTDS之後,我也難以忍受)。

+0

你看到horizon-tds-example GitHub/repo忘記了一個非常重要的信息。你在使用什麼操作系統? – 2012-02-22 16:46:51

回答

0

我已在Linux上通過Sequel使用FreeTDSTinyTDS以訪問我們的一些MSSQL和Sybase DBM。

它不像使用MySQL或Postgres一樣優雅,但是可行。而且,Sequel是非Rails DB訪問的非常好的工具。它非常強大和靈活。

+0

你在MRI下工作嗎?你能指出我的任何代碼示例或安裝提示嗎? – jrochkind 2012-02-22 17:16:10

+0

我已經注意到,續集文檔並沒有特別提及sybase的支持,儘管他們提到了MS SQL,它在舊版本中類似,但它讓我害怕嘗試它。因此,您實際所做的示例/提示(以及Sybase的哪個版本)將非常有用。 – jrochkind 2012-02-22 17:17:10

+0

如果你會說出你正在使用的操作系統會非常有幫助,因爲操作系統的安裝差異很大。如果我沒有記錯的話,我使用了FreeTDS,它可以作爲CentOS的回購。儘管我很容易從源代碼編譯。一旦FreeTDS工作,TinyTDS就可以毫無問題地工作。 – 2012-02-22 18:53:47

2

我用JTDS罐子和activerecord-jdbc-adapter寶石爲我的Rails 3/Sybase ASE的15項目。

我唯一遇到的問題是Sybase的限制和偏移並不真正支持。我最終寫我自己的訪客進行限制和抵消工作。

你可能想看看這裏:https://github.com/arkadiyk/ar-sybase-jdbc-adapter

+0

您是否考慮過向activerecord-jdbc-adapter發送一個pull請求,其中需要進行更改才能支持Sybase? – jrochkind 2012-02-23 22:16:52

+0

我有,但是我意識到對Sybase支持Rails的興趣非常低。所以我放棄了。 – arkadiy 2012-02-23 22:24:36

1

這個問題似乎被拋棄了,但我想記錄一些成功。我想先說明這可以在Windows和Linux上運行。

我目前使用MSSQL V7和V8 MSSQL從JRuby中有我從微軟下載的JDBC驅動程序distributables。

問題是,JDBC 3.0和4.0驅動程序無法連接到MSSQL v7。我很幸運地發現JDBC 2.0實際上反對它。

我不知道什麼是OP的關注是關於SQL注入,但這些驅動程序能夠創建Prepared Statements(對於分區的SQL),它可以用來escape parameters safelyCallable Statements(給SP)的。

關於醜陋,是的,你是對的。這就是爲什麼需要一個位碼:

class Java::ComMicrosoftSqlserverJdbc::SQLServerResultSet 
    def to_a 
    #I used meta_data here to convert resultset to array of hashes 
    end 
end  

,並得到從一個單一的select語句多個結果:

yap= connection.create_statement 
rowing= yap.execute sql 
row_the_boat= [] 
while rowing 
    row_the_boat<< yap.get_result_set.to_a 
    rowing= yap.get_more_results 
end 
0

我放在一起使用freetds的/ TinyTDS /續集與SyBase一起使用的一個簡單的例子(我們的Sybase ASE 15.3)

的Dockerfile

#<!-- language: rb --> 
require 'dotenv/load' 
require 'sequel' 
require 'tiny_tds' 
require 'awesome_print' 

opts = { 
    adapter: 'tinytds', 
    login_timeout: 5, 
    timeout: 10, 
    tds_version: '50', #42 or 50 
    host:  ENV['APP_HZ_HOST'], 
    port:  ENV['APP_HZ_PORT'], 
    database: ENV['APP_HZ_DATABASE'], 
    username: ENV['APP_HZ_USER'], 
    password: ENV['APP_HZ_PASSWORD'] 
} 
bib_id = Integer(ARGV[0] || 0) 
tag_num = ARGV[1] || '' 

sql = "SELECT * FROM [bib] WHERE bib#=? AND tag=?" 
DB = Sequel.connect opts 
dataset = DB[sql, bib_id, tag_num] 
dataset.each do |row| 
    ap row 
end