GetGeneratedKeys() после PreparedStatement.executeBatch()

Я хочу INSERT несколько строк с помощью PreparedStatement:

ps = con.prepareStatement(query,PreparedStatement.RETURN_GENERATED_KEYS);

for(Element e:listOfElements){
    ps.setString(1,this.col_val_1);
    ps.setString(2,this.col_val_2);
    ps.setInt(3,this.col_val_3);

    ps.addBatch();
}

ps.executeBatch();
ResultSet rs = ps.getGeneratedKeys();

В этот момент, когда я ожидаю получить PK, сгенерированный для каждого INSERT, я получаю это SQLServerException:

com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained.

Я ожидал получить ResultSet с одной строкой для каждой выполненной вставки, чтобы я мог получить каждый генерируемый PK.

Я ожидаю, что не так? Я делаю что-то неправильно? Можно ли это сделать по-другому, используя пакетное выполнение?

Ответ 1

Поддержка getGeneratedKeys() при пакетном исполнении - это реализация, определенная в соответствии со спецификацией JDBC. Скорее всего, драйвер SQL Server не поддерживает его для пакетного выполнения.

Я попытался найти явную инструкцию на сайте Microsoft, но не смог ее найти. В этом старом (2007) сообщении форума на MSDN указано, что он не поддерживается: http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/6cbf5eea-e5b9-4519-8e86-f4b65ce3f8e1