ruby-oci8:ORA-12514:TNS:监听器当前不知道连接描述符中请求的服务

时间:2016-04-25 13:38:07

标签: ruby oracle

我尝试在Windows 7 x64 PC上使用最新的 oracle_enhanced ruby​​-oci8 宝石连接到Oracle DB,但失败如下:

**C:\Program Files\Oracle\instantclient_12_1**

我通过下载安装了Oracle即时客户端并将其解压缩到

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter: 'oracle_enhanced',
  database: 'my_db_sid',
  host: 'my_db_host',
  port: 1531,
  username: 'username',
  password: 'password'
)


class Customer < ActiveRecord::Base
  self.table_name = 'CUSTOMER'
end

puts "First: #{Customer.first}"

我添加了指向 C:\ Program Files \ Oracle \ instantclient_12_1 的环境变量 TNS_ADMIN 。 我将TNS_ADMIN添加到Path。

运行简单的ruby脚本时:

connection = ActiveRecord::Base.establish_connection(
  adapter: 'oracle_enhanced',
  database: 'my_db_sid',
  host: 'my_db_host',
  port: 1531,
  username: 'username',
  password: 'password'
)
puts connection.inspect



#class Customer < ActiveRecord::Base
#  self.table_name = 'CUSTOMER'
#end
#
#puts "First: #{Customer.first}"

如果我删除对Customer表的调用,我可以检查连接对象:

vector<string> hj{ "jack" };
vector<double> x{ 8 };
NamePairs pair1(hj,x);

知道这里有什么问题?该脚本在其他PC上工作得很好,但与其他数据库和环境有关。所以使用的设置应该没问题。 谢谢。

环境

  • Windows 7 x 64位Ruby 2.3
  • activerecord-oracle_enhanced-adapter(1.6.7)
  • ruby​​-oci8(2.2.2 x64-mingw32)

2 个答案:

答案 0 :(得分:0)

您需要使用某种不同格式的database部分。这是我的配置:

  adapter: "oracle_enhanced"
  username: "db_user"
  database: "//my.host/my.sid"
  password: "passw0rd"

答案 1 :(得分:0)

我想出了如何连接到2个数据库中的一个。它们具有不同的设置,至少在Sqldeveloper v 4.1.3.20中。

以下是适合我的设置(请注意,它不在Rails上下文中,只是一个ruby文件):

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter: 'oracle_enhanced',
  host: 'as specified in the field Host name of SQL developer',
  port: 'as specified in the field Port of SQL developer',
  database: 'as specified in the fiels Service name of SQL developer',
  username: 'username',
  password: 'userpassword'
)
class Department < ActiveRecord::Base
  self.table_name = 'DEPARTMENTS'
end

puts "First found department: #{Department.first.inspect}"

第二个数据库在SQL开发人员中有不同的设置:

- host: some_host_url
- port: some port number
- SID: some SID value

最后一个解决方案是添加以下设置:

HOST = "your host"
PORT = XXXX #your port number
SID = 'your SID'

ActiveRecord::Base.establish_connection(
        adapter: 'oracle_enhanced',
        database: "(DESCRIPTION=
          (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=#{HOST})(PORT=#{PORT})))
          (CONNECT_DATA=(SID=#{SID}))
        )",
        username: 'user',
        password: 'secret'
      )

希望这有帮助。