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'. 

Я знаю, что [Таблица] существует, поэтому я, наконец, попытаюсь сделать тест, чтобы узнать, действительно ли я получаю видимость таблиц, которые я ищу для. Так что я сделал это:

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 

Который явно выглядит как системные таблицы, и не содержит какие-либо из множества таблиц, я знаю, что в I баз данных я смотрю.

Это привело меня к мысли, что, возможно, я неправильно подключаюсь к базе данных.

Это то, что я знаю:

  • [TABLE] существует в этой базе данных, и что у меня есть точное название правильно.
  • Словарь данных вызывающе D: \ * path * \ db.add
  • База данных находится на другом сервере, чем я запускаю свой код. Я ссылаюсь на него по IP.
  • Я попытался добавить порт 6262, порт по умолчанию для баз данных Advantage, в строку подключения, и это не повлияло.
  • Я уверен, что получаю пароль и имя пользователя правильно, учетная запись, которую я использую, не имеет прав администратора.
  • (EDIT) У учетной записи FULL привилегии более [TABLE].
  • Я использую самый последний драйвер JDBC, доступный от Sybase.
  • Я создал систему DSN на другой машине, используя этот путь, словарь данных и учетные данные, используя драйвер ODBC Sybase и смог подключиться без проблем.
  • (EDIT) [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 вместо Select * from 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; 
} 

Для более проверить мою простую консоль на основе (по-прежнему необходима тренировку для завершения) атм, но соединение совершенно в этом проекте. Ссылка здесь. https://github.com/SaugatBhattarai/atm/blob/master/DbPreparedStatement.java

+0

Однако я ценю ваш ответ, я боюсь, что это не мое решение. Метод, по которому ваше использование, похоже, полагается на построитель строк соединений внутри DriverManager, кроме того, что это похоже на то, что я использую. Я протестировал это так, чтобы быть уверенным, прежде чем уволить его, и получил то же исключение. Кажется, ваш проект работал с этим кодом для MySQL. По моим наблюдениям SQL имеет несколько иные правила, чем Advantage. Этот же проект требует подключения к базе данных SQL Server 2008, и я могу подключиться к нему без проблем. –

+0

Этот ответ не будет отдаленно полезным для вопрошающего. Они задали вопрос о Sybase SQLAdvantage и что вы делаете? Вы предоставляете образец кода для подключения к MySQL. Если вы этого не осознали, это совершенно другая база данных. -1 –

Смежные вопросы