JDBC Advantage数据库没有查找表(Driver Conflict?)

时间:2016-09-06 20:05:49

标签: java database jdbc advantage-database-server

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

首先,我要连接数据库:

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

它显然看起来像系统表,并且不包含我所知道的数据库中的任何MANY表。

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

这就是我所知道的:

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

感谢您提供任何帮助,我相信我错过了一些小事。

更新:我更新了问题标题,以便更好地反映我现在找到问题根源的问题。

感谢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添加一些数据,所以我必须同时打开两个连接。

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

2 个答案:

答案 0 :(得分:0)

这可能对您有所帮助。

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

答案 1 :(得分:0)

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

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

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

我已更正了变量命名问题,现在正在创建与两个数据库的连接并使数据移动。

感谢您的帮助。