2016-09-06 12 views
2

[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にデータを追加して、両方の接続を同時に開く必要があります。

この質問は今ではどのようにしてこのドライバの競合に対処するので、同じアプリケーション内の両方のデータベースに同時に接続できますか?

+0

使用しているユーザー名には表を表示する権限がありますか? – LeHill

+0

あなたのテーブルはどのスキーマにありますか?どんなユーザーでログインしていますか?あなたはおそらく所有者を逃しています。HRがスキーマの場合 - Select * from EMPLOYEESの代わりにHR.EMPLOYEESから*を選択します。 –

+0

データベースは非常に単純なものであり(データが大量)、複数のスキーマで構築されていないため、デフォルトのスキーマに含まれています。私は、使用しているユーザーがテーブルを表示し、変更する権限を持っていることを確信しています。 Advantage Data Architectでは、このユーザーログインを使用してテーブルを表示/変更しています。 –

答えて

0

私はこの問題を発見しました。私はあなたの時間を無駄にしているかのように正直に感じます。

ルーク・ウッドワード私は解決策を見つけるのを助けてくれたと信じています。

2つのデータベースに接続するために使用するクラスを作成したとき、同じ関数の多くを共有することが分かっていたので、これらの関数で親クラスを作成して親を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; 
} 

気圧(まだ完了してトレーニングする必要があります)が、接続は、このプロジェクトに最適です。ここにリンクがあります。 https://github.com/SaugatBhattarai/atm/blob/master/DbPreparedStatement.java

+0

しかし私はあなたの答えを感謝します、私はこれが私の解決策ではないことを恐れています。使用方法が、DriverManagerの内部の接続文字列ビルダーに依存していると思われる方法以外は、使用しているものとほとんど同じです。私はこのようにしてテストしました。私はそれを解雇する前に確かめて、同じ例外がありました。あなたのプロジェクトは、MySQL用のこのコードで動作しました。私の所見から、SQLにはAdvantageとは少し違うルールがあります。この同じプロジェクトでは、SQL Server 2008データベースに接続する必要があり、問題なく接続できます。 –

+0

この回答は質問者にとって遠隔には役立ちません。 Sybase SQLAdvantageに関する質問がありましたが、あなたは何をしていますか? MySQLに接続するための汎用コードサンプルを提供します。あなたがそれを実現していない場合は、まったく別のデータベースです。 -1 –

関連する問題