2009-04-16 20 views
6

Primera aproximación: metal desnudoCómo conectarse a Oracle usando JRuby y 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 

El resultado de lo anterior es:

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

Segundo enfoque: 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") 

El resultado de esto es:

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) 

Esencialmente el mismo error sin importar cómo lo haga.

estoy usando JRuby 1.2.0 y tengo ojdbc14.jar en mi directorio lib JRuby

gemas:

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

¿Qué me falta?

Gracias,

+0

voy a estar interesado en ver si es así puede vencer el foro de rubí (http://www.ruby-forum.com/topic/ 184414) –

+0

Publicado originalmente en Nabble http://www.nabble.com/Having-problems-accessing-Oracle-td23070394.html Supongo que se propigaron a Ruby Forum de alguna manera ... – Rob

Respuesta

5

Resulta que mi archivo ojdbc14.jar estaba dañado.

Además, el archivo jar DEBE estar en el directorio jruby/lib. Simplemente tenerlo en el classpath no funciona.

+0

parece que estos días lo tienen en la variable de entorno CLASSPATH (específica de jruby) también es suficiente, pero hacer un requerimiento 'ojdbc14.jar' no es suficiente. – rogerdpack

+0

también parece que en estos días solo necesita requerir el jar, ya no tiene que estar en el directorio lib (1.6.0RC2) – rogerdpack

0

¿Tiene el cliente de Oracle instalado? es probable que necesite al menos los archivos del controlador jdbc del cliente

+0

Sí, pero no lo creo sería necesario con este tipo de conexión "delgada". – Rob

+0

sí, el frasco suele ser suficiente. – 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

Estoy usando su ejemplo ahora, pero lo que no entiendo es cómo ejecutaría comandos. ¿Puedes volver a hablarme de eso? – user3505901

3

y luego a usarlo después de la creación:

 
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 

Cuestiones relacionadas