2016-09-06 2 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)); 
} 

.. 그리고이 출력을 얻을 : 명확하게 시스템 테이블처럼 보이는, 그리고 데이터베이스 I에있는 것으로 알고있는 많은 테이블 중 하나를 포함하지 않는

TABLE_CONSTRAINTS 
TABLE_PRIVILEGES 
TABLES 
table_types 
tables 

을 그래서 이런 짓을 보고있다.

이로 인해 나는 데이터베이스에 제대로 연결하지 못하고 있다고 생각하게되었습니다.

이 내가 아는 것입니다 :

  • [표]이 데이터베이스에 존재하고 내가 정확한 이름이 올바른지 가지고.
  • 데이터 사전은 도전적입니다. D : \ * path * \ db.add
  • 데이터베이스가 내 코드를 실행하고있는 서버와 다른 서버에 있습니다. 나는 그것을 IP로 언급한다.
  • Advantage 데이터베이스의 기본 포트 인 6262 포트를 연결 문자열에 추가하려고 시도했지만 아무런 영향이 없었습니다.
  • 비밀번호와 사용자 이름이 정확하다는 확신이 있습니다. 사용하고있는 계정에 관리자 권한이 없습니다.
  • (EDIT) 계정에는 [TABLE] 이상의 모든 권한이 있습니다.
  • Sybase에서 제공하는 최신 JDBC 드라이버를 사용하고 있습니다.
  • Sybase의 ODBC 드라이버를 사용하여이 경로, 데이터 사전 및 자격 증명을 사용하는 다른 시스템에서 시스템 DSN을 만들었으며 문제없이 연결할 수있었습니다.
  • (EDIT) [TABLE]은 데이터베이스의 기본 스키마 내에 있습니다.

제공 할 수있는 도움에 감사드립니다. 나는 작은 것을 놓치고 있다고 확신합니다.


업데이트 : 문제의 원인을 찾았으니 이제 문제를 더 잘 반영하도록 질문 제목을 업데이트했습니다.

내 문제의 출처를 찾도록 도와 주신 Luke Woodward에게 아래 의견에 감사드립니다. 나는 아직도 해결책을 찾는 데 어려움을 겪고있다.이전 응용 프로그램의

가 나는 SQL 서버 2008 데이터베이스에 대한 연결을 설정하려면

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 

을 사용하여,이 연결은 잘 작동합니다.

DriverManager가 두 번째 연결을 위해 Advantage 드라이버 대신 SQL 드라이버를 사용하려고하기 때문에 오류가 발생하는 것으로 보입니다. 이로 인해 테이블을 제대로 읽을 수 없습니다. 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

나는이 문제점을 발견했으며 정성을 다해 모든 시간을 낭비하는 것처럼 느낀다.

솔루션 찾기를 도와주는 Luke Woodward 크레디트.

두 데이터베이스에 연결하는 데 사용하는 클래스를 빌드했을 때 동일한 함수가 많이 있다는 것을 알았으므로 해당 함수를 사용하여 부모 클래스를 작성한 다음 부모를 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 –