好吧,我相信問題是我沒有獲得與數據庫的正確連接,但我不確定。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中始終使用此用戶登錄來查看/修改表。 –