В настоящее время у меня есть программа, которая читает файл Excel и обрабатывает данные на каждом листе с помощью итераторов, вставляя каждую строку в базу данных. Когда я собрал и протестировал программу с файлом Excel, который мне предоставили, все работало точно так, как я ожидал. Я передал программу на наш рабочий сервер, и теперь мы обнаружили, что определенный файл заставляет программу выбросить
SQLServerException: Violation of PRIMARY KEY constraint 'PK_V2Product'. Cannot insert duplicate key in object 'dbo.V2Product'. The duplicate key value is ().
Насколько я понимаю,
Значение дублированного ключа: ()
означает, что значение, устанавливаемое для первичного ключа, является пустой строкой. Это говорит мне о том, что Итератор передал строки с осязаемыми данными и нашел строки, в которых есть пустые строковые значения. Помимо чего-то простого / хакерского, такого как реализация следующего:
while(iterator.hasNext(){
//Iterator runs through, building the object
//String value = ""; //Primary Key, gets set in the workflow based on column name
...
if(value == null || value.equals("null") || value.equals("")){
continue;
}
...
//Would insert data at this point if the primary key field is not null
}
, есть ли способ определить, могут ли остальные части листа содержать строки со столбцами, содержащими пустые строки, и завершить итерацию? Или здесь лучше всего разрешить итератору проходить по строкам и строкам пустых строк, пока мы не достигнем максимального числа строк, которое может иметь .xlsx? Можно ли создать счетчик и реализовать условие, при котором, если счетчик достигнет значения 20, считать оставшуюся часть листа пустой и сломать итератор l oop, не вызывая каких-либо непреднамеренных побочных эффектов?
Немного информации о процессе INSERT, который мы используем:
preparedStatement = connection.prepareStatement("SELECT * FROM Table WHERE PrimaryKey = ?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
preparedStatement.setString(1, value);
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE
позволяет нам либо обновить существующий запишите или вставьте новый (resultSet.moveToInsertRow ()), если набор результатов возвращается пустым.