[OK]をクリックします。問題は、データベースに正しく接続されていないとは確信しています。JDBC Advantageデータベーステーブルが見つからない(ドライバの競合?)
私は、データベースに接続していますまず第一に:
statement = connection.createStatement();
results = statement.executeQuery("SELECT * FROM [TABLE]");
...と私は例外を取得:
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;"
その後、私はデータを使用しようと
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'TABLE'.
を
私は[表]が存在することを知っているので、私は実際に私が探している表の可視性を実際に得ているかどうかを確認するためのテストを試みます ために。
DatabaseMetaData dmd = cConnection.getMetaData();
ResultSet rs = dmd.getTables(cConnection.getCatalog(), null, "TAB_%", null);
while (rs.next()) {
System.out.println(rs.getString(3));
}
..andこの出力を得る:はっきりとシステムテーブルのように見え、およびデータベースにIであることを私は知っている多くのテーブルのいずれかが含まれていません
TABLE_CONSTRAINTS
TABLE_PRIVILEGES
TABLES
table_types
tables
だから私はこれをしませんでした見ている。
これは私がデータベースに正しく接続していない可能性があると私に信じさせてくれました。
は、これは私が知っているものです:
は- [TABLE]このデータベースに存在し、私は正確な名前が正しいことを持っています。
- データディクショナリは難しいD:\ * path * \ db.add
- データベースは、自分のコードを実行しているサーバーとは別のサーバーにあります。私はIPでそれを参照します。
- Advantageデータベースのデフォルトポートであるポート6262を接続文字列に追加しようとしましたが、これは効果がありませんでした。
- パスワードとユーザー名が正しいと確信していますが、使用しているアカウントには管理者権限がありません。
- (EDIT)アカウントには[TABLE]以上の特権があります。
- Sybaseから入手できる最新のJDBCドライバを使用しています。
- SybaseのODBCドライバを使用してこのパス、データディクショナリおよび資格情報を使用して別のマシンでシステムDSNを作成し、問題なく接続できました。
- (EDIT)[TABLE]は、データベースのデフォルトスキーマ内にあります。
何か助けていただきありがとうございます、私は何か小さいものが欠けていると確信しています。
更新:質問のタイトルを更新して問題の原因を突き止めました。
私の問題の原因を見つけるのを助けるために、以下のコメントのLuke Woodwardに謝意を表します。しかし、私はまだ解決策を見つけるのが難しいです。
以前の私は、SQL Server 2008のデータベースへの接続を確立するには
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
を使用するアプリケーションでは、この接続が正常に動作します。
DriverManagerがAdvantageドライバの代わりにSQLドライバを2番目の接続に使用しようとしているため、エラーが発生しているようです。これは、テーブルを正しく読み取ることができなくなっています。私は同様の質問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がスキーマの場合 - Select * from EMPLOYEESの代わりにHR.EMPLOYEESから*を選択します。 –
データベースは非常に単純なものであり(データが大量)、複数のスキーマで構築されていないため、デフォルトのスキーマに含まれています。私は、使用しているユーザーがテーブルを表示し、変更する権限を持っていることを確信しています。 Advantage Data Architectでは、このユーザーログインを使用してテーブルを表示/変更しています。 –