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

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:

É isso aí, pessoal!
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

SQL, sql server, sql server 2008, sql server 2008 R2, Oracle, Oracle Database, Oracle 11g, Oracle 10g, Oracle 12c, MySQL, Firebird, Consultoria, Consultor, Programador, Programação. Desenvolvedor, Analista de Sistemas, DBA, Criação de website, Criação de Sistema Web, Vitória, Vila Velha, Guarapari, Espírito Santo, ES, Consultoria SQL em VItória, Treinamento, Curso, Prestação de serviço, prestar serviço, freelancer, freela, banco de dados, consultoria em banco de dados, consultor de banco de dados

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

  1. Bom dia, conforme expliquei anteriormente sou iniciante no desenvolvimento com C#.
    Na classe stpFTP_Arquivo_Listar não conseguir compilar estou com erro no trecho:
    if (i < tentativas)
    Retorno.Mensagem($"Erro na tentativa {i}: {e.Message}");
    else
    Retorno.Erro($"Erro : {e.Message}\n\nInner Exception: {e.InnerException}");
    }
    else
    Retorno.Erro($"Erro : {e.Message}\n\nInner Exception: {e.InnerException}");

    Error CS0103 The name 'Retorno' does not exist in the current context Bibliotecas

    Vc pode me auxiliar a resolver isso? Grato.

Deixe uma resposta