2009-04-16 6 views
6

approche d'abord: métal nuComment se connecter à Oracle en utilisant JRuby et 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 

Le résultat de ce qui précède est:

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

Deuxième approche: active Enregistrement

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") 

Le résultat est:

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) 

Essentiellement la même erreur, peu importe comment je vais à ce sujet.

J'utilise JRuby 1.2.0 et je ojdbc14.jar dans mon répertoire lib JRuby

Gems:

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

Qu'est-ce que je manque?

Merci,

+0

Je serai curieux de voir si SO peut battre le forum rubis (http://www.ruby-forum.com/topic/ 184414) –

+0

À l'origine publié à Nabble http://www.nabble.com/Having-problems-accessing-Oracle-td23070394.html Je suppose qu'ils se propager à Ruby Forum en quelque sorte ... – Rob

Répondre

5

Il s'avère que mon fichier ojdbc14.jar était corrompu. En outre, le fichier jar DOIT être dans le répertoire jruby/lib. Le simple fait de l'avoir sur le classpath ne fonctionne pas.

+0

apparaît ces jours-ci l'avoir dans la variable d'environnement (spécifique jruby) CLASSPATH est également suffisant, mais juste faire un besoin 'ojdbc14.jar' n'est pas. – rogerdpack

+0

apparaît également que ces jours vous avez juste besoin d'exiger le jar, il ne doit pas être dans le répertoire lib plus (1.6.0RC2) – rogerdpack

0

Avez-vous installé le client Oracle? vous avez probablement besoin au moins des fichiers du pilote jdbc du client

+0

Oui, mais je ne le pense pas serait nécessaire avec ce type de connexion "mince". – Rob

+0

ouais le pot est généralement suffisant. – 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

J'utilise votre exemple maintenant, mais ce que je ne comprends pas, c'est comment je exécuterait des commandes. Pouvez-vous me répondre à ce sujet? – user3505901

3

puis de l'utiliser après la création:

 
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 

Questions connexes