2016-09-06 65 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 –