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

Post Views 3,976 views
Reading time 15 minutes

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:

Como enviar um arquivo para um servidor FTP pelo SQL Server

Visualizar mais detalhes, exemplos de uso e código-fonte
Utilizando essa Stored Procedure, você pode realizar o envio (upload) de arquivos do seu servidor local ou de arquivos que estão em caminhos de rede para um servidor FTP.

Novamente, a SP permite especificar o nome do arquivo no parâmetro @filtro para enviar um arquivo específico, ou utilizar wildcards para realizar filtros em nomes de arquivos e enviar vários arquivos em uma única execução da Stored Procedure.

Exemplo de uso:

Enviando todos os arquivos com extensão ".txt" para o servidor FTP

Enviando todos os arquivos com extensão “.txt” para o servidor FTP

Código-fonte:

Como criar um diretório em um servidor FTP pelo SQL Server

Visualizar mais detalhes, exemplos de uso e código-fonte
Essa Stored Procedure tem como finalidade, permitir a criação de diretórios em um servidor FTP. Isso é muito importante, porque se você precisar subir arquivos em um novo diretório, informar esse diretório na hora de realizar o upload, sem tê-lo criado antes, irá causar uma mensagem de erro.

Utilizando as funções de listar arquivos e diretórios, é possível identificar se o diretório desejado existe ou não, e caso não exista, criá-lo utilizando essa SP.

Exemplo de uso:
microsoft-sql-server-clr-integration-with-ftp-how-to-create-diretory

Código-fonte:

Como apagar um arquivo de um servidor FTP pelo SQL Server

Visualizar mais detalhes, exemplos de uso e código-fonte
Stored Procedure que permite apagar um ou mais arquivos de um diretório FTP. Diferente das SP’s anteriores, não é possível utilizar um filtro para apagar vários arquivos. O parâmetro @arquivoRemoto deve receber o nome do arquivo que será apagado. Caso você queira apagar vários arquivos, utilize um WHILE para iterar entre os arquivos e chame a SP várias vezes.

Isso não ocorre por impossibilidade técnica, apenas achei mais “seguro” não permitir apagar vários arquivos utilizando um filtro, mas nada que o impeça de alterar essa Procedure para permitir isso ou utilizar a Stored Procedure stpFTP_Apaga_Diretorio, que está logo abaixo.

Exemplo de uso:
microsoft-sql-server-clr-integration-with-ftp-how-to-delete-files

Código-fonte:

Como apagar um diretório de um servidor FTP pelo SQL Server

Visualizar mais detalhes, exemplos de uso e código-fonte
Utilizando essa Stored Procedure, você pode apagar diretórios de seu servidor FTP. Um detalhe essa SP, é o parâmetro @apagaArquivos, que caso você informe o valor 1, irá apagar todos os arquivos desse diretório para então, tentar apagar o diretório.

Tenha em mente, que caso você informe o valor do parâmetro @apagarArquivos = 0 e houverem arquivos no diretório que você está tentando apagar, a SP irá retornar uma mensagem de erro informando que existem arquivos no diretório.

Exemplo de uso:
microsoft-sql-server-clr-integration-with-ftp-how-to-delete-files-and-directory

Código-fonte:

And that's it, folks!
Espero que tenham gostado desse post e até mais!

sql server clr c# csharp baixar download ler read enviar subir upload arquivos files listar list integrar integrate integração integration servidor ftp server

sql server clr c# csharp baixar download ler read enviar subir upload arquivos files listar list integrar integrate integração integration servidor ftp server