Usando Procedures CLR para acessar WebServices
Published: 2020-04-14 12:49:02

**Post publicado originalmente em 08/06/2011 em https://gardelsouza.wordpress.com/**

Diante das grandes necessidades que temos hoje de integração de dados e interatividade, muitas vezes se faz necessária uma consolidação de dados mais centralizada, e eliminar recursos intermediários como agentes de processamento é uma grande pedida para ganharmos em qualidade, desempenho e melhoria no tempo para implementação de soluções assim acessar serviços diretamente do banco de dados é um grande recurso que ajuda em integrações mais rápidas.

Para iniciarmos primeiro é necessário criar um projeto do tipo SQL Server Project para isso abra o Visual Studio File > New > Project.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/5lxy1fre92oui1idrsev.jpg)

Nomeie com o nome mais adequado a necessidade no nosso caso chamamos o projeto de GPPMiddleware, por se tratar de o início de uma camada de chamadas de webservices dentro do banco.

Depois de criado o projeto, clique com o botão direito do mouse sobre o projeto e selecione Add > New Item. Algumas opções são possíveis dentro no nosso caso iremos criar uma Stored Procedure, mais nada impede que se possa criar uma Trigger, UDF ou outro tipo de objeto do banco.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/z3ulv44rugjddr5e89sk.jpg)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bkeivqg4qqfw5hf52yyz.jpg)

Essa é a estrutura básica de uma procedure CLR, agora iremos codificar a lógica de negócio envolvida no processo.

O objetivo dessa procedure será consultar os dados de uma unidade de material no SAP utilizando um serviço, retornar esses dados para e exibi-los para o usuário.

Vamos agora adicionar a referencia ao serviço, clique com o botão direito do mouse sobre o projeto e selecione Add Web Reference, uma caixa será exibida para que seja informado o endereço do serviço.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/5oo4suyt1gz1qxdlskfo.jpg)

Informe o endereço do serviço no campo URL pressione o botão GO, nomeie a referencia com o nome adequado no campo Web reference name e clique em Add Reference.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/t4s2xa807z4fkbv90fu0.jpg)

Depois de adicionada a referência, precisamos codificar o acesso e o que deverá ser feito, no nosso caso o programa irá consultar os dados e retornar para o usuário os dados referentes a unidade de material do SAP.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jvnzxsjirm0f2k1aq62c.jpg)

Depois de codificada a procedure chegamos numa parte que precisa de muito cuidado para que a tudo possa ser corretamente executado e instalado, primeiro vamos às configurações do projeto, clique com o botão direito do mouse sobre o projeto e selecione Properties serão selecione a aba Build, na seção Output selecione a opção On no campo Generate serialization assembly. Essa configuração se faz necessária para permitir criar um outro assembly responsável pela serialização dos objetos de comunicação entre o banco e o serviço.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/pab7hakimz61jfip0kag.jpg)

Depois disso clique na aba Signing, na seção Sign the assembly selecione a opção <New…>, nomeie o arquivo que irá conter as definições de Strong Name do nosso projeto e caso queira coloque uma senha no arquivo.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/udbppeo00c53myhf1bxd.jpg)

Deixe desmarcada a opção Delay sign only. Depois disso selecione a aba Database, selecione a opção Unsafe no campo Permission Level, salve as opções de projeto.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fs86emkly3vo6le1g63o.jpg)

Depois desses passos de configuração precisamos configurar o banco de dados e o SQL Server para aceitar procedures CLR:

```SQL
sp_configure 'clr enabled', 1
GO
reconfigure
GO
```

Altere o banco de dados para trusthworthy

```SQL
alter database GPPMiddleware set trustworthy on
```

Depois disso é necessário criar dois scripts responsáveis por registrar o assembly de serialização no banco, para isso acesse a pasta onde se encontra os fontes do projeto, La crie dois arquivos chamados Predeployscript.sql e Postdeployscript.sql, dentro de Predeployscript.sql escreva a seguinte sentença:

```SQL
IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'GPPMiddleware.XmlSerializers')
DROP ASSEMBLY [GPPMiddleware.XmlSerializers]
```

No arquivo Postdeployscript.sql escreva a seguinte sentença:

```SQL
CREATE ASSEMBLY [GPPMiddleware.XmlSerializers] from
'<Pasta do Projeto>BinDebugGPPMiddleware.XmlSerializers.dll'
WITH permission_set = SAFE
```

Depois disso é só dar um build e um deploy no projeto, depois é só chamar a procedure dentro do banco como qualquer outra.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/2lw6k10jj840ejczlvi8.jpg)

Observe o resultado da chamada.