Java sql sqlexception исключение ввода вывода

java.sql.SQLException: исключение ввода-вывода: сетевой адаптер не может установить соединение?

Привет, я пытаюсь подключиться к базе данных Oracle 11g, используя ojdbc14 jar на eclipse kepler с java 8 на windows 7 os. Но когда я запускаю код, я получаю следующую ошибку. Вот мои и ошибки соответственно.

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Scanner; public class JDBCExample < public static void main(String[] args) < Scanner sc = new Scanner(System.in); System.out.println("enter your databse details"); System.out.println("user name"); String uName = sc.next(); System.out.println("password"); String pWord = sc.next(); try < Class.forName("oracle.jdbc.driver.OracleDriver"); >catch (ClassNotFoundException e) < e.printStackTrace(); >Connection conn = null; try < conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger"); // jdbc:oracle:thin:@server:1521:xe >catch (SQLException e) < e.printStackTrace(); >if (conn != null) < System.out.println("Successfully connected to DB"); >else < System.out.println("Failed to connect to DB"); >> > 

Ошибки заключаются в следующем. java.sql.SQLException: Io exception: The Network Adapter could not establish the connection at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387) at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:414) at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:165) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at JDBCExample.main(JDBCExample.java:23)

2 ответа

Из нашего разговора вы можете установить telnet и подключиться к базе данных из командной строки. Пройдя через jdbcurl, я обнаружил ошибку.

localhost: 1521 / xe должен быть localhost: 1521: xe , если xe является SID для вашей базы данных.

conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521/xe", "scott", "tiger"); 
conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger"); 

Вам не хватает импорта oracle.jdbc.driver.OracleDriver

Источник

Работа с ошибками

При работе Java-программы могут возникать ошибки. При работе с базой данных ошибки будут возникать. Все дело лишь в том, какие из них ты можешь предсказать и предложить адекватное решение.

Первая большая группа ошибок будет тебя ждать при выполнении этой строчки:

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret"); 

Что вас тут может ожидать?

Ошибка 1. Драйвер не найден.

Если ты получил ошибку “No suitable driver found for …” это значит, что DriverManager не смог понять какой тип СУБД скрывается за вашим URL. Например, ты написал jdbc_mysql: вместо jdbc:mysql:

Ошибка 2. Ошибка соединения.

Если ты допустил ошибку в имени хоста, то, скорее всего, получишь сообщение типа “No such host is known” или “Communications link failure”.

Ошибка 3. Неверно указано имя базы данных.

Если ты допустил опечатку в имени базы данных или подключаешься к другому серверу, где ее нет, то получишь сообщение типа “Unknown database ‘supershop3’” .

Ошибка 4. Неверный логин или пароль.

Если ты забыл пароль от базы или неверно его указал, то, скорее всего, получишь сообщение типа “Access denied for user ‘root’@’localhost’ (using password: YES)” .

Читайте также:  Style disabled buttons css

SQL Exception

Если соединение с базой все же установилось, то дальше будет интереснее. На случай ошибок при работе с базой у JDBC есть специальные исключение – java.sql.SQLException. А также несколько ее разновидностей.

У этого исключения есть только один дополнительный метод (в сравнении с классом Exception) – это метод getSQLState(), который возвращает код состояния (строку), который вернул ему SQL-сервер. Обработка ошибок при этом выглядит так:

 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret"); try < int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’"); >catch (SQLException ex) < // Если таблица не существует if (ex.getSQLState().compareTo("X0Y32") != 0) < throw ex; >> finally

Кодов ошибок при этом несколько сотен. Полный список можешь посмотреть тут.

Но иногда коды ошибок помогают JDBC понять ошибку лучше и тогда он создает не просто SQLException, а специализированные SQLException:

BatchUpdateException Ошибка во время группового запроса
DataTruncation Часто возникает при обрезании длинных данных
SQLClientInfoException Клиент передал параметры, которые не могут быть установлены у соединения: Connection
SQLDataException Ошибка с данными, детали зависят от типа СУБД
SQLException Ошибка доступа к базе или другие общие ошибки
SQLFeatureNotSupportedException СУБД не поддерживает данную функциональность
SQLIntegrityConstraintViolationException Все ошибки с для SQLState ==22
SQLInvalidAuthorizationSpecException Ошибка доступа и/или авторизации
SQLNonTransientConnectionException Все ошибки с для SQLState ==08
SQLRecoverableException Ошибка есть, но ее можно исправить при вмешательстве application
SQLSyntaxErrorException Ошибка в синтаксисе запроса
SQLTimeoutException Запрос выполнялся слишком долго
SQLTransactionRollbackException Ошибка во время отката транзакции
SQLWarning Предупреждение, которое выслала СУБД

Примеры ошибок

Если ошибка произошла на этапе работы серверного приложения, то обычно ее можно только логировать и потом подробнее с ней разбираться. А вот если она произошла во время работы приложения на компьютере программиста, то тут тебе нужно тщательно исследовать причину этого.

Есть два самых больших классов ошибок при работе с базой данных:

Ошибка в тексте запроса может возникать очень часто. Запрос может быть очень длинным, содержать несколько таблиц (объединенных через JOIN) и подзапросов (SUBSELECT). Найти ошибку в таком запросе непросто. Кроме того, запросы часто склеиваются из частей, туда добавляются данные.

Самая первая ошибка, о которой тебе следует знать, — это SQLSyntaxErrorException . Такая ошибка обычно значит, что у тебя опечатка в теле запроса.

Возьмем наш любимый пример:

 ResultSet results = statement.executeQuery("SELECT Count(*) FROM user"); results.next(); int count = results.getInt(1); 

И “случайно” сотрем звездочку в теле запроса:

 ResultSet results = statement.executeQuery("SELECT Count() FROM user"); results.next(); int count = results.getInt(1); 

Тогда мы получим исключение:

Exception in thread "main" java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) 

SQL-сервер пишет нам, что перед FROM была синтаксическая ошибка.

Читайте также:  Html image height width alt

Внимательно смотрим на запрос и думаем. Если ничего не приходит в голову, а такое бывает очень часто, то нужно попросить кого-нибудь посмотреть, что не так.

Еще одна популярная ошибка — неправильная работа с ResultSet — результатом запроса. Допустим ты забыл, что перед чтением данных “текущая строка” объекта ResultSet стоит перед первой строкой, то у тебя будет такой код:

 ResultSet results = statement.executeQuery("SELECT Count(*) FROM user"); // results.next(); int count = results.getInt(1); 
 2012 12:55:48 AM jButton5ActionPerformed SEVERE: null java.sql.SQLException: Before start of result set at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841) at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650) at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570) 

Внимательно смотрим на ошибку и думаем. Затем гуглим и находим пару примеров и пытаемся понять решение.

Источник

JDBC – обработка исключений

Обработка исключений позволяет обрабатывать исключительные условия, такие как ошибки, определенные программой, контролируемым образом.

При возникновении условия исключения возникает исключение. Термин «выброшенный» означает, что выполнение текущей программы прекращается, и элемент управления перенаправляется в ближайшее применимое предложение catch. Если подходящего предложения catch не существует, выполнение программы заканчивается.

Обработка исключений JDBC очень похожа на обработку исключений Java, но для JDBC наиболее распространенным исключением, с которым вы будете иметь дело, является java.sql.SQLException.

SQLException Методы

Исключение SQLE может возникать как в драйвере, так и в базе данных. Когда возникает такое исключение, объект типа SQLException будет передан предложению catch.

Переданный объект SQLException имеет следующие доступные методы для получения дополнительной информации об исключении:

метод Описание
getErrorCode () Получает номер ошибки, связанный с исключением.
getMessage () Получает сообщение об ошибке драйвера JDBC для ошибки, обработанной драйвером, или получает номер ошибки Oracle и сообщение об ошибке базы данных.
getSQLState () Получает строку состояния XOPEN SQL. Для ошибки драйвера JDBC из этого метода не возвращается никакой полезной информации. В случае ошибки базы данных возвращается пятизначный код XOPEN SQLstate. Этот метод может вернуть ноль.
getNextException () Получает следующий объект Exception в цепочке исключений.
printStackTrace () Печатает текущее исключение или throwable, и оно возвращается в стандартный поток ошибок.
printStackTrace (PrintStream s) Печатает этот метод и его обратную трассировку в указанном вами потоке печати.
printStackTrace (PrintWriter w) Печатает этот метатель, и он возвращается к указанному вами устройству печати.

Используя информацию, доступную из объекта Exception, вы можете перехватить исключение и продолжить свою программу соответствующим образом. Вот общая форма блока try –

try  // Your risky code goes between these curly braces. > catch(Exception ex)  // Your exception handling code goes between these // curly braces, similar to the exception clause // in a PL/SQL block. > finally  // Your must-always-be-executed code goes between these // curly braces. Like closing database connection. >

пример

Изучите следующий пример кода, чтобы понять использование блоков try …. catch … finally .

//STEP 1. Import required packages import java.sql.*; public class JDBCExample  // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // Database credentials static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args)  Connection conn = null; try //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database. "); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Execute a query System.out.println("Creating statement. "); Statement stmt = conn.createStatement(); String sql; sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); //STEP 5: Extract data from result set while(rs.next()) //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); > //STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close(); >catch(SQLException se) //Handle errors for JDBC se.printStackTrace(); >catch(Exception e) //Handle errors for Class.forName e.printStackTrace(); >finally //finally block used to close resources try if(conn!=null) conn.close(); >catch(SQLException se) se.printStackTrace(); >//end finally try >//end try System.out.println("Goodbye!"); >//end main >//end JDBCExample

Теперь давайте скомпилируем приведенный выше пример следующим образом:

Когда вы запускаете JDBCExample , он выдает следующий результат, если нет проблем, в противном случае будет обнаружена соответствующая ошибка и отобразится сообщение об ошибке –

C:\>java JDBCExample Connecting to database. Creating statement. ID: 100, Age: 18, First: Zara, Last: Ali ID: 101, Age: 25, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal C:\>

Попробуйте приведенный выше пример, передав неправильное имя базы данных или неправильное имя пользователя или пароль, и проверьте результат.

Источник

Оцените статью