JDBC Advantage 数据库找不到表(Driver 冲突?)

JDBC Advantage Database Not finding tables (Driver Conflict?)

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

首先我要连接到数据库:

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

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

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

这是我所知道的:

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


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

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

我之前在应用程序中使用

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

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

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

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

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;
    }
}

现在,由于某种原因,仅在应用程序中存在此代码会阻止建立第一个连接,即使它在不同的 class 中并且应该在第一个连接建立后执行.一旦我对此发表评论,第一个连接就会再次正常工作。

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

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

这可能对您有所帮助。

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,但此项目中的连接非常完美。这里是link。 https://github.com/SaugatBhattarai/atm/blob/master/DbPreparedStatement.java

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

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

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

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

谢谢你的帮助。