2016-09-06 58 views
2

好吧,我相信问题是我没有获得与数据库的正确连接,但我不确定。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添加一些数据,所以我必须同时打开两个连接。

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

+0

您使用的用户名是否有权查看表格? – LeHill

+0

你的表存在什么模式?你登录的用户是什么?您很可能错过了所有者。如果HR是模式 - 从HR.EMPLOYEES中选择*,而不是从EMPLOYEES中选择*。 –

+0

数据库是一个相当简单的(只是有很多数据),并没有用多个模式构建,所以它在默认模式中。我确信我正在使用的用户有权查看表格并对其进行修改。我在Advantage Data Architect中始终使用此用户登录来查看/修改表。 –

回答

0

我发现了这个问题,我真的觉得我好像浪费了你所有的时间。

贷款到卢克伍德沃德帮助我找到解决方案。

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

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

尽管感谢您的帮助。

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

+0

然而,我很欣赏你的答案,我担心这不是我的解决方案。您使用的方法似乎依赖于DriverManager中的连接字符串生成器,除此之外,它似乎与我正在使用的方法大致相同。我已经通过这种方式进行了测试,只是在我解雇之前确定,并且得到了相同的例外。你的项目使用这个MySQL代码似乎。根据我的观察,SQL与Advantage相比规则略有不同。这个相同的项目需要连接到SQL Server 2008数据库,我可以毫无问题地连接到它。 –

+0

这个答案对提问者不会有帮助。他们问了一个关于Sybase SQLAdvantage的问题,你做了什么?您提供了用于连接到MySQL的通用代码示例。如果你还没有意识到,那是一个完全不同的数据库。 -1 –

相关问题