Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como fazer uma integração com FTP e listar, enviar (upload) e baixar (download) arquivos utilizando o CLR (C#)

Tempo de Leitura: 15 minutos

Olá pessoal,
Boa tarde!

Neste post, vou falar novamente sobre o CLR (C#), demonstrando mais uma utilidade desse poderoso recurso do SQL Server, que é a integração entre o banco de dados e servidores FTP, seja para baixar (download) ou subir (upload) arquivos entre uma pasta local ou da sua rede e o servidor FTP.

Esse recurso é especialmente útil quando você precisar integrações com outras empresas, onde você precisa exportar dados e disponibilizá-los em um FTP externo de outra empresa ou importar arquivos de um FTP e importar para a sua rede ou para o seu banco de dados.

Para retornar mensagens de alerta e mensagens de erro do CLR para o banco de dados, utilizo a classe Retorno, que está disponível no post SQL Server – Como enviar avisos e mensagens de erro para o banco pelo CLR (C#) e é uma dependência dessa classe de FTP.

Em todas as rotinas, coloquei um “retry” de até 10 tentativas em casos de falha de conexão ou timeout, de forma que a sua rotina não apresente falha por alguma instabilidade da rede (isso já me ajudou MUITO).

Caso você não conheça o CLR ou não saiba por onde começar, veja mais acessando o post Introdução ao SQL CLR (Common Language Runtime) no SQL Server.

Classe Base – FTPControle.cs

Visualizar mais detalhes, exemplos de uso e código-fonte
Essa classe FTPControle é a classe base desse post, pois todas as Procedures e Functions desse post, necessitam dessa classe para funcionar. A ideia é colocar toda a lógica do controle do FTP nessa classe base, e as procedures e functions apenas utilizam os métodos dessa classe.

Apesar do código ser bem grande, ela não é uma classe complexa, e pode ser facilmente compreendida.

Como listar arquivos de um FTP pelo SQL Server

Visualizar mais detalhes, exemplos de uso e código-fonte
Através da stored procedure abaixo, agora é possível listar todos os arquivos e diretórios presentes em um servidor FTP. Essa informação será muito útil para identificar se um arquivo realmente foi enviado para o servidor ou mesmo para listar os arquivos que existem em um diretório para baixá-los depois.

O parâmetro filtro permite informar o nome do arquivo que se desejar filtrar ou utilizar um Wildcard para retornar apenas os arquivos que atendam ao critério informado (Ex: “*” retorna todos os arquivos, “*.txt” retorna todos os arquivos terminados com .txt, etc..)

Exemplo de uso:
microsoft-sql-server-clr-integration-with-ftp-list-files-and-directories

Código-fonte:

Função para listar arquivos de um FTP pelo SQL Server

Visualizar mais detalhes, exemplos de uso e código-fonte
Apesar de já ter demonstrado como listar arquivos, essa função do tipo tabular (table-valued) permite identificar uma série de informações adicionais sobre os arquivos e diretórios do servidor FTP, como data de criação, tamanho, permissões, etc.

Além disso, ela pode ser utilizada facilmente para filtrar com WHERE, utilizar JOINS, ORDER BY, SELECT * INTO #Tabela, etc, dando muito mais flexibilidade na sua utilização em relação à Stored Procedure anterior.

Exemplo de uso:
microsoft-sql-server-clr-integration-with-ftp-function-to-list-files-and-directories

Código-fonte:

Como baixar um arquivo de um servidor FTP pelo SQL Server

Visualizar mais detalhes, exemplos de uso e código-fonte
Utilizando essa Stored Procedure, você pode facilmente baixar um arquivo específico ou vários arquivos utilizando expressões regulares, conforme vou demonstrar abaixo.

Um parâmetro especialmente útil, é o @apagarRemoto, que quando é informado o valor “1”, realiza o download dos arquivos que atendem aos critérios dos filtros informados e, logo em seguida, apaga esses arquivos do servidor FTP.

Exemplos de uso:

Baixando o arquivo "about.php"

Baixando o arquivo “about.php”

Fazendo o download de múltiplos arquivos utilizando LIKE

Fazendo o download de múltiplos arquivos utilizando filtros Wildcard

Resultado final com os arquivos baixados do FTP

Resultado final com os arquivos baixados do FTP

Código-fonte: