【问题标题】:ORA-12545: Connect failed because target host or object does not exist - No error on System.Data.OracleClientORA-12545: 连接失败,因为目标主机或对象不存在 - System.Data.OracleClient 上没有错误
【发布时间】:2013-08-17 15:20:46
【问题描述】:

不敢相信我不得不问这个问题,但我终生无法连接到 Oracle 11g 数据库。

在使用System.Data.OracleClient 时以下工作有效 - 但显然这已被贬值。 当使用完全相同的代码但使用Oracle.DataAccess.OracleClient 时,我收到以下错误

{"ORA-12545: Connect failed because target host or object does not exist"}

这是我的代码

using (OracleConnection con = new OracleConnection("Data Source=orac;User Id=SYSTEM; Password=Pass;"))
        {
            con.Open();
            Console.WriteLine("Connection opened");

            OracleCommand cmd2 = new OracleCommand("SELECT * FROM SYSTEM.TABLE", con);
            OracleDataReader oracleDataReader = cmd2.ExecuteReader();

            while (oracleDataReader.Read())
            {
                Console.WriteLine(oracleDataReader[0]);
            }
        }

谁能帮我解决我做错了什么?

我必须将程序更改为 32 位才能加载 Oracle.DataAccess.dll

这甚至是要使用的正确库吗???

谢谢

编辑

tnsnames.ora 文件如下:

# tnsnames.ora Network Configuration File: 
C:\app\UserName\product\11.2.0\dbhome_3\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORAC =
 (DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = orac.example.com)
)
 )

LISTENER_ORAC =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))

更新

我已尝试使用 Oracle Sql 开发人员进行连接。只要我使用 TNS 连接类型,它就可以工作,但如果我使用 Basic 连接类型,它就不起作用。

我还注意到,在我的服务中有 2 个名为

OracleOraDb11g_home1TNSListener OracleOraDb11g_home2TNSListener

我相信 orac dbhome 是 home3,这可能是问题吗? 如果是这样,有人知道我将如何解决它吗?

谢谢

更新 在 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ 中有两个属性(默认)和 inst_loc。有几个文件夹,其中两个分别称为“KEY_OraDb11g_home1”和“KEY_OraDb11g_home2”,它们都包含一个名为 ORACLE_HOME 的属性:

KEY_OraDb11g_home1 - ORACLE_HOME = C:\app\UserName\product\11.2.0\dbhome_2 KEY_OraDb11g_home2 - ORACLE_HOME = C:\app\UserName\product\11.2.0\dbhome_3

home1 中 Db 的 SID 是一个叫做 OracleDev 的东西,我可能很久以前就安装了它,但如果它引起问题我现在肯定不需要它

谢谢

【问题讨论】:

    标签: c# sql oracle


    【解决方案1】:

    编辑

    让我们试试别的吧。

    ODP.NET 可能不知道在哪里可以找到您的 Oracle Home,因为它未在您的 PATH 环境变量中定义,或者未在注册表中设置。

    检查您的 PATH 并确保它包含您的 Oracle 主目录和“Oracle Home\bin”。对于注册表,请查找 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\。其中应该有一个名为HOME0 的键,其字符串值为ORACLE_HOME。确保它指向您的 Oracle Home。

    【讨论】:

    • tnsping orac 返回正常。我附上了 tnsnames.ora 文件,对我来说看起来不错,但我当然不是专家。 System.Data.OracleCLient 可以工作但这个不行的任何原因?
    • @PetePetersen 好的,我用另一个(潜在的)解决方案更新了我的答案
    • 也许一些 Oracle DBA 可以介入?我的经验有限,恐怕我不知道如何从这里继续。
    • 感谢您的帮助。你建议的一切都是很好的想法和正确的检查
    【解决方案2】:

    检查C:\windows\system32\drivers\etc下的主机文件,特别是如果机器是VM并且本地主机的IP地址可能会改变,如果VM的IP地址不是静态的。如有必要,更改该文件上本地主机的 IP

    【讨论】:

      【解决方案3】:

      有类似的问题:
      Visual Studio 在 ..\11.2.0\client_1\network\admin 中使用了错误版本的 tnsnames.ora
      TNS Ping 在 ..\11.2.0\client_2\network\admin

      中使用了正确版本的 tnsnames.ora

      因此 tnsping 成功但 Visual Studio 返回:ORA-12545: Connect failed because target host or object does not exist.

      解决方案,可能不是最好的,将正确版本的 tnsnames.ora 复制到 ..\11.2.0\client_1\network\admin

      【讨论】:

        【解决方案4】:

        我不知道为什么,但是在 tnsnames.oralistner.ora 中将 HOST 设置为 0.0.0.0 对我有用。

        当然,必须运行lsnrctl start

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-17
          • 2016-03-20
          • 1970-01-01
          • 2021-01-07
          • 2017-04-04
          • 2021-04-11
          • 2016-04-02
          相关资源
          最近更新 更多