6

第一种方法:裸机

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

上面的结果是:

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

第二种方法: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")

结果是:

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)

无论我如何处理,基本上都是相同的错误。

我正在使用 JRuby 1.2.0,我的 JRuby lib 目录中有 ojdbc14.jar

宝石:

  • ActiveRecord-JDBC (0.5)
  • activerecord-jdbc-适配器 (0.9.1)
  • 活动记录(2.2.2)

我错过了什么?

谢谢,

4

4 回答 4

5

原来我的 ojdbc14.jar 文件已损坏。

此外,jar 文件必须位于 jruby/lib 目录中。简单地将它放在类路径上是行不通的。

于 2009-04-20T00:50:25.883 回答
5
需要'java'

# 这个require不会将jdbc驱动jar加载到系统类路径中
需要“c:/ruby/jruby-1.2.0/lib/ojdbc14.jar”

# 2种加载类的方法(可能还有更多)

# 1 java类名的ruby语法
Java::OracleJdbcDriver::OracleDriver

# 2 使用线程上下文类加载器
java.lang.Class.forName("oracle.jdbc.driver.OracleDriver", true, java.lang.Thread.currentThread.getContextClassLoader)


url = "jdbc:oracle:thin:@myhost:1521:mydb"
提出“即将连接...”
con = java.sql.DriverManager.getConnection(url, "myuser", "mypassword");
如果骗
    把“连接好”
别的
    提出“连接失败”
结尾
于 2010-06-03T05:42:07.137 回答
3

然后在创建后使用它:

b = con.create_statement
rs=b.execute_query(“从 SYS.V_$VERSION 中选择 BANNER”)
而(rs.next())
  pr rs.getObject(1) # 获取第一列
结尾
rs.close

以及如何处理 oracle 时间戳(例如,如果第 3 列是时间戳):

>> rs.getObject(3).timestamp_value.to_string
=> “1970-01-01 00:00:01.0”
>> Date.parse(rs.getObject(3).timestamp_value.to_string)
# 或者你可以使用时间,比如
>> as_ruby_time= Date.parse(rs.getObject(3).timestamp_value.to_string).to_time #1.9有这个方法
# 或者
>> as_ruby_time = Time.at(0) + rs.getObject(3).timestamp_value.get_time

于 2011-02-18T00:08:13.027 回答
0

你安装了oracle客户端吗?您可能至少需要来自客户端的 jdbc 驱动程序文件

于 2009-04-16T08:27:44.947 回答