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);

Erro informando path string no SSIS

Um problema muito comum em aplicações, e digo isso porque não se trata apenas de um problema restrito a ferramenta Sql Server Integration Service (SSIS), mas também lembro-me de me deparar com o mesmo problema quando programava em Delphi e PHP  para ambientes Windows Servers, diferentemente dos outros windows, sempre que se desejava informar um caminho físico de uma pasta no Servidor, não bastava informar algo do tipo

c:\pasta\arquivo.txt

Para ambientes windows server o correto seria:

c:\\pasta\\arquivo.txt

Hoje tentando atribuir um caminho a uma variável no SSIS, tive um erro conforme  conforme a imagem:

Por intuição descrobri que a composição de strings é semelhante no SSIS dentro de expressions, a diversas linguagens de programação. E é simplesmente resolvido passando a colocar 2 barras invertidas ao invés de uma única barra invertida. No SSIS sempre que se deseja passar um caracter que funcionaria como um caracter de fechamento, utiliza-se barra invertida (\) exemplo se eu quiser atribuir a string:  ela disse:- Ele é “forte”:

@str = “ela disse: – Ele é \”forte\”

Observe que sem a barra invertida, as aspas duplas funcionariam como final de string. Eis o porque da diferenciação da barra invertida dentro de strings, ela tem um tratamento deferenciado dos demais caracteres, ela funciona como um caracter de controle dentro de strings, para validar qualquer caracter seguinte como texto e não um modificador seja ele aspas duplas(“) ou a própria barra invertida (\), assim sendo se vc quiser passar uma barra invertida dentro de um string, deverá colocar 2 barras inverdidas ao invés de uma única, pois a primeira barra invertida irá funcionar como caracter de controle para dizer que a próxima barra invertida deve ser considerada como texto.

 

Translate »