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
这显然看起来像系统表,并且不包含我知道在我正在查看的数据库中的许多表中的任何一个。
这让我相信我可能没有正确连接到数据库。
这是我所知道的:
- [TABLE] 存在于此数据库中,我的确切名称是正确的。
- 数据字典绝对是 D:\*path*\db.add
- 数据库位于与我 运行 我的代码所在的服务器不同的服务器上。我用IP引用。
- 我尝试将端口 6262(Advantage 数据库的默认端口)添加到连接字符串,但没有任何效果。
- 我确定我的密码和用户名是正确的,但我使用的帐户没有管理员权限。
- (编辑)该帐户确实拥有 [TABLE] 的完全权限。
- 我正在使用 Sybase 提供的最新 JDBC driver。
- 我使用 Sybase 的 ODBC driver 使用此路径、数据字典和凭据在另一台机器上创建了系统 DSN,并且能够顺利连接。
- (编辑)[TABLE] 位于数据库的默认架构内。
感谢您提供的任何帮助,我确定我遗漏了一些小东西。
更新:我更新了问题标题,以便更好地反映问题,因为我已经找到了问题的根源。
感谢 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 服务器连接并寻找不存在的数据库。不确定这如何转化为甚至能够看到系统表,但这就是问题所在。
我已经更正了变量命名问题,现在可以正确地创建到两个数据库的连接并移动数据。
谢谢你的帮助。
好的,我认为问题是我没有正确连接到数据库,但我不确定。
首先我要连接到数据库:
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 driver。
- 我使用 Sybase 的 ODBC driver 使用此路径、数据字典和凭据在另一台机器上创建了系统 DSN,并且能够顺利连接。
- (编辑)[TABLE] 位于数据库的默认架构内。
感谢您提供的任何帮助,我确定我遗漏了一些小东西。
更新:我更新了问题标题,以便更好地反映问题,因为我已经找到了问题的根源。
感谢 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 服务器连接并寻找不存在的数据库。不确定这如何转化为甚至能够看到系统表,但这就是问题所在。
我已经更正了变量命名问题,现在可以正确地创建到两个数据库的连接并移动数据。
谢谢你的帮助。