Tentar excluir um excel em uso no SSIS

Recentemente tive uma briga chata com um processo que deveria ser relativamente simples no SSIS ( Integration Service), o processo consistia em tentar mover ou excluir um arquivo do excel, para um outra pasta após realizar um carga dos dados contidos neste mesmo excel.

Ocorre que dentro da package onde eu estava realizando a carga deste arquivo excel, sempre que se tentava realizar a excluisão ou move-lo de lugar, resultava-se a mensagem:

“[SSIS Errors] The process cannot access the file because it is being used by another process”

Eu tive que brigar alguns dias com isso, várias opiniões de diversos foruns, alguns falando que utilizando outros modelos de conexão com excel funcionava normalmente, e o modelo de conexão que estou utilizando é o .Net Providers for OleDB, mas especificamente Microsoft Office 12.0 Access Database Engine OLE DB Provider.

Outros diziam que se deveria trabalhar primeiro com a cópia do arquivo e o processo de exclusão ser realizado em outra package, pois bem. Tentei tudo isso e sempre retornava a mesma mensagem.

A única solução que no meu caso resolveu, e também requereu dividir o processo em 2 packages.

A primeira package eu passo um parametro com um id de um processo para a próxima package que irá realizar a carga de diversos arquivos de excel em um determinado diretório. Nesta pacakage de carga, eu gravo todos os arquivos carregados em uma tabela, e os copio para o diretório que desejo (pois copiar não dá erro). E aí vem o truque de mestre, sempre que eu termino de carregar cada arquivo, eu coloco uma Script Task onde eu implemento um script C# para dar um release na conexão com o arquivo, e Gotcha. Ao voltar para a package principal, e sim é necessário que seja realizado a exclusão fora da package de carga, agora basta percorrer a minha tabela com todos os arquivos que foram carregados naquele processo e excluir um a um.

A Chave para isso é:

A exclusão não pode ser realizada na mesma package.

E segundo, após a carga de cada arquivo excel, deve-se fazer o release da conexão, com uma script Task semelhante a abaixo :

object rawConnection = Dts.Connections[“arquivo”].AcquireConnection(Dts.Transaction);
Dts.Connections[“arquivo”].ReleaseConnection(rawConnection);

Deixe um comentário

Translate »