当前位置: 首页 > 知识库问答 >
问题:

尝试使用包含点字符的TNS别名连接到Oracle时出现“无效的连接字符串格式”错误

徐学潞
2023-03-14

我正在尝试使用 TNS 连接到甲骨文数据库。

问题是TNS别名包含点,所以当我这样指定url时:

jdbc:oracle:thin:@TNS.ALIAS

我有…

oracle.net.ns.NetException: Invalid connection string format, a valid format is: "host:port:sid"

...创建连接期间。

我知道点字符是一个问题,因为从< code>tnsnames.ora文件中删除它后,与数据库的连接正常。

我的问题是——有没有可能以某种方式对点字符进行转义?也许有一些连接参数可以设置为允许在别名中使用点字符?我希望避免从< code>tnsnames.ora中删除点,因为我是从外部源代码获取该文件的。

以下是我已经尝试过的选项,这些选项给了我同样的错误:

jdbc:oracle:thin:@"TNS.ALIAS"
jdbc:oracle:thin:@\"TNS.ALIAS\"
jdbc:oracle:thin:@`TNS.ALIAS`
jdbc:oracle:thin:@TNS\.ALIAS - this one is not compiling
jdbc:oracle:thin:@TNS\\.ALIAS
jdbc:oracle:thin:@TNS&#46;ALIAS
jdbc:oracle:thin:@TNS\".\"ALIAS
jdbc:oracle:thin:@TNS%2eALIAS

以下是oracle.net.ns产生的选项。NetException:无法解析连接标识符

jdbc:oracle:thin:@TNSALIAS
jdbc:oracle:thin:@TNS-ALIAS
jdbc:oracle:thin:@TNS_ALIAS

其他上下文:

  • 我正在尝试在Scala中创建Java的DataSource(严格来说,OracleDataSource)(这是Play Framework,但我没有使用Play的DB连接创建方式,我是手动创建的)
  • 我有一个使用完全相同的tnsnames的SQL Developer。ora文件,它在那里工作
  • 我们有使用完全相同的tnsnames的C#应用程序。ora文件,它在那里工作(数据源定义如下:

共有2个答案

罗伟兆
2023-03-14

我发现了问题-在更改为新的Oracle驱动程序(版本ojdbc8.jar用于版本 12.2.0.1>)后,我使用的是旧的Oracle驱动软件(版本 ojdb27.jar用于版本 12.2.0.1 ),通过TNS别名查找开始工作-没有必要对任何内容进行转义

樊运乾
2023-03-14
匿名用户

你需要定妆

System.setProperty("oracle.net.tns_admin","C:\\app\\product\\12.2.0\\client_1\\network\\admin"); 

设置到< code>tnsnames.ora的位置

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnect {
    public Connection connection;

    public DBConnect() {
    }

    public void connect() throws Exception {
        String connectString;
        System.setProperty("oracle.net.tns_admin", "C:\\app\\product\\12.2.0\\client_1\\network\\admin");
        Class.forName("oracle.jdbc.driver.OracleDriver");
        connectString = "jdbc:oracle:thin:@esmdj.test";
        System.out.println("Before DriverManager.getConnection");
        try {
            connection = DriverManager.getConnection(connectString, "scott", "tiger");
            System.out.println("Connection established");

            connection.setAutoCommit(false);
        } catch (Exception e) {
            System.out.println("Exception inside connect(): " + e);
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        DBConnect client = new DBConnect();

        System.out.println("beginning");
        try {
            client.connect();
            System.out.println("after Connected");

            client.connection.close();

            System.out.println("after close");

        } catch (Exception e) {
            try {
                System.out.println("Exception : " + e);
                client.connection.close();
                e.printStackTrace();
            } catch (Exception ex) {
                System.out.println("Close Connection Exception : " + ex);
                ex.printStackTrace();
            }
        }

    }

}


C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  .  DBConnect
beginning
Before DriverManager.getConnection
Connection established
after Connected
after close

tnsnames.ora

esmdj.test =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.yyy.zzz)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ESMD)
    )
  )

 类似资料:
  • 我使用的是Oracle 11g R2数据库。我使用Oracle SQL Developer。如果我创建了一个新连接并检查了基本连接类型并填写了我可以连接的字段。如果我选择TNS并在下拉菜单中选择我想要的,它会显示失败E/S异常:网络适配器无法建立连接。 这是tnsnames.ora。我用它连接到2个数据库,dblilly和astrea。我可以正确连接到astrea。侦听器已打开,实例已准备就绪。你

  • 问题内容: 我的数据库中有一列,其中包含4个字段,以“ \”定界字符串。 在我的报告中,我根据需要分别拆分了这些字段。 我还需要单独使用这些字段作为针对另一个表的条件。 我尝试过的事情: 临时表: 然后将其与另一个表连接。 我也尝试立即加入而不将值存储在表中: 我想 避免 使用临时表,并使其类似于第二种方法。如果这是不可避免的,那就这样吧。 有人对此有解决方案吗? 谢谢,JFIT 问题答案: 我认

  • 我有一个来自ASP.NET的连接字符串,我必须在我的Java应用程序中使用它,然而,我似乎无法弄清楚它为什么不工作。 这是我得到的错误:cannot ;建立 ;连接 ;到 ;jdbc:sqlserver://localhost:1433;databaseName=mydatabase;“ 使用 ;com.microsoft.sqlserver.jdbc.sqlserverdriver ;( ;连接

  • 问题内容: 我突然在我的java-app(使用NetBeans作为IDE)中创建记录器时,突然看到一条警告:“记录器中字符串连接使用效率不高”。 我的原始代码是 但是NetBeans建议将此代码转换为模板(“模板”在这里意味着什么?),并提供以下代码: 这两种串联方式有什么不同,尽管我从未使用过后者。 干杯。 问题答案: 我会忽略该警告(如果可能,请将其关闭)。串联的效率不是那么低,因为现代编译器

  • 我有一个应用程序正在从jooq切换到jdbc,我使用jdbc创建了一个表,但我需要编辑一些jooq查询来加入它,问题是自动生成的jooq tables类无法识别它,所以有没有办法通过字符串名引用表? 下面是一些示例代码: 我如何在此处加入“连接”表?没有桌子。连接,因为它是以不同的方式创建的。 有很多疑问,所以我们希望根据需要逐步进行转换。 更新:我尝试添加以下内容,并且查询运行,但是我尝试获取的

  • 无法打印出格式错误弹出的结果。 尝试在没有getWaitingTime()和%-20d(最后一个)的情况下执行,它可以工作。 尝试执行1,并用getWaitingTime()替换seqNo,它可以工作。 不确定是什么错误。 它调用toString方法的部分。它从servicelist被称为。 至于错误是: JAVAutil。MissingFormatArgumentException:邮局的格式说