JDBC Advantage Database 找不到表(驱动程序冲突?)

Posted

技术标签:

【中文标题】JDBC Advantage Database 找不到表(驱动程序冲突?)【英文标题】:JDBC Advantage Database Not finding tables (Driver Conflict?) 【发布时间】:2016-09-06 20:05:48 【问题描述】:

好的,我认为问题在于我没有正确连接到数据库,但我不确定。

首先我要连接数据库:

Class.forName("com.extendedsystems.jdbc.advantage.ADSDriver");    
connection = DriverManager.getConnection("jdbc:extendedsystems:advantage://*ip*\D:\*path*\db.add;User ID=*username*;Password=*password*;ServerType=REMOTE;"

然后我尝试使用数据:

statement = connection.createStatement();
results = statement.executeQuery("SELECT * FROM [TABLE]");

...我得到了例外:

com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'TABLE'.

我知道 [Table] 存在,所以我最终尝试进行测试,看看我是否真的能看到我正在寻找的表。所以我这样做了:

DatabaseMetaData dmd = cConnection.getMetaData();
ResultSet rs = dmd.getTables(cConnection.getCatalog(), null, "TAB_%", null);
while (rs.next()) 
    System.out.println(rs.getString(3));

..并得到这个输出:

TABLE_CONSTRAINTS
TABLE_PRIVILEGES
TABLES
table_types
tables

这显然看起来像系统表,并且不包含我知道在我正在查看的数据库中的任何表。

这让我相信我可能没有正确连接到数据库。

这是我所知道的:

[TABLE] 存在于此数据库中,并且我的确切名称是正确的。 数据字典显然是 D:\*path*\db.add 数据库位于与我运行代码不同的服务器上。我用 IP 来指代它。 我已尝试将端口 6262(Advantage 数据库的默认端口)添加到连接字符串,但没有效果。 我确定我的密码和用户名是正确的,但我使用的帐户没有管理员权限。 (编辑)该帐户对 [TABLE] 具有完全权限。 我正在使用 Sybase 提供的最新 JDBC 驱动程序。 我使用此路径、数据字典和凭据以及 Sybase 的 ODBC 驱动程序在另一台计算机上创建了系统 DSN,并且能够毫无问题地连接。 (编辑)[TABLE] 位于数据库的默认架构内。

感谢您提供的任何帮助,我确定我遗漏了一些小东西。


更新:我更新了问题标题以更好地反映问题,因为我已经找到了问题的根源。

感谢以下 cmets 中的 Luke Woodward 帮助我找到问题的根源。但是,我仍然无法找到解决方案。

在我使用的应用程序的早期

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

要建立与 SQL Server 2008 数据库的连接,此连接工作正常。

似乎发生错误是因为 DriverManager 也在尝试使用 SQL 驱动程序而不是 Advantage 驱动程序进行第二个连接。这导致它无法正确读取表格。我能够找到一个类似的问题here,但我有点不确定如何使这个解决方案适应我的问题。对这个问题的建议解决方案是使用DriverManager.deregisterDriver() 让其他驱动程序远离我。

所以我从上述问题的一个答案中借用了这段代码:

java.util.Enumeration<Driver> drivers =  DriverManager.getDrivers();
while (drivers.hasMoreElements()) 
    Driver d = drivers.nextElement();
    if (d.getClass().getName().equals("com.microsoft.sqlserver.jdbc.SQLServerDriver")) 
        try 
            DriverManager.deregisterDriver(d);
         catch (SQLException e) 
            throw new RuntimeException("Could not deregister redshift driver");
        
        break;
    

现在,由于某种原因,应用程序中仅存在此代码就阻止了第一个连接的建立,即使它位于不同的类中,并且应该在第一个连接建立后执行。一旦我将其注释掉,第一个连接就会再次正常工作。

这个应用程序的目的是从源 A 提取数据,对其进行格式化并添加一些位,然后将其移动到源 B。由于我必须做的处理,我需要从 A 获取一些数据,做一些事情,然后从 B 获取数据,做一些事情,向 B 添加一些数据,然后向 A 添加一些数据,所以我必须同时打开两个连接。

所以这个问题现在变成了,我该如何处理这个驱动冲突,以便同时连接到同一个应用程序中的两个数据库?

【问题讨论】:

您使用的用户名是否有权限查看表格? 您的表存在于什么架构中?您以什么用户身份登录?你很可能想念主人。如果 HR 是架构 - Select * from HR.EMPLOYEES 而不是 Select * from EMPLOYEES。 数据库是一个相当简单的数据库(只是有很多数据),不是用多个模式构建的,所以它是默认模式。我确定我使用的用户有权查看和修改表格。我在 Advantage Data Architect 中一直使用这个用户登录来查看/修改表格。 我很惊讶地看到 com.microsoft.sqlserver.jdbc.SQLServerException 异常。 Advantage 驱动程序 JAR (adsjdbc.jar) 不包含 com.microsoft 下的任何类。您是否也在您的应用程序中使用 MS SQL 驱动程序?您确定您使用 Advantage 连接而不是 MS SQL 连接来与您的 Advantage 数据库通信吗? 查看了这两个驱动程序后,我希望它们能够互操作:它们不共享任何类并处理不同的数据库 URL。在与您的 Advantage 数据库交谈时,您是否绝对确定您认为与您的 Advantage 数据库的连接实际上是您的 Advantage 连接,而不是您的 MS SQL 连接?我担心的是你正在做一些事情,比如将 MS SQL 连接传递给需要 Advantage 连接的方法。 【参考方案1】:

这可能对您有所帮助。

public static Connection getConnection() throws Exception 
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost/atm";
    String username = "root";
    String password = "";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;

有关更多信息,请查看我基于简单控制台(仍需要锻炼才能完成)的 atm,但此项目中的连接非常完美。链接在这里。 https://github.com/SaugatBhattarai/atm/blob/master/DbPreparedStatement.java

【讨论】:

感谢您的回答,但我担心这不是我的解决方案。您使用的方法似乎依赖于 DriverManager 内部的连接字符串生成器,除此之外它似乎与我使用的方法大致相同。我已经测试过这样做,只是为了在我解雇它之前确定,并得到同样的例外。您的项目似乎使用此代码用于 MySQL。根据我的观察,SQL 的规则与 Advantage 略有不同。同样的项目需要连接到 SQL Server 2008 数据库,我可以毫无问题地连接到它。 这个答案对提问者没有多大帮助。他们问了一个关于 Sybase SQLAdvantage 的问题,你是做什么的?您提供了用于连接到 MySQL 的通用代码示例。如果您还没有意识到,那是一个完全不同的数据库。 -1【参考方案2】:

我发现了这个问题,老实说,我觉得我浪费了你所有的时间。

感谢 Luke Woodward 帮助我找到解决方案。

当我构建用于连接两个数据库的类时,我知道它们会共享许多相同的函数,因此我用这些函数构建了一个父类,然后将父类扩展到 ADBConnection 和 SQLConnection 类。当我这样做时,虽然有一些我错过的变量问题,包括一个包含一个搞砸一切的静态变量的问题。我根本没有连接到 Advantage 数据库,而是创建了另一个 SQL 服务器连接并寻找一个不存在的数据库。不确定这如何转化为甚至能够看到系统表,但这就是问题所在。

我已经更正了变量命名问题,现在可以正确地创建到两个数据库的连接并移动数据。

感谢您的帮助。

【讨论】:

以上是关于JDBC Advantage Database 找不到表(驱动程序冲突?)的主要内容,如果未能解决你的问题,请参考以下文章

Advantage Database 8.1 SQL IN 子句

在 Delphi 中获取 Advantage Database 查询的进度

在 Visual Studio .net 中连接到 Advantage Database .add

如何防止 Advantage Database 连接超时?

java.lang.AbstractMethodError:方法 com/extendedsystems/jdbc/advantage/ADSDatabaseMetaData.supportsSave

Advantage Database Server INSERT/UPDATE 查询性能问题