好吧,我相信问题是我没有获得与数据库的正确连接,但我不确定。JDBC Advantage数据库未找到表(驱动程序冲突?)
所有我连接到数据库的第一:
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]存在于这个数据库,我有确切的名称是否正确。
- The Data Dictionary is defiantly D:\ * path * \ db.add
- 数据库位于不同的服务器上,而不是我正在运行我的代码。我通过IP来提及它。
- 我已经尝试将Advantage数据库的默认端口6262添加到连接字符串,并且没有任何效果。
- 我确定我正在获取密码和用户名,但我使用的帐户没有管理员权限。
- (编辑)该帐户有[TABLE]上的完整权限。
- 我正在使用Sybase提供的最新JDBC驱动程序。
- 我在另一台机器上使用Sybase ODBC驱动程序使用此路径,数据字典和证书制作了系统DSN,并且能够无问题地进行连接。
- (编辑)[TABLE]位于数据库的默认模式内。
谢谢你提供的任何帮助,我确信我缺少一些小东西。
更新:我更新了问题的标题到现在,我已经找到了我的问题的根源,更好地反映问题。
感谢卢克伍德沃德在下面的评论中帮助我找到问题的根源。然而,我仍然无法找到解决方案。
在应用程序早些时候,我使用
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添加一些数据,所以我必须同时打开两个连接。
所以这个问题现在变成了,我该如何处理这个驱动冲突,以便我同时连接到同一应用程序中的两个数据库?
您使用的用户名是否有权查看表格? – LeHill
你的表存在什么模式?你登录的用户是什么?您很可能错过了所有者。如果HR是模式 - 从HR.EMPLOYEES中选择*,而不是从EMPLOYEES中选择*。 –
数据库是一个相当简单的(只是有很多数据),并没有用多个模式构建,所以它在默认模式中。我确信我正在使用的用户有权查看表格并对其进行修改。我在Advantage Data Architect中始终使用此用户登录来查看/修改表。 –