2009-04-16 43 views
6

tiếp cận đầu tiên: kim loại trầnLàm thế nào để kết nối với Oracle sử dụng JRuby & JDBC

require 'java' 
require 'rubygems' 
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar" # should be redundant, but tried it anyway 
odriver = Java::JavaClass.for_name("oracle.jdbc.driver.OracleDriver") 
puts odriver.java_class 
url = "jdbc:oracle:thin:@myhost:1521:mydb" 
puts "About to connect..." 
con = java.sql.DriverManager.getConnection(url, "myuser", "mypassword"); 
if con 
    puts " connection good" 
else 
    puts " connection failed" 
end 

Kết quả trên là:

sqltest.rb:4: cannot load Java class oracle.jdbc.driver.OracleDriver (NameError) 

cách tiếp cận thứ hai: Active Record

require 'rubygems' 
gem 'ActiveRecord-JDBC' 
require 'jdbc_adapter' 
require 'active_record' 
require 'active_record/version' 
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar" # should be redundant... 

ActiveRecord::Base.establish_connection(
    :adapter => 'jdbc', 
    :driver => 'oracle.jdbc.driver.OracleDriver', 
    :url => 'jdbc:oracle:thin:@myhost:1521:mydb', 
    :username=>'myuser', 
    :password=>'mypassword' 
) 
ActiveRecord::Base.connection.execute("SELECT * FROM mytable") 

Kết quả của việc này là:

C:/ruby/jruby-1.2.0/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.1/lib/active_recordconnection_adapters/jdbc_adapter.rb:330:in `initialize': 
The driver encountered an error: cannot load Java class oracle.jdbc.driver.OracleDriver (RuntimeError) 

Về cơ bản cùng một lỗi không có vấn đề làm thế nào tôi đi về nó.

Tôi đang sử dụng JRuby 1.2.0 và tôi có ojdbc14.jar trong thư mục lib JRuby tôi

Gems:

  • ActiveRecord-JDBC (0,5)
  • activerecord-jdbc-adapter (0.9.1)
  • activerecord (2.2.2)

Tôi đang thiếu gì?

Xin cảm ơn,

+0

Sẽ quan tâm để xem nếu SO có thể đánh bại các diễn đàn ruby ​​(http://www.ruby-forum.com/topic/ 184414) –

+0

Được gửi tới Nabble http://www.nabble.com/Having-problems-accessing-Oracle-td23070394.html Tôi đoán họ được chuyển đến Ruby Forum bằng cách nào đó ... – Rob

Trả lời

5

Nó chỉ ra rằng tệp ojdbc14.jar của tôi bị hỏng.

Hơn nữa, tệp jar PHẢI nằm trong thư mục jruby/lib. Đơn giản chỉ cần có nó trên classpath không hoạt động.

+0

xuất hiện những ngày này có nó trong (jruby cụ thể) môi trường CLASSPATH biến cũng đủ, nhưng chỉ cần làm một yêu cầu 'ojdbc14.jar' là không. – rogerdpack

+0

cũng xuất hiện rằng những ngày này bạn chỉ cần yêu cầu các jar, nó không cần phải có trong thư mục lib nữa (1.6.0RC2) – rogerdpack

0

Bạn đã cài đặt ứng dụng khách Oracle chưa? bạn có thể cần ít nhất tệp trình điều khiển jdbc từ máy khách

+0

Có, nhưng tôi không nghĩ rằng sẽ được yêu cầu với loại kết nối "mỏng" này. – Rob

+0

vâng bình thường là đủ. – rogerdpack

5
 
require 'java' 

# This require doesn't load the jdbc driver jar into the system class path 
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar" 

# 2 ways you can load the class (There are probably more) 

# 1 ruby syntax for java class name 
Java::OracleJdbcDriver::OracleDriver 

# 2 Use the thread context class loader 
java.lang.Class.forName("oracle.jdbc.driver.OracleDriver", true, java.lang.Thread.currentThread.getContextClassLoader) 


url = "jdbc:oracle:thin:@myhost:1521:mydb" 
puts "About to connect..." 
con = java.sql.DriverManager.getConnection(url, "myuser", "mypassword"); 
if con 
    puts " connection good" 
else 
    puts " connection failed" 
end 
+0

Tôi đang sử dụng ví dụ của bạn bây giờ, nhưng những gì tôi không hiểu là làm thế nào tôi sẽ chạy các lệnh. Bạn có thể lấy lại cho tôi không? – user3505901

3

và sau đó sử dụng nó sau khi tạo:

 
b = con.create_statement 
rs=b.execute_query(“select BANNER from SYS.V_$VERSION”) 
while(rs.next()) 
    p rs.getObject(1) # get first column 
end 
rs.close 

and how to deal with oracle timestamps (if column 3 is a timestamp, for example): 

>> rs.getObject(3).timestamp_value.to_string 
=> “1970-01-01 00:00:01.0″ 
>> Date.parse(rs.getObject(3).timestamp_value.to_string) 
# or you can use time, like 
>> as_ruby_time= Date.parse(rs.getObject(3).timestamp_value.to_string).to_time # 1.9 has this method 
# or 
>> as_ruby_time = Time.at(0) + rs.getObject(3).timestamp_value.get_time 

Các vấn đề liên quan