2014-01-14 3 views
0

У меня есть файл excel с более чем 20000 row s, который имеет большой объем данных, и данные из этого файла вставляются в базу данных через java-программу.все Значения не вставлены в базу данных

Всякий раз, когда я запускаю файл, некоторые из значений пропускаются и не вставляются в базу данных.

Может кто-нибудь объяснить, почему это так?

Кроме того, после вставки более 300 значений, ORA-00933: SQL-команда, которая не правильно закончила исключение, выбрасывается.

+0

Вы делаете пакетную вставку или вставляете по одной строке за раз? Также опубликуйте исключение stacktrace и часть кода, который генерирует исключение, чтобы лучше понять, что делает ваш код. –

+0

проверьте схему, проверьте правильность и то же значение, в котором вам нужно вставить значения. – Ashish

+0

Я использую метод addBatch. – JavaFreak

ответ

2

По соображениям безопасности (и другие также) вы никогда не должны просто конкатенировать ввод в инструкцию без надлежащего выхода из ввода.

Вместо этого используйте подготовленный оператор, который позволит базе данных или драйверу позаботиться об экранировании специальных символов на вашем входе. Без экранирования вы можете получить недопустимые или даже вредоносные запросы.

Пример:

String a1Va2 = "';DROP table ata_keywords;'"; 

rs=ss.executeQuery("select keyword,ata_code,ac_model from ata_keywords where keyword='"+a1Va2+"'"); 

Это приведет к двум запросов:

select keyword,ata_code,ac_model from ata_keywords where keyword=''; 
DROP table ata_keywords; //Ooops 
'' //the last bit is ignored 

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

+0

Oracle не будет выполнять несколько операторов, подобных этому через JDBC - разделитель ';' оператора вызовет ошибку «недопустимый символ». Но использование подготовленного заявления все же лучше, и проблема с «вставкой» OP, вероятно, будет аналогичной. –

+0

@AlexPoole да, это то, что я хотел сказать: проблема OP, скорее всего, вызвана преждевременным завершением запроса ('' 'в неправильном месте). Однако это только основная проблема, и инъекция может все еще произойти, когда используются другие базы данных или драйверы, поэтому лучше не использовать такие запросы. – Thomas

+0

Да, не согласен, просто указывая, что в этом конкретном случае - с Oracle - это не риск инъекций; но это все еще ужасно, и лучше привыкнуть, чтобы это не было проблемой в других БД или других клиентах, и по всем другим причинам, которые они предпочитают в любом случае. –

0

Томас уже объяснил, что я имел в виду, SQL Injection При использовании переменных связывания в, preparedStatement мы можем избежать взлома строк запросов.

String queryString = "select keyword,ata_code,ac_model from ata_keywords where keyword = ?1"; 

PreparedStatement ss = conn.prepareStatement(queryString); 

s.setString(1,a1Va2); 

rs = ss.executeQuery(); 

Все еще, если вы когда-либо хотели, чтобы ваша версия запроса работала ..! Заменить отдельные кавычки с двойными одинарными кавычками, чтобы избежать его.

rs=ss.executeQuery("select keyword,ata_code,ac_model from ata_keywords where keyword='"+a1Va2.replace("'","''")+"'"); 
+0

Я не понимаю? 1 в queryString. – JavaFreak

+0

это переменная связывания, а u привязывает ваше строковое значение к подготовленному элементу с использованием метода setString. –

+0

Как вы привязываете его, какой SVR вводит String, который вы связываете, он идет как таковой, и поэтому запрос String, который мы отправили в conn.prepareStement(), не будет взломан. Вместо этого изменяется только значение в? 1. –

0

Если вы знаете последовательность вставленных записей, то запись проблемы будет записываться до возобновления успешных вставок. Последовательность загрузки записи попадает в ошибку и вызывает неявный откат предыдущих вставных операторов (ей), поэтому блок записей вставки пропадает. Ошибка сама по себе выглядит как отсутствующая скобка.

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