SQLServerBulkCopy gestion des erreurs

J'étudie la class SQLServerBulkCopy pour faire une insertion en bloc dans une database. Actuellement, j'utilise JDBC et quand j'essaye d'effectuer une insertion incorrecte, je peux attraper une BatchUpdateException pour découvrir quelle rangée a provoqué le problème.

Comment SQLServerBulkCopy gère-t-il les lignes d'erreur, serai-je capable de faire quelque chose de similaire?

"Comment SQLServerBulkCopy gère les lignes d'erreur"

Si .writeToServer rencontre une erreur, il renvoie l'exception renvoyée par le server, par exemple,

com.microsoft.sqlserver.jdbc.SQLServerException: violation de la contrainte PRIMARY KEY 'PK __ # tmp______3213E83F719D9EEE'. Impossible d'insert une key en double dans l'object 'dbo. # Tmp'. La valeur de la key en double est (1).

"Si j'ai 10k lignes, est-ce qu'il fait des instructions d'insertion de 10k et de commettre après chacune?"

Non, il envoie une INSERT BULK , puis envoie des lots de lignes au server en fonction de SQLServerBulkCopyOptions#setBatchSize . La taille du lot par défaut est zéro (0), ce qui signifie qu'il diffuserait efficacement toutes les lignes de 10 Ko en une fois. Pour une taille de lot supérieure à 0, il diffusera autant de lignes que nécessaire et répétera le process INSERT BULK jusqu'à ce que toutes les lignes aient été copiées.

Si une erreur est rencontrée, la documentation dit:

Dans ce premier exemple, l'opération de copy en bloc est non-transactionnelle. Tous les lots copiés jusqu'au point d'erreur sont validés; le lot contenant la key en double est annulé et l'opération de copy en bloc est arrêtée avant le traitement de tous les autres lots.

"est-ce que [le nombre de lignes réellement copiées] n'est pas disponible en java?"

Cela ne semble pas. .writeToServer renvoie void et il ne semble pas y avoir de propriété de l'object SQLServerBulkCopy pour fournir cette information.