Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

Ответ
 
Опции темы
Старый 07.11.2018, 15:54   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 118
Репутация: 8
По умолчанию Не проходит 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, 17:27   #2
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,148
Репутация: 840
По умолчанию

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
insert into сразу в несколько таблиц (вложенный insert) dualtrey Помощь студентам 10 23.01.2017 19:00
Почему при указании пути через имя компа сканирование не проходит, а через IP - проходит? Oxidous Операционные системы общие вопросы 2 16.03.2016 12:00
бэкап проходит средствами sql но не проходит средствами 1с so1idsnake Помощь студентам 4 16.09.2013 08:44
LANCK Telecom:Senior Oracle Developer и Oracle Developer, Санкт-Петербург newgoodday Работа на постоянной основе - Вакансии 0 16.01.2013 18:45


20:28.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru