Хорошо, я считаю, что проблема в том, что я не получаю надлежащего подключения к базе данных, но я не уверен.База данных 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, поэтому я должен одновременно открыть оба соединения.
Так что теперь этот вопрос стал, как я могу справиться с этим конфликтом с драйвером, чтобы одновременно подключаться к обоим базам данных в одном приложении?
Имеет ли имя пользователя, которое вы используете, разрешение на просмотр таблицы? – LeHill
Какая схема существует в вашей таблице? Какой пользователь вы регистрируетесь? Вероятно, вам не хватает владельца.Если HR - это схема - выберите * из HR.EMPLOYEES вместо Select * from EMPLOYEES. –
База данных довольно простая (просто с большим количеством данных) и не была построена с использованием нескольких схем, поэтому она находится в схеме по умолчанию. Я уверен, что пользователь, которого я использую, имеет разрешения на просмотр таблицы, а также ее изменение. Я использую этот пользовательский логин все время в Advantage Data Architect для просмотра/изменения таблиц. –