Прекратить чтение в Excel при обнаружении пустых строк - PullRequest
1 голос
/ 10 января 2020

В настоящее время у меня есть программа, которая читает файл 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 ()), если набор результатов возвращается пустым.

...