Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Java Базы данных (JDBC, JPA, Hibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2018, 14:54   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Не проходит insert в Oracle DB

Доброго времени суток.

Уже 2 дня бьюсь над следующей проблемой. Не могу записать данные в таблицу БД Oracle.
Среда разработки Netbeans 8.2. JDK 1.8. Всё имеет 64 битную разрядность. ПК с 64 битной ОС Windows 7.
На машине стоит Oracle Client 10.2. Клиент 32 битный. Переустанавливать его не хочу, так как рабочий ПК, и установлен клиент не мной. Кроме того, его используют некоторые приложения, написанные на C++.
Для подключения использую драйвер ojdbc14.jar, что лежит в папке с установленным клиентом. Пробовал и другие драйверы, ничего не помогает. Скачивал ojdbc6.jar, тоже не работает.
Извиняюсь за тупость, но разницы между драйверами не понимаю. Единственное, что понял, так это то, что есть чисто драйвера, написанные на java, а есть типа прослойки, работающей через драйвер, написанный на С.
И так много воды. В чём суть проблемы. А проблема в том, что когда я подключаюсь вот так DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
con = DriverManager.getConnection("jdbc racle:thin:@" + host + ":" + port + ":" + dataBaseName,userName,password);// dataBaseName – подаю SID
То никаких исключений не выбрасывается. Прекрасно работает SELECT. INSERT тоже вроде как отрабатывает, возвращает единицу, что должно говорить о том, что одна строка записана. Но, не тут-то было. Когда через OraDeveloper захожу в БД, то новые записи отсутствуют. Никаких админских ограничений нет, проверял напрямую через создание sql-запроса в OraDeveloper. Всё нормально проходит. То есть, проблема либо в моём кривонаписанном коде, либо в драйверах.

Когда подключаюсь вот так
con = DriverManager.getConnection("jdbc racleci8:@TNSNAMES.ora",userName, password);
То выбрасывается исключение

Оно понятно. 64 битная JVM не будет работать с 32 битными dll.
Выкладываю вариант класса, где происходит подключение и попытка записи в БД.


package ExchangeUtil;

import java.io.*;
import java.sql.*;


public class WriteTransportFilesDB {
private DataBaseData dataBaseData;
private String host;
private String dataBaseName;
private String userName;
private String password;
private int port;

private String typeDB;

private Connection con = null;

//private final String sql = "INSERT INTO rtri (NOM_KAN,BEG_dat,End_dat, Kol_kdg, seans, object, nip, Rts1, Rts2, Vid_izm, TRI_MAS) VALUES(?,?,?,?,?,?,?,?,?,?,?)";
private final String sql = "INSERT INTO RTRI (NOM_KAN) VALUES(?)";


public WriteTransportFilesDB(DataBaseData dataBaseData, String host, String dataBaseName, String userName, String password, int port, String typeDB) {
this.dataBaseData = dataBaseData;
this.host = host;
this.dataBaseName = dataBaseName;
this.userName = userName;
this.password = password;
this.port = port;
this.typeDB = typeDB;
}

public boolean connect(){

switch(typeDB){
case "oracle":

try {

//Class.forName("oracle.jdbc.driver.O racleDriver");


// OracleDataSource ods = new OracleDataSource();
// ods.setDriverType("thin");
// ods.setServerName(host);
// ods.setDatabaseName(dataBaseName);
// ods.setPortNumber(port);
// ods.setUser(userName);
// ods.setPassword(password);
//
// con = ods.getConnection();



DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
con = DriverManager.getConnection("jdbc racle:thin:@" + host + ":" + port + ":" + dataBaseName,userName,password);

//con = DriverManager.getConnection("jdbc racleci8:@TNSNAMES.ora",userName, password);


con.setAutoCommit(false);



con.setReadOnly(false);

//pStatement = con.prepareStatement(sql,ResultSet. TYPE_SCROLL_SENSITIVE,ResultSet.CON CUR_UPDATABLE);

//pStatement = con.prepareStatement(sql);


DatabaseMetaData dbmd = con.getMetaData();

System.out.println("dbName: " + dbmd.getDatabaseProductName());
System.out.println("driverVersion: " + dbmd.getDriverVersion());


} catch (Exception e) {
System.out.println("Не удалось создать oracle соединение: " + e.getMessage());
return false;
}

break;
default:
return false;
}

return true;
}

public boolean isClosed() throws SQLException{
return con.isClosed();
}

public int insertDataRTRI(){

File file = null;
int retVal = 0;

try(PreparedStatement ps = con.prepareStatement(sql);BufferedI nputStream bis = new BufferedInputStream(new FileInputStream(file = new File("temp/final_" + dataBaseData.getType() + "/" + dataBaseData.getName())))){

System.out.println("OK!");


ps.setString(1, String.valueOf(dataBaseData.getNOM_ KAN()));
// pStatement.setDate(2,new Date(dataBaseData.getBEG_dat().getT imeInMillis()),dataBaseData.getBEG_ dat());
// pStatement.setDate(3,new Date(dataBaseData.getEnd_dat().getT imeInMillis()),dataBaseData.getEnd_ dat());
// pStatement.setString(4, String.valueOf(dataBaseData.getKol_ kdg()));
// pStatement.setString(5, String.valueOf(dataBaseData.getSean s()));
// pStatement.setString(6, String.valueOf(dataBaseData.getObje ct()));
// pStatement.setString(7, String.valueOf(dataBaseData.getNip( )));
// pStatement.setString(8, String.valueOf(dataBaseData.getRts1 ()));
// pStatement.setString(9, String.valueOf(dataBaseData.getRts2 ()));
// pStatement.setString(10, dataBaseData.getVid_izm());
// pStatement.setBinaryStream(11, bis,(int)file.length());

retVal = ps.executeUpdate();



//con.commit();
//pStatement.close();

// ResultSet rs = pStatement.executeQuery("SELECT * FROM rtri ORDER BY dwrd DESC");
//
// while(rs.next()) System.out.println("tbl: " + rs.getString("BEG_DAT"));
// ////////////-----------------------
//
// pStatement.executeUpdate("INSERT INTO rtri(LEN_ZAG) VALUES(777)");
//
con.commit();
//
//pStatement.closeOnCompletion();
//
// con.close();


System.out.println("warn: " + ps.getWarnings());


} catch (Exception e) {

retVal = 0;
}



return retVal;
}

}

Что мне делать?
Переустанавливать Oracle Client не хочется. Среду с JVM тоже не хотелось бы.
Как может быть так, что SELECT проходит, а INSERT нет?

PS
Сорри, что одним текстом. Со смартфона отправил.
ivan.tiran вне форума Ответить с цитированием
Старый 07.11.2018, 16:27   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от ivan.tiran Посмотреть сообщение
Прекрасно работает SELECT. INSERT тоже вроде как отрабатывает, возвращает единицу, что должно говорить о том, что одна строка записана. Но, не тут-то было. Когда через OraDeveloper захожу в БД, то новые записи отсутствуют.
Обычно такая ситуация означает, что не выполнен commit транзакции.
Разбирайтесь, как сделать его явно либо автоматом
Black Fregat вне форума Ответить с цитированием
Старый 07.11.2018, 16:31   #3
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Обычно такая ситуация означает, что не выполнен commit транзакции.
Разбирайтесь, как сделать его явно либо автоматом
Я отключил коммит, и после инсерта его выполняю. Так же пробовал автокоммит в тру ставить. Не работает.
ivan.tiran вне форума Ответить с цитированием
Старый 07.11.2018, 17:01   #4
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

ExecuteUpdate возвращает 1. А просто execute - false. Как-то странно...
ivan.tiran вне форума Ответить с цитированием
Старый 07.11.2018, 17:27   #5
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Может Касперский блокирует? Не могу проверить, всё запаролено.
ivan.tiran вне форума Ответить с цитированием
Старый 08.11.2018, 09:36   #6
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Ошибка была очень тупой. Я подключался по одному ip, а в tnsnames был другой ip для этого sid. OraDeveloper брал ip из tnsnames. Я работал с разными бд... Сорри
ivan.tiran вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
insert into сразу в несколько таблиц (вложенный insert) dualtrey Помощь студентам 10 23.01.2017 18:00
Почему при указании пути через имя компа сканирование не проходит, а через IP - проходит? Oxidous Операционные системы общие вопросы 2 16.03.2016 11:00
бэкап проходит средствами sql но не проходит средствами 1с so1idsnake Помощь студентам 4 16.09.2013 08:44